Fix richStr conversion

This commit is contained in:
Viktor Andreev
2024-09-13 21:01:42 +06:00
parent 592fbfccbb
commit c068fd2ee0
6 changed files with 60 additions and 2 deletions

View File

@ -194,6 +194,41 @@ void OOX::Spreadsheet::CXlsb::PrepareSi()
}*/
}
}
//подготовка шрифтов в richString для конвертации в xlsb
void OOX::Spreadsheet::CXlsb::PrepareRichStr()
{
if(m_pStyles && m_pStyles->m_oFonts.IsInit())
{
auto lambdaSi = [&](OOX::Spreadsheet::CSi* si)
{
for(size_t i = 0, length = si->m_arrItems.size(); i < length; ++i)
{
OOX::Spreadsheet::WritingElement* we = si->m_arrItems[i];
if(OOX::et_x_r == we->getType())
{
OOX::Spreadsheet::CRun* pRun = static_cast<OOX::Spreadsheet::CRun*>(we);
if(pRun->m_oRPr.IsInit() && !pRun->m_oRPr->m_nFontIndex.IsInit())
{
auto font = pRun->m_oRPr->toFont();
m_pStyles->m_oFonts->AddFont(font);
pRun->m_oRPr->m_nFontIndex.Init();
pRun->m_oRPr->m_nFontIndex = m_pStyles->m_oFonts->m_arrItems.size() - 1;
}
}
}
};
if(m_pSharedStrings)
{
for(auto &si : m_pSharedStrings->m_arrItems)
{
lambdaSi(si);
}
}
}
}
//отложенный парсинг SheetData
void OOX::Spreadsheet::CXlsb::ReadSheetData()
{

View File

@ -72,6 +72,7 @@ namespace OOX
void LinkTables();
void ReadSheetData();
void WriteSheetData();
void PrepareRichStr();
void SetPropForWriteSheet(const std::wstring &sPath, OOX::CContentTypes& oContentTypes);
void WriteSheet(CWorksheet* worksheet);

View File

@ -153,10 +153,10 @@ namespace OOX
auto crunPtr = static_cast<CRun*>(m_arrItems[i]);
ptr->fRichStr = true;
USHORT ind = 0;
XLSB::StrRun run;
run.ich = ptr->str.value().size();
ptr->str = ptr->str.value() + crunPtr->toBin(ind);
XLSB::StrRun run;
run.ifnt = ind;
run.ich = ptr->str.value().size();
ptr->rgsStrRun.push_back(run);
continue;
}

View File

@ -1488,6 +1488,26 @@ namespace OOX
m_oVertAlign = font->m_oVertAlign;
}
CFont* CRPr::toFont()
{
auto font(new CFont);
font->m_oBold = m_oBold;
font->m_oCharset = m_oCharset;
font->m_oColor = m_oColor;
font->m_oCondense = m_oCondense;
font->m_oExtend = m_oExtend;
font->m_oFamily = m_oFamily;
font->m_oItalic = m_oItalic;
font->m_oOutline = m_oOutline;
font->m_oRFont = m_oRFont;
font->m_oScheme = m_oScheme;
font->m_oShadow = m_oShadow;
font->m_oStrike = m_oStrike;
font->m_oSz = m_oSz;
font->m_oUnderline = m_oUnderline;
font->m_oVertAlign = m_oVertAlign;
return font;
}
} //Spreadsheet
} // OOX

View File

@ -304,6 +304,7 @@ namespace OOX
virtual void fromXML(XmlUtils::CXmlLiteReader& oReader);
void fromFont(CFont* font);
CFont* CRPr::toFont();
void fromXLSB (NSBinPptxRW::CBinaryFileReader& oStream, _UINT16 nType);
void toXLSB (NSBinPptxRW::CXlsbBinaryWriter& oStream) const;
_UINT32 getXLSBSize() const;

View File

@ -165,6 +165,7 @@ namespace NExtractTools
oXlsb.m_bWriteToXlsb = true;
oXlsb.Read(oox_path);
oXlsb.LinkTables();
oXlsb.PrepareRichStr();
OOX::CContentTypes oContentTypes;
oXlsb.SetPropForWriteSheet(sTo, oContentTypes);