Compare commits

..

4 Commits

6 changed files with 71 additions and 26 deletions

View File

@ -56,7 +56,7 @@ public:
static const ElementType type = typeFileSharing;
Boolean<unsigned short> fReadOnlyRec;
unsigned short wResPassNum;
unsigned short wResPassNum = 0;
std::wstring wResPass;
_UINT16 iNoResPass;
XLUnicodeString stUNUsername;

View File

@ -427,8 +427,18 @@ namespace OOX
workBookStream->m_FRTWORKBOOK = m_oExtLst->toBinWorkBook();
if (m_oFileSharing.IsInit())
workBookStream->m_BrtFileSharing = m_oFileSharing->toBin();
{
auto sharingVector = m_oFileSharing->toBin();
if(sharingVector.size() == 2)
{
workBookStream->m_BrtFileSharingIso = sharingVector.at(0);
workBookStream->m_BrtFileSharing = sharingVector.at(1);
}
else if(sharingVector.size() == 1)
{
workBookStream->m_BrtFileSharing = sharingVector.at(0);
}
}
return workBookStream;
}
void CWorkbook::read(const CPath& oPath)

View File

@ -1,4 +1,4 @@
/*
/*
* (c) Copyright Ascensio System SIA 2010-2023
*
* This program is a free software product. You can redistribute it and/or
@ -428,13 +428,13 @@ namespace OOX
if (!oReader.IsEmptyNode())
oReader.ReadTillEnd();
}
XLS::BaseObjectPtr CFileSharing::toBin()
std::vector<XLS::BaseObjectPtr> CFileSharing::toBin()
{
XLS::BaseObjectPtr objectPtr;
std::vector<XLS::BaseObjectPtr> objectVector;
if(m_oSpinCount.IsInit() || m_oAlgorithmName.IsInit() || m_oHashValue.IsInit())
{
auto ptr(new XLSB::FileSharingIso);
objectPtr = XLS::BaseObjectPtr{ptr};
XLS::BaseObjectPtr objectPtr = XLS::BaseObjectPtr{ptr};
if (m_oReadOnlyRecommended.IsInit())
ptr->fReadOnlyRec = m_oReadOnlyRecommended.get();
@ -472,12 +472,18 @@ namespace OOX
bytes1, len1);
}
ptr->ipdPasswordData.rgbSalt.cbLength = len1;
auto ptr1(new XLSB::FileSharing);
ptr1->wResPass = L"";
ptr1->fReadOnlyRec = ptr->fReadOnlyRec;
ptr1->stUserName = ptr->stUserName;
objectVector.push_back(objectPtr);
objectVector.push_back(XLS::BaseObjectPtr{ptr1});
}
else
{
auto ptr(new XLSB::FileSharing);
objectPtr = XLS::BaseObjectPtr{ptr};
XLS::BaseObjectPtr objectPtr = XLS::BaseObjectPtr{ptr};
if (m_oReadOnlyRecommended.IsInit())
ptr->fReadOnlyRec = m_oReadOnlyRecommended.get();
else
@ -490,8 +496,9 @@ namespace OOX
ptr->wResPass = m_oPassword.get();
else
ptr->wResPass = L"";
objectVector.push_back(objectPtr);
}
return objectPtr;
return objectVector;
}
void CFileSharing::fromBin(XLS::BaseObjectPtr& obj)
{

View File

@ -148,7 +148,7 @@ namespace OOX
virtual void fromXML(XmlUtils::CXmlLiteReader& oReader);
void fromBin(XLS::BaseObjectPtr& obj);
XLS::BaseObjectPtr toBin();
std::vector<XLS::BaseObjectPtr> toBin();
virtual EElementType getType() const;
void ReadAttributes(XmlUtils::CXmlLiteReader& oReader);

View File

@ -1130,7 +1130,7 @@ namespace OOX
}
namespace SharedFormulasRef
{
std::unique_ptr<std::vector<XLS::CellRef>> sharedRefsLocations;
std::unique_ptr<std::map<_UINT32,XLS::CellRef>> sharedRefsLocations;
std::unique_ptr<std::vector<std::pair<XLS::CellRangeRef, XLS::CellRef>>> ArrayRefsLocations;
}
void CFormula::fromBin(XLS::StreamCacheReaderPtr& reader, XLS::CFRecordPtr& record)
@ -1157,9 +1157,10 @@ namespace OOX
rowRef = static_cast<XLS::PtgExp*>(BinFmla.rgce.sequence.begin()->get())->rowXlsb;
ColumnRef = static_cast<XLS::PtgExtraCol*>(BinFmla.rgcb.getPtgs().back().get())->col;
if(!SharedFormulasRef::sharedRefsLocations)
SharedFormulasRef::sharedRefsLocations = std::unique_ptr<std::vector<XLS::CellRef>>(new std::vector<XLS::CellRef>);
SharedFormulasRef::sharedRefsLocations->push_back(XLS::CellRef(rowRef, ColumnRef, true, true));
SharedFormulasRef::sharedRefsLocations = std::unique_ptr<std::map<_UINT32, XLS::CellRef>>(new std::map<_UINT32, XLS::CellRef>);
m_oSi = (unsigned int)SharedFormulasRef::sharedRefsLocations->size() - 1;
SharedFormulasRef::sharedRefsLocations->emplace(m_oSi->GetValue(), XLS::CellRef(rowRef, ColumnRef, true, true));
}
}
auto fmlaRecord = reader->getNextRecord(XLSB::rt_ShrFmla);
@ -2912,6 +2913,8 @@ namespace OOX
XLSB::XLWideString str;
if(m_oValue.IsInit())
str = m_oValue->m_sText;
else
str = L"";
*CellRecord << str;
}
else
@ -2924,7 +2927,7 @@ namespace OOX
case SimpleTypes::Spreadsheet::celltypeInlineStr:
case SimpleTypes::Spreadsheet::celltypeStr:
{
if(m_oValue.IsInit() || m_oRichText.IsInit())
if(m_oValue.IsInit() || m_oRichText.IsInit() || m_oFormula.IsInit())
{
if(!m_oFormula.IsInit())
CellRecord = writer->getNextRecord(XLSB::rt_CellSt);
@ -2934,8 +2937,10 @@ namespace OOX
XLSB::XLWideString str;
if(m_oValue.IsInit())
str = m_oValue->m_sText;
else
else if(m_oRichText.IsInit())
str = m_oRichText->ToString();
else
str = L"";
*CellRecord << str;
}
else
@ -2956,15 +2961,19 @@ namespace OOX
else if(m_oFormula->m_oT.get() == SimpleTypes::Spreadsheet::ECellFormulaType::cellformulatypeShared)
{
if(!SharedFormulasRef::sharedRefsLocations)
SharedFormulasRef::sharedRefsLocations = std::unique_ptr<std::vector<XLS::CellRef>>(new std::vector<XLS::CellRef>);
SharedFormulasRef::sharedRefsLocations = std::unique_ptr<std::map<_UINT32, XLS::CellRef>>(new std::map<_UINT32, XLS::CellRef>);
if(!m_oFormula->m_sText.empty())
{
ExtraRecord = writer->getNextRecord(XLSB::rt_ShrFmla);
SharedFormulasRef::sharedRefsLocations->push_back(CellReference);
if(!m_oFormula->m_oSi.IsInit())
m_oFormula->m_oSi = (_UINT32)SharedFormulasRef::sharedRefsLocations->size();
SharedFormulasRef::sharedRefsLocations->emplace(m_oFormula->m_oSi->GetValue(), CellReference);
SharedFmlaRef = &CellReference;
}
if(m_oFormula->m_oSi.IsInit() && m_oFormula->m_oSi->GetValue() < SharedFormulasRef::sharedRefsLocations->size())
if(m_oFormula->m_oSi.IsInit() && SharedFormulasRef::sharedRefsLocations->find(m_oFormula->m_oSi->GetValue()) != SharedFormulasRef::sharedRefsLocations->end())
{
SharedFmlaRef = &SharedFormulasRef::sharedRefsLocations->at(m_oFormula->m_oSi->GetValue());
if(m_oFormula->m_sText.empty())
SharedFmlaRef = &SharedFormulasRef::sharedRefsLocations->at(m_oFormula->m_oSi->GetValue());
XLS::CellParsedFormula BinFmla(false);
//пишем флаги для формулы
@ -4725,6 +4734,8 @@ namespace OOX
}
if(SharedFormulasRef::sharedRefsLocations)
SharedFormulasRef::sharedRefsLocations.reset();
if(SharedFormulasRef::ArrayRefsLocations)
SharedFormulasRef::ArrayRefsLocations.reset();
}
XLS::BaseObjectPtr CSheetData::toBin()
{

View File

@ -2812,32 +2812,49 @@ namespace OOX
if(m_oOddHeader.IsInit())
dataString = m_oOddHeader->m_sText;
else
dataString = L"";
dataString.setSize(0xFFFFFFFF);
*begin << dataString;
}
{
XLSB::XLNullableWideString dataString;
if(m_oOddFooter.IsInit())
dataString = m_oOddFooter->m_sText;
else
dataString = L"";
dataString.setSize(0xFFFFFFFF);
*begin << dataString;
}
{
XLSB::XLNullableWideString dataString;
if(m_oEvenHeader.IsInit())
dataString = m_oEvenHeader->m_sText;
else
dataString = L"";
dataString.setSize(0xFFFFFFFF);
*begin << dataString;
}
{
XLSB::XLNullableWideString dataString;
if(m_oEvenFooter.IsInit())
dataString = m_oEvenFooter->m_sText;
else
dataString = L"";
*begin << dataString;
dataString.setSize(0xFFFFFFFF);
*begin << dataString;
}
{
XLSB::XLNullableWideString dataString;
if(m_oFirstHeader.IsInit())
dataString = m_oFirstHeader->m_sText;
else
dataString = L"";
dataString.setSize(0xFFFFFFFF);
*begin << dataString;
}
{
XLSB::XLNullableWideString dataString;
if(m_oFirstFooter.IsInit())
dataString = m_oFirstFooter->m_sText;
else
dataString = L"";
dataString.setSize(0xFFFFFFFF);
*begin << dataString;
}
writer->storeNextRecord(begin);