From 0e48e65ef1dde867f07b080a6fa147d141658ec6 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Wed, 28 Jan 2026 17:44:31 +0600 Subject: [PATCH] add radar chart conversion --- OOXML/XlsxFormat/Chart/ChartSerialize.cpp | 78 +++++++++++++++++++++++ OOXML/XlsxFormat/Chart/ChartSerialize.h | 2 + OOXML/XlsxFormat/Drawing/XlsxDrawing.cpp | 5 ++ 3 files changed, 85 insertions(+) diff --git a/OOXML/XlsxFormat/Chart/ChartSerialize.cpp b/OOXML/XlsxFormat/Chart/ChartSerialize.cpp index 83dca1d1a9..7cf72cb986 100644 --- a/OOXML/XlsxFormat/Chart/ChartSerialize.cpp +++ b/OOXML/XlsxFormat/Chart/ChartSerialize.cpp @@ -55,6 +55,7 @@ #include "../../../MsBinaryFile/XlsFile/Format/Logic/Biff_records/Area.h" #include "../../../MsBinaryFile/XlsFile/Format/Logic/Biff_records/Surf.h" #include "../../../MsBinaryFile/XlsFile/Format/Logic/Biff_records/Scatter.h" +#include "../../../MsBinaryFile/XlsFile/Format/Logic/Biff_records/Radar.h" namespace OOX { @@ -7627,6 +7628,64 @@ xmlns:c16r2=\"http://schemas.microsoft.com/office/drawing/2015/06/chart\""); writer.WriteString(sNodeName); writer.WriteString(L">"); } + XLS::BaseObjectPtr CT_RadarSer::GetXLSFormat(const _UINT32 chartIndex)const + { + auto seriesFormat = new XLS::SERIESFORMAT; + { + auto ai1 = new XLS::BRAI; + seriesFormat->m_arAI.push_back(XLS::BaseObjectPtr(ai1)); + } + auto series = new XLS::Series; + series->sdtX = 1; + if(m_val != nullptr && m_val->m_numRef != nullptr) + { + if(m_val->m_numRef->m_numCache != nullptr) + { + series->cValx = m_val->m_numRef->m_numCache->m_pt.size(); + series->cValy = m_val->m_numRef->m_numCache->m_pt.size(); + } + { + auto ai2 = new XLS::BRAI; + ai2->id = 1; + if(m_val->m_numRef->m_f.IsInit()) + { + ai2->rt = 2; + ai2->formula.parseStringFormula(m_val->m_numRef->m_f.get(), L""); + } + seriesFormat->m_arAI.push_back(XLS::BaseObjectPtr(ai2)); + auto ai3 = new XLS::BRAI; + ai3->id = 2; + auto ai4 = new XLS::BRAI; + ai4->id = 3; + seriesFormat->m_arAI.push_back(XLS::BaseObjectPtr(ai3)); + seriesFormat->m_arAI.push_back(XLS::BaseObjectPtr(ai4)); + } + } + auto SeriesStyle = new XLS::SS; + seriesFormat->m_arPtSS.push_back(XLS::BaseObjectPtr(SeriesStyle)); + { + auto dataFormat = new XLS::DataFormat; + SeriesStyle->m_DataFormat = XLS::BaseObjectPtr(dataFormat); + if(m_order.IsInit()) + dataFormat->iss = m_order.get(); + if(m_idx.IsInit()) + dataFormat->yi = m_idx.get(); + + } + if(m_spPr.IsInit()) + { + if(m_spPr->ln.IsInit()) + SeriesStyle->m_LineFormat = m_spPr->ln->toXLS(); + if(m_spPr->Fill.is_init()) + SeriesStyle->m_AreaFormat = m_spPr->Fill.toXLS(); + } + seriesFormat->m_Series = XLS::BaseObjectPtr(series); + auto ser2Crt = new XLS::SerToCrt; + ser2Crt->id = chartIndex; + seriesFormat->m_SerToCrt = XLS::BaseObjectPtr(ser2Crt); + + return XLS::BaseObjectPtr(seriesFormat); + } EElementType CT_RadarSer::getType() { return et_ct_radarser; } ST_RadarStyle CRadarStyle::FromString(const std::wstring &sValue) @@ -7726,6 +7785,25 @@ xmlns:c16r2=\"http://schemas.microsoft.com/office/drawing/2015/06/chart\""); writer.WriteString(sNodeName); writer.WriteString(L">"); } + XLS::BaseObjectPtr CT_RadarChart::toXLS(const unsigned short chartIndex, XLS::BaseObjectPtr ChartFormats) + { + auto ChartFormatsPtr = static_cast(ChartFormats.get()); + for(auto ser : m_ser) + { + if(ser != nullptr) + { + ChartFormatsPtr->m_arSERIESFORMAT.push_back(ser->GetXLSFormat(chartIndex)); + } + } + auto ptr = new XLS::CRT; + auto chartFormat = new XLS::ChartFormat; + chartFormat->icrt = chartIndex; + ptr->m_ChartFormat = XLS::BaseObjectPtr(chartFormat); + auto chartType = new XLS::Radar; + ptr->m_ChartType = XLS::BaseObjectPtr(chartType); + + return XLS::BaseObjectPtr(ptr); + } EElementType CT_RadarChart::getType() { return et_ct_radarchart; } CT_StockChart::CT_StockChart() { diff --git a/OOXML/XlsxFormat/Chart/ChartSerialize.h b/OOXML/XlsxFormat/Chart/ChartSerialize.h index d4bcf6a7d8..071a269046 100644 --- a/OOXML/XlsxFormat/Chart/ChartSerialize.h +++ b/OOXML/XlsxFormat/Chart/ChartSerialize.h @@ -1729,6 +1729,7 @@ namespace OOX {} void fromXML(XmlUtils::CXmlLiteReader& oReader); void toXML(const std::wstring& sNodeName, NSStringUtils::CStringBuilder& writer) const; + XLS::BaseObjectPtr GetXLSFormat(const _UINT32 chartIndex)const; EElementType getType(); }; class CT_RadarChart @@ -1746,6 +1747,7 @@ namespace OOX ~CT_RadarChart(); void fromXML(XmlUtils::CXmlLiteReader& oReader); void toXML(const std::wstring& sNodeName, NSStringUtils::CStringBuilder& writer) const; + XLS::BaseObjectPtr toXLS(const unsigned short chartIndex, XLS::BaseObjectPtr ChartFormatsPtr); EElementType getType(); }; class CT_UpDownBar diff --git a/OOXML/XlsxFormat/Drawing/XlsxDrawing.cpp b/OOXML/XlsxFormat/Drawing/XlsxDrawing.cpp index ae62f69993..b2afa27400 100644 --- a/OOXML/XlsxFormat/Drawing/XlsxDrawing.cpp +++ b/OOXML/XlsxFormat/Drawing/XlsxDrawing.cpp @@ -369,6 +369,11 @@ namespace OOX auto ScatterChart = static_cast(ChartFile->m_oChartSpace.m_chart->m_plotArea->m_Items.at(chartIndex)); AxisParentUnion->m_arCRT.push_back(ScatterChart->toXLS(chartIndex, ptr->m_CHARTFORMATS)); } + else if(*ChartFile->m_oChartSpace.m_chart->m_plotArea->m_ItemsElementName0.at(chartIndex) == OOX::Spreadsheet::itemschoicetype5RADARCHART) + { + auto ScatterChart = static_cast(ChartFile->m_oChartSpace.m_chart->m_plotArea->m_Items.at(chartIndex)); + AxisParentUnion->m_arCRT.push_back(ScatterChart->toXLS(chartIndex, ptr->m_CHARTFORMATS)); + } } } if(ChartFile->m_oChartSpace.m_chart->m_title != nullptr && ChartFile->m_oChartSpace.m_chart->m_title->m_tx != nullptr)