Commit 5bd3e07b authored by Sergey.Konovalov's avatar Sergey.Konovalov Committed by Alexander Trofimov

merge from branch TeamlabOffice_v3.7_ChartWriter

git-svn-id: svn://fileserver/activex/AVS/Sources/TeamlabOffice/trunk/ServerComponents@68995 954022d7-b5bf-4e40-9824-e11837661b57
parent 739c6b64
......@@ -6,7 +6,7 @@
namespace Writers
{
static CString g_string_ct_Start = _T("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\">");
static CString g_string_ct_Ext = _T("<Default Extension=\"bin\" ContentType=\"application/vnd.openxmlformats-officedocument.oleObject\"/><Default Extension=\"bmp\" ContentType=\"image/bmp\"/><Default Extension=\"jpg\" ContentType=\"image/jpeg\"/><Default Extension=\"jpeg\" ContentType=\"image/jpeg\"/><Default Extension=\"jpe\" ContentType=\"image/jpeg\"/><Default Extension=\"png\" ContentType=\"image/png\"/><Default Extension=\"gif\" ContentType=\"image/gif\"/><Default Extension=\"emf\" ContentType=\"image/x-emf\"/><Default Extension=\"wmf\" ContentType=\"image/x-wmf\"/><Default Extension=\"rels\" ContentType=\"application/vnd.openxmlformats-package.relationships+xml\"/><Default Extension=\"xml\" ContentType=\"application/xml\"/>");
static CString g_string_ct_Ext = _T("<Default Extension=\"bin\" ContentType=\"application/vnd.openxmlformats-officedocument.oleObject\"/><Default Extension=\"bmp\" ContentType=\"image/bmp\"/><Default Extension=\"jpg\" ContentType=\"image/jpeg\"/><Default Extension=\"jpeg\" ContentType=\"image/jpeg\"/><Default Extension=\"jpe\" ContentType=\"image/jpeg\"/><Default Extension=\"png\" ContentType=\"image/png\"/><Default Extension=\"gif\" ContentType=\"image/gif\"/><Default Extension=\"emf\" ContentType=\"image/x-emf\"/><Default Extension=\"wmf\" ContentType=\"image/x-wmf\"/><Default Extension=\"rels\" ContentType=\"application/vnd.openxmlformats-package.relationships+xml\"/><Default Extension=\"xml\" ContentType=\"application/xml\"/><Default Extension=\"xlsx\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\"/>");
static CString g_string_ct_Override = _T("<Override PartName=\"/word/document.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml\"/><Override PartName=\"/word/styles.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml\"/><Override PartName=\"/word/settings.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml\"/><Override PartName=\"/word/webSettings.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.webSettings+xml\"/><Override PartName=\"/word/fontTable.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.fontTable+xml\"/><Override PartName=\"/word/theme/theme1.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.theme+xml\"/><Override PartName=\"/docProps/core.xml\" ContentType=\"application/vnd.openxmlformats-package.core-properties+xml\"/><Override PartName=\"/docProps/app.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.extended-properties+xml\"/>");
static CString g_string_ct_End = _T("</Types>");
......
......@@ -7,6 +7,7 @@
#include "../../XlsxSerializerCom/Writer/BinaryReader.h"
#include "../../DesktopEditor/common/ASCVariant.h"
#include "../../Common/DocxFormat/Source/DocxFormat/Docx.h"
#include "../DocWrapper/XlsxSerializer.h"
namespace BinDocxRW {
......@@ -6102,12 +6103,15 @@ public:
{
if(false == m_oFileWriter.m_bSaveChartAsImg)
{
OOX::CPath pathChartsDir = m_oFileWriter.m_oChartWriter.m_sDir + FILE_SEPARATOR_STR + _T("word") + FILE_SEPARATOR_STR +_T("charts");
OOX::CPath pathChartsDir = m_oFileWriter.m_oChartWriter.m_sDir + FILE_SEPARATOR_STR + _T("word") + FILE_SEPARATOR_STR +_T("charts");
OOX::CSystemUtility::CreateDirectories(pathChartsDir.GetPath());
OOX::CPath pathChartsRelsDir = pathChartsDir.GetPath() + FILE_SEPARATOR_STR + _T("_rels");
OOX::CSystemUtility::CreateDirectories(pathChartsRelsDir.GetPath());
OOX::CPath pathChartsWorksheetDir = m_oFileWriter.m_oChartWriter.m_sDir + FILE_SEPARATOR_STR + _T("word") + FILE_SEPARATOR_STR +_T("embeddings");
OOX::CSystemUtility::CreateDirectories(pathChartsWorksheetDir.GetPath());
m_oFileWriter.m_pDrawingConverter->SetDstContentRels();
CString sThemeDir;
......@@ -6121,6 +6125,24 @@ public:
OOX::Spreadsheet::CChartSpace* pChartSpace = new OOX::Spreadsheet::CChartSpace();
oBinaryChartReader.ReadCT_ChartSpace(length, &pChartSpace->m_oChartSpace);
//save xlsx
std::wstring sXlsxFilename = L"Microsoft_Excel_Worksheet" + std::to_wstring(m_oFileWriter.m_oChartWriter.getChartCount() + 1) + L".xlsx";
std::wstring sXlsxPath = string2std_string(pathChartsWorksheetDir.GetPath() + FILE_SEPARATOR_STR) + sXlsxFilename;
BinXlsxRW::CXlsxSerializer oXlsxSerializer;
oXlsxSerializer.writeChartXlsx(sXlsxPath, *pChartSpace);
std::wstring sChartsWorksheetRelsName = L"../embeddings/" + sXlsxFilename;
long rIdXlsx;
CString bstrChartsWorksheetRelType = OOX::Spreadsheet::FileTypes::ChartsWorksheet.RelationType();
m_oFileWriter.m_pDrawingConverter->WriteRels(bstrChartsWorksheetRelType, std_string2string(sChartsWorksheetRelsName), CString(), &rIdXlsx);
pChartSpace->m_oChartSpace.m_externalData = new OOX::Spreadsheet::CT_ExternalData();
pChartSpace->m_oChartSpace.m_externalData->m_id = new CString();
pChartSpace->m_oChartSpace.m_externalData->m_id->AppendFormat(L"rId%d", rIdXlsx);
pChartSpace->m_oChartSpace.m_externalData->m_autoUpdate = new OOX::Spreadsheet::CT_Boolean();
pChartSpace->m_oChartSpace.m_externalData->m_autoUpdate->m_val = new bool(false);
//save chart.xml
XmlUtils::CStringWriter sw;
pChartSpace->toXML(sw);
......@@ -6135,11 +6157,11 @@ public:
OOX::CPath pathChartsRels = pathChartsRelsDir.GetPath() + FILE_SEPARATOR_STR + sFilename + _T(".rels");
m_oFileWriter.m_pDrawingConverter->SaveDstContentRels(pathChartsRels.GetPath());
long rId;
long rIdChart;
CString bstrChartRelType = OOX::Spreadsheet::FileTypes::Charts.RelationType();
m_oFileWriter.m_pDrawingConverter->WriteRels(bstrChartRelType, sRelsName, CString(), &rId);
m_oFileWriter.m_pDrawingConverter->WriteRels(bstrChartRelType, sRelsName, CString(), &rIdChart);
pDrawingProperty->sChartRels.Format(_T("rId%d"), rId);
pDrawingProperty->sChartRels.Format(_T("rId%d"), rIdChart);
}
else
res = c_oSerConstants::ReadUnknown;
......
#include "ChartWriter.h"
#include <algorithm>
#include "../../Common/DocxFormat/Source/XlsxFormat/Xlsx.h"
#define NUMID_START 160
const wchar_t* gc_Cat = L"cat";
const wchar_t* gc_Val = L"val";
const wchar_t* gc_XVal = L"xVal";
const wchar_t* gc_YVal = L"yVal";
const wchar_t* gc_BubbleSize = L"bubbleSize";
#define PARSE_CT_CHART(chart, type) \
{\
for(size_t i = 0; i < chart->m_ser.size();++i)\
{\
type* ser = chart->m_ser[i];\
PARSE_TITLE(ser, true, NULL);\
parseAxDataSource(ser->m_cat, true, gc_Cat);\
parseNumDataSource(ser->m_val, true, gc_Val);\
}\
}
#define PARSE_CT_CHART_SCATTER(chart, type) \
{\
for(size_t i = 0; i < chart->m_ser.size();++i)\
{\
type* ser = chart->m_ser[i];\
PARSE_TITLE(ser, true, NULL);\
parseAxDataSource(ser->m_xVal, true, gc_XVal);\
parseNumDataSource(ser->m_yVal, true, gc_YVal);\
}\
}
#define PARSE_TRENDLINE(chart, type) \
{\
for(size_t i = 0; i < chart->m_ser.size();++i)\
{\
type* ser = chart->m_ser[i];\
for(size_t j = 0; j < ser->m_trendline.size(); ++j)\
{\
OOX::Spreadsheet::CT_Trendline* pTrendline = ser->m_trendline[j];\
if(NULL != pTrendline->m_trendlineLbl)\
{\
PARSE_TITLE(pTrendline->m_trendlineLbl, false, NULL);\
}\
}\
}\
}
#define PARSE_ERRBARS(chart, type) \
{\
for(size_t i = 0; i < chart->m_ser.size();++i)\
{\
type* ser = chart->m_ser[i];\
for(size_t j = 0; j < ser->m_errBars.size(); ++j)\
{\
OOX::Spreadsheet::CT_ErrBars* pErrBars = ser->m_errBars[j];\
parseNumDataSource(pErrBars->m_minus, false, NULL);\
parseNumDataSource(pErrBars->m_plus, false, NULL);\
}\
}\
}
#define PARSE_BUBBLE_SIZE(chart, type) \
{\
for(size_t i = 0; i < chart->m_ser.size();++i)\
{\
type* ser = chart->m_ser[i];\
parseNumDataSource(ser->m_bubbleSize, true, gc_BubbleSize);\
}\
}
#define PARSE_TITLE(pTitle, bUpdateRange, cRangeName)\
{\
if(NULL != pTitle && NULL != pTitle->m_tx)\
{\
parseStrRef(pTitle->m_tx->m_strRef, bUpdateRange, cRangeName);\
}\
}
namespace BinXlsxRW{
ChartWriter::ChartWriter()
{
OOX::Spreadsheet::CXfs* pXfs = new OOX::Spreadsheet::CXfs();
pXfs->m_oBorderId.Init();
pXfs->m_oBorderId->SetValue(0);
pXfs->m_oFillId.Init();
pXfs->m_oFillId->SetValue(0);
pXfs->m_oFontId.Init();
pXfs->m_oFontId->SetValue(0);
pXfs->m_oNumFmtId.Init();
pXfs->m_oNumFmtId->SetValue(0);
m_aXfs.push_back(pXfs);
m_nRow1 = -1;
m_nCol1 = -1;
m_nRow2 = -1;
m_nCol2 = -1;
}
ChartWriter::~ChartWriter()
{
for(std::map<CString, std::map<int, std::map<int, OOX::Spreadsheet::CCell*>*>*>::iterator it = m_mapSheets.begin(); it != m_mapSheets.end(); it++)
{
std::map<int, std::map<int, OOX::Spreadsheet::CCell*>*>* rows = it->second;
for(std::map<int, std::map<int, OOX::Spreadsheet::CCell*>*>::iterator itRow = rows->begin(); itRow != rows->end(); itRow++)
{
delete itRow->second;
}
delete it->second;
}
}
void ChartWriter::toXlsx(OOX::Spreadsheet::CXlsx& oXlsx)
{
std::vector<CString> aSharedStrings;
//Sheet
OOX::Spreadsheet::CWorkbook* pWorkbook = oXlsx.CreateWorkbook();
pWorkbook->m_oSheets.Init();
std::map<CString, OOX::Spreadsheet::CWorksheet*>& mapWorksheets = oXlsx.GetWorksheets();
int nSheetId = 1;
OOX::Spreadsheet::CWorksheet* pFirstWorksheet = NULL;
for(std::map<CString, std::map<int, std::map<int, OOX::Spreadsheet::CCell*>*>*>::iterator it = m_mapSheets.begin(); it != m_mapSheets.end(); it++)
{
CString sSheetName = it->first;
OOX::Spreadsheet::CWorksheet* pWorksheet = toXlsxGetSheet(mapWorksheets, sSheetName);
toXlsxSheetdata(pWorksheet, *it->second, aSharedStrings);
OOX::Spreadsheet::CSheet* pSheet = new OOX::Spreadsheet::CSheet();
pSheet->m_oName.Init();
pSheet->m_oName->Append(sSheetName);
pSheet->m_oSheetId.Init();
pSheet->m_oSheetId->SetValue(nSheetId++);
smart_ptr<OOX::File> oWorksheetFile = smart_ptr<OOX::File>(pWorksheet);
const OOX::RId oRId = pWorkbook->Add(oWorksheetFile);
pSheet->m_oRid.Init();
pSheet->m_oRid->SetValue(oRId.get());
pWorkbook->m_oSheets->m_arrItems.push_back(pSheet);
mapWorksheets[pSheet->m_oName.get()] = pWorksheet;
if(NULL == pFirstWorksheet)
{
pFirstWorksheet = pWorksheet;
}
}
//SharedStrings
OOX::Spreadsheet::CSharedStrings* pSharedStrings = oXlsx.CreateSharedStrings();
for(size_t i = 0; i < aSharedStrings.size(); ++i)
{
OOX::Spreadsheet::CText* pText = new OOX::Spreadsheet::CText();
pText->m_sText = aSharedStrings[i];
if(-1 == pText->m_sText.Find(_T(" ")))
{
pText->m_oSpace.Init();
pText->m_oSpace->SetValue(SimpleTypes::xmlspacePreserve);
}
OOX::Spreadsheet::CSi* pSi = new OOX::Spreadsheet::CSi();
pSi->m_arrItems.push_back(pText);
pSharedStrings->m_arrItems.push_back(pSi);
}
pSharedStrings->m_oCount.Init();
pSharedStrings->m_oCount->SetValue(pSharedStrings->m_arrItems.size());
pSharedStrings->m_oUniqueCount.Init();
pSharedStrings->m_oUniqueCount->SetValue(pSharedStrings->m_arrItems.size());
//Styles
OOX::Spreadsheet::CStyles* pStyles = oXlsx.CreateStyles();
pStyles->m_oCellXfs.Init();
for(size_t i = 0; i < m_aXfs.size(); ++i)
{
pStyles->m_oCellXfs->m_arrItems.push_back(m_aXfs[i]);
}
pStyles->m_oNumFmts.Init();
for(std::map<CString, int>::iterator it = m_mapFormats.begin(); it != m_mapFormats.end(); it++)
{
OOX::Spreadsheet::CNumFmt* pNumFmt = new OOX::Spreadsheet::CNumFmt();
pNumFmt->m_oFormatCode.Init();
pNumFmt->m_oFormatCode->Append(it->first);
pNumFmt->m_oNumFmtId.Init();
pNumFmt->m_oNumFmtId->SetValue(NUMID_START + it->second);
pStyles->m_oNumFmts->m_arrItems.push_back(pNumFmt);
}
pStyles->m_oNumFmts->m_oCount.Init();
pStyles->m_oNumFmts->m_oCount->SetValue(pStyles->m_oNumFmts->m_arrItems.size());
pStyles->m_oCellXfs->m_oCount.Init();
pStyles->m_oCellXfs->m_oCount->SetValue(pStyles->m_oCellXfs->m_arrItems.size());
OOX::Spreadsheet::CDxf* pDxf = new OOX::Spreadsheet::CDxf();
pDxf->m_oBorder.Init();
pDxf->m_oBorder->m_oStart.Init();
pDxf->m_oBorder->m_oStart->m_oStyle.Init();
pDxf->m_oBorder->m_oStart->m_oStyle->SetValue(SimpleTypes::Spreadsheet::borderstyleThin);
pDxf->m_oBorder->m_oStart->m_oColor.Init();
pDxf->m_oBorder->m_oStart->m_oColor->m_oIndexed.Init();
pDxf->m_oBorder->m_oStart->m_oColor->m_oIndexed->SetValue(12);
pDxf->m_oBorder->m_oEnd.Init();
pDxf->m_oBorder->m_oEnd->m_oStyle.Init();
pDxf->m_oBorder->m_oEnd->m_oStyle->SetValue(SimpleTypes::Spreadsheet::borderstyleThin);
pDxf->m_oBorder->m_oEnd->m_oColor.Init();
pDxf->m_oBorder->m_oEnd->m_oColor->m_oIndexed.Init();
pDxf->m_oBorder->m_oEnd->m_oColor->m_oIndexed->SetValue(12);
pDxf->m_oBorder->m_oTop.Init();
pDxf->m_oBorder->m_oTop->m_oStyle.Init();
pDxf->m_oBorder->m_oTop->m_oStyle->SetValue(SimpleTypes::Spreadsheet::borderstyleThin);
pDxf->m_oBorder->m_oTop->m_oColor.Init();
pDxf->m_oBorder->m_oTop->m_oColor->m_oIndexed.Init();
pDxf->m_oBorder->m_oTop->m_oColor->m_oIndexed->SetValue(12);
pDxf->m_oBorder->m_oBottom.Init();
pDxf->m_oBorder->m_oBottom->m_oStyle.Init();
pDxf->m_oBorder->m_oBottom->m_oStyle->SetValue(SimpleTypes::Spreadsheet::borderstyleThin);
pDxf->m_oBorder->m_oBottom->m_oColor.Init();
pDxf->m_oBorder->m_oBottom->m_oColor->m_oIndexed.Init();
pDxf->m_oBorder->m_oBottom->m_oColor->m_oIndexed->SetValue(12);
pStyles->m_oDxfs.Init();
pStyles->m_oDxfs->m_arrItems.push_back(pDxf);
pStyles->m_oDxfs->m_oCount.Init();
pStyles->m_oDxfs->m_oCount->SetValue(pStyles->m_oDxfs->m_arrItems.size());
//Table
//todo table в случае нескольких sheet или если серии разнесены по sheet
if(m_aTableNames.size() > 0)
{
OOX::Spreadsheet::CTableFile* pTable = new OOX::Spreadsheet::CTableFile();
pTable->m_oTable.Init();
pTable->m_oTable->m_oDisplayName.Init();
pTable->m_oTable->m_oDisplayName->Append(L"Table1");
pTable->m_oTable->m_oRef.Init();
pTable->m_oTable->m_oRef->SetValue(OOX::Spreadsheet::CWorksheet::combineRef(m_nRow1 - 1, m_nCol1 - 1) + L":" + OOX::Spreadsheet::CWorksheet::combineRef(m_nRow2 - 1, m_nCol2 - 1));
pTable->m_oTable->m_oTotalsRowCount.Init();
pTable->m_oTable->m_oTotalsRowCount->SetValue(0);
pTable->m_oTable->m_oTableBorderDxfId.Init();
pTable->m_oTable->m_oTableBorderDxfId->SetValue(0);
pTable->m_oTable->m_oTableStyleInfo.Init();
pTable->m_oTable->m_oTableStyleInfo->m_oShowFirstColumn.Init();
pTable->m_oTable->m_oTableStyleInfo->m_oShowFirstColumn->FromBool(false);
pTable->m_oTable->m_oTableStyleInfo->m_oShowLastColumn.Init();
pTable->m_oTable->m_oTableStyleInfo->m_oShowLastColumn->FromBool(false);
pTable->m_oTable->m_oTableStyleInfo->m_oShowRowStripes.Init();
pTable->m_oTable->m_oTableStyleInfo->m_oShowRowStripes->FromBool(true);
pTable->m_oTable->m_oTableStyleInfo->m_oShowColumnStripes.Init();
pTable->m_oTable->m_oTableStyleInfo->m_oShowColumnStripes->FromBool(false);
pTable->m_oTable->m_oTableColumns.Init();
for(size_t i = 0; i < m_aTableNames.size(); ++i)
{
OOX::Spreadsheet::CTableColumn* pTableColumn = new OOX::Spreadsheet::CTableColumn();
pTableColumn->m_oId.Init();
pTableColumn->m_oId->SetValue(i + 1);
pTableColumn->m_oName.Init();
pTableColumn->m_oName->Append(m_aTableNames[i]);
pTable->m_oTable->m_oTableColumns->m_arrItems.push_back(pTableColumn);
}
pTable->m_oTable->m_oTableColumns->m_oCount.Init();
pTable->m_oTable->m_oTableColumns->m_oCount->SetValue(pTable->m_oTable->m_oTableColumns->m_arrItems.size());
//check unique names
size_t szTableNames = m_aTableNames.size();
std::sort( m_aTableNames.begin(), m_aTableNames.end() );
m_aTableNames.erase( std::unique( m_aTableNames.begin(), m_aTableNames.end() ), m_aTableNames.end() );
size_t szTableNamesUnique = m_aTableNames.size();
//add to sheet
if(szTableNames == szTableNamesUnique)
{
OOX::Spreadsheet::CTablePart* pTablePart = new OOX::Spreadsheet::CTablePart();
NSCommon::smart_ptr<OOX::File> pTableFile(pTable);
const OOX::RId oRId = pFirstWorksheet->Add(pTableFile);
pTablePart->m_oRId.Init();
pTablePart->m_oRId->SetValue(oRId.get());
pFirstWorksheet->m_oTableParts.Init();
pFirstWorksheet->m_oTableParts->m_arrItems.push_back(pTablePart);
pFirstWorksheet->m_oTableParts->m_oCount.Init();
pFirstWorksheet->m_oTableParts->m_oCount->SetValue(pFirstWorksheet->m_oTableParts->m_arrItems.size());
}
}
}
void ChartWriter::parseChart(const OOX::Spreadsheet::CT_Chart* pChart)
{
if(NULL != pChart)
{
PARSE_TITLE(pChart->m_title, false, NULL);
OOX::Spreadsheet::CT_PlotArea* pPlotArea = pChart->m_plotArea;
if(NULL != pPlotArea)
{
for(size_t i = 0; i < pPlotArea->m_ItemsElementName1.size(); ++i)
{
OOX::Spreadsheet::ItemsChoiceType6 eType = *pPlotArea->m_ItemsElementName1[i];
void* pItem = pPlotArea->m_Items1[i];
switch(eType)
{
case OOX::Spreadsheet::itemschoicetype6CATAX:
{
OOX::Spreadsheet::CT_CatAx* pCatax = static_cast<OOX::Spreadsheet::CT_CatAx*>(pItem);
PARSE_TITLE(pCatax->m_title, false, NULL);
break;
}
case OOX::Spreadsheet::itemschoicetype6DATEAX:
{
OOX::Spreadsheet::CT_DateAx* pDateax = static_cast<OOX::Spreadsheet::CT_DateAx*>(pItem);
PARSE_TITLE(pDateax->m_title, false, NULL);
break;
}
case OOX::Spreadsheet::itemschoicetype6SERAX:
{
OOX::Spreadsheet::CT_SerAx* pSerax = static_cast<OOX::Spreadsheet::CT_SerAx*>(pItem);
PARSE_TITLE(pSerax->m_title, false, NULL);
break;
}
case OOX::Spreadsheet::itemschoicetype6VALAX:
{
OOX::Spreadsheet::CT_ValAx* pValax = static_cast<OOX::Spreadsheet::CT_ValAx*>(pItem);
PARSE_TITLE(pValax->m_title, false, NULL);
if(NULL != pValax->m_dispUnits)
{
PARSE_TITLE(pValax->m_dispUnits->m_dispUnitsLbl, false, NULL);
}
break;
}
}
}
for(size_t i = 0; i < pPlotArea->m_ItemsElementName0.size(); ++i)
{
OOX::Spreadsheet::ItemsChoiceType5 eType = *pPlotArea->m_ItemsElementName0[i];
void* pItem = pPlotArea->m_Items[i];
switch(eType)
{
case OOX::Spreadsheet::itemschoicetype5AREA3DCHART:
{
OOX::Spreadsheet::CT_Area3DChart* pChart = static_cast<OOX::Spreadsheet::CT_Area3DChart*>(pItem);
PARSE_CT_CHART(pChart, OOX::Spreadsheet::CT_AreaSer);
break;
}
case OOX::Spreadsheet::itemschoicetype5AREACHART:
{
OOX::Spreadsheet::CT_AreaChart* pChart = static_cast<OOX::Spreadsheet::CT_AreaChart*>(pItem);
PARSE_CT_CHART(pChart, OOX::Spreadsheet::CT_AreaSer);
PARSE_TRENDLINE(pChart, OOX::Spreadsheet::CT_AreaSer);
PARSE_ERRBARS(pChart, OOX::Spreadsheet::CT_AreaSer);
break;
}
case OOX::Spreadsheet::itemschoicetype5BAR3DCHART:
{
OOX::Spreadsheet::CT_Bar3DChart* pChart = static_cast<OOX::Spreadsheet::CT_Bar3DChart*>(pItem);
PARSE_CT_CHART(pChart, OOX::Spreadsheet::CT_BarSer);
break;
}
case OOX::Spreadsheet::itemschoicetype5BARCHART:
{
OOX::Spreadsheet::CT_BarChart* pChart = static_cast<OOX::Spreadsheet::CT_BarChart*>(pItem);
PARSE_TRENDLINE(pChart, OOX::Spreadsheet::CT_BarSer);
PARSE_CT_CHART(pChart, OOX::Spreadsheet::CT_BarSer);
break;
}
case OOX::Spreadsheet::itemschoicetype5BUBBLECHART:
{
OOX::Spreadsheet::CT_BubbleChart* pChart = static_cast<OOX::Spreadsheet::CT_BubbleChart*>(pItem);
PARSE_CT_CHART_SCATTER(pChart, OOX::Spreadsheet::CT_BubbleSer);
PARSE_TRENDLINE(pChart, OOX::Spreadsheet::CT_BubbleSer);
PARSE_ERRBARS(pChart, OOX::Spreadsheet::CT_BubbleSer);
PARSE_BUBBLE_SIZE(pChart, OOX::Spreadsheet::CT_BubbleSer);
break;
}
case OOX::Spreadsheet::itemschoicetype5DOUGHNUTCHART:
{
OOX::Spreadsheet::CT_DoughnutChart* pChart = static_cast<OOX::Spreadsheet::CT_DoughnutChart*>(pItem);
PARSE_CT_CHART(pChart, OOX::Spreadsheet::CT_PieSer);
break;
}
case OOX::Spreadsheet::itemschoicetype5LINE3DCHART:
{
OOX::Spreadsheet::CT_Line3DChart* pChart = static_cast<OOX::Spreadsheet::CT_Line3DChart*>(pItem);
PARSE_CT_CHART(pChart, OOX::Spreadsheet::CT_LineSer);
break;
}
case OOX::Spreadsheet::itemschoicetype5LINECHART:
{
OOX::Spreadsheet::CT_LineChart* pChart = static_cast<OOX::Spreadsheet::CT_LineChart*>(pItem);
PARSE_CT_CHART(pChart, OOX::Spreadsheet::CT_LineSer);
PARSE_TRENDLINE(pChart, OOX::Spreadsheet::CT_LineSer);
break;
}
case OOX::Spreadsheet::itemschoicetype5OFPIECHART:
{
OOX::Spreadsheet::CT_OfPieChart* pChart = static_cast<OOX::Spreadsheet::CT_OfPieChart*>(pItem);
PARSE_CT_CHART(pChart, OOX::Spreadsheet::CT_PieSer);
break;
}
case OOX::Spreadsheet::itemschoicetype5PIE3DCHART:
{
OOX::Spreadsheet::CT_Pie3DChart* pChart = static_cast<OOX::Spreadsheet::CT_Pie3DChart*>(pItem);
PARSE_CT_CHART(pChart, OOX::Spreadsheet::CT_PieSer);
break;
}
case OOX::Spreadsheet::itemschoicetype5PIECHART:
{
OOX::Spreadsheet::CT_PieChart* pChart = static_cast<OOX::Spreadsheet::CT_PieChart*>(pItem);
PARSE_CT_CHART(pChart, OOX::Spreadsheet::CT_PieSer);
break;
}
case OOX::Spreadsheet::itemschoicetype5RADARCHART:
{
OOX::Spreadsheet::CT_RadarChart* pChart = static_cast<OOX::Spreadsheet::CT_RadarChart*>(pItem);
PARSE_CT_CHART(pChart, OOX::Spreadsheet::CT_RadarSer);
break;
}
case OOX::Spreadsheet::itemschoicetype5SCATTERCHART:
{
OOX::Spreadsheet::CT_ScatterChart* pChart = static_cast<OOX::Spreadsheet::CT_ScatterChart*>(pItem);
PARSE_CT_CHART_SCATTER(pChart, OOX::Spreadsheet::CT_ScatterSer);
PARSE_TRENDLINE(pChart, OOX::Spreadsheet::CT_ScatterSer);
PARSE_ERRBARS(pChart, OOX::Spreadsheet::CT_ScatterSer);
break;
}
case OOX::Spreadsheet::itemschoicetype5STOCKCHART:
{
OOX::Spreadsheet::CT_StockChart* pChart = static_cast<OOX::Spreadsheet::CT_StockChart*>(pItem);
PARSE_CT_CHART(pChart, OOX::Spreadsheet::CT_LineSer);
break;
}
case OOX::Spreadsheet::itemschoicetype5SURFACE3DCHART:
{
OOX::Spreadsheet::CT_Surface3DChart* pChart = static_cast<OOX::Spreadsheet::CT_Surface3DChart*>(pItem);
PARSE_CT_CHART(pChart, OOX::Spreadsheet::CT_SurfaceSer);
break;
}
case OOX::Spreadsheet::itemschoicetype5SURFACECHART:
{
OOX::Spreadsheet::CT_SurfaceChart* pChart = static_cast<OOX::Spreadsheet::CT_SurfaceChart*>(pItem);
PARSE_CT_CHART(pChart, OOX::Spreadsheet::CT_SurfaceSer);
break;
}
}
}
}
}
//проверяем можем ли создать таблицу
if(m_mapSheets.size() > 0 && m_nRow1 > 0 && m_nRow2 > 0 && m_nCol1 > 0 && m_nCol2 > 0 && m_nRow1 < m_nRow2)
{
std::map<int, std::map<int, OOX::Spreadsheet::CCell*>*>* rows = m_mapSheets.begin()->second;
std::map<int, std::map<int, OOX::Spreadsheet::CCell*>*>::iterator itRows = rows->find(m_nRow1);
if(itRows != rows->end())
{
std::map<int, OOX::Spreadsheet::CCell*>* cells = itRows->second;
std::vector<int> aIndexesCell;
for(std::map<int, OOX::Spreadsheet::CCell*>::const_iterator it = cells->begin(); it != cells->end(); it++)
{
aIndexesCell.push_back(it->first);
}
std::sort(aIndexesCell.begin(), aIndexesCell.end());
if(m_nCol2 - m_nCol1 + 1 == aIndexesCell.size() && m_nCol1 == aIndexesCell[0] && m_nCol2 == aIndexesCell[aIndexesCell.size() - 1])
{
for(size_t j = 0; j < aIndexesCell.size(); ++j)
{
int nIndexCell = aIndexesCell[j];
OOX::Spreadsheet::CCell* pCell = cells->at(nIndexCell);
//не должно быть ячеек без m_oValue
m_aTableNames.push_back(pCell->m_oValue->m_sText);
}
}
}
}
}
OOX::Spreadsheet::CWorksheet* ChartWriter::toXlsxGetSheet(std::map<CString, OOX::Spreadsheet::CWorksheet*>& mapWorksheets, const CString& sName)
{
OOX::Spreadsheet::CWorksheet* pWorksheet = NULL;
std::map<CString, OOX::Spreadsheet::CWorksheet*>::const_iterator it = mapWorksheets.find(sName);
if (it == mapWorksheets.end())
{
pWorksheet = new OOX::Spreadsheet::CWorksheet();
pWorksheet->m_oSheetFormatPr.Init();
pWorksheet->m_oSheetFormatPr->m_oDefaultRowHeight.Init();
pWorksheet->m_oSheetFormatPr->m_oDefaultRowHeight->SetValue(15);
pWorksheet->m_oPageMargins.Init();
pWorksheet->m_oPageMargins.Init();
pWorksheet->m_oPageMargins->m_oLeft.Init();
pWorksheet->m_oPageMargins->m_oLeft->FromInches(0.7);
pWorksheet->m_oPageMargins->m_oRight.Init();
pWorksheet->m_oPageMargins->m_oRight->FromInches(0.7);
pWorksheet->m_oPageMargins->m_oTop.Init();
pWorksheet->m_oPageMargins->m_oTop->FromInches(0.75);
pWorksheet->m_oPageMargins->m_oBottom.Init();
pWorksheet->m_oPageMargins->m_oBottom->FromInches(0.75);
pWorksheet->m_oPageMargins->m_oHeader.Init();
pWorksheet->m_oPageMargins->m_oHeader->FromInches(0.3);
pWorksheet->m_oPageMargins->m_oFooter.Init();
pWorksheet->m_oPageMargins->m_oFooter->FromInches(0.3);
mapWorksheets[sName] = pWorksheet;
}
else
{
pWorksheet = it->second;
}
return pWorksheet;
}
void ChartWriter::toXlsxSheetdata(OOX::Spreadsheet::CWorksheet* pWorksheet, const std::map<int, std::map<int, OOX::Spreadsheet::CCell*>*>& rows, std::vector<CString>& aSharedStrings)
{
pWorksheet->m_oSheetData.Init();
std::vector<int> aIndexesRow;
for(std::map<int, std::map<int, OOX::Spreadsheet::CCell*>*>::const_iterator it = rows.begin(); it != rows.end(); it++)
{
aIndexesRow.push_back(it->first);
}
std::sort(aIndexesRow.begin(), aIndexesRow.end());
for(size_t i = 0; i < aIndexesRow.size(); ++i)
{
int nIndexRow = aIndexesRow[i];
OOX::Spreadsheet::CRow* pRow = new OOX::Spreadsheet::CRow();
pRow->m_oR.Init();
pRow->m_oR->SetValue(nIndexRow);
const std::map<int, OOX::Spreadsheet::CCell*>& cells = *rows.at(nIndexRow);
std::vector<int> aIndexesCell;
for(std::map<int, OOX::Spreadsheet::CCell*>::const_iterator it = cells.begin(); it != cells.end(); it++)
{
aIndexesCell.push_back(it->first);
}
std::sort(aIndexesCell.begin(), aIndexesCell.end());
for(size_t j = 0; j < aIndexesCell.size(); ++j)
{
int nIndexCell = aIndexesCell[j];
OOX::Spreadsheet::CCell* pCell = cells.at(nIndexCell);
//SharedStrings
if(pCell->m_oValue.IsInit())
{
pCell->m_oType.Init();
const CString& val = pCell->m_oValue->m_sText;
if(L"TRUE" == val || L"FALSE" == val)
{
pCell->m_oType->SetValue(SimpleTypes::Spreadsheet::celltypeBool);
if(L"TRUE" == val)
{
pCell->m_oValue->m_sText = L"1";
}
else
{
pCell->m_oValue->m_sText = L"0";
}
}
else if(L"#NULL!" == val || L"#DIV/0!" == val || L"#VALUE!" == val || L"#REF!" == val || L"#NAME?" == val || L"#NUM!" == val || L"#N/A" == val)
{
pCell->m_oType->SetValue(SimpleTypes::Spreadsheet::celltypeError);
pCell->m_oValue->m_sText = val;
}
else
{
//как в CsvReader - подозрительный код
WCHAR *pEndPtr;
wcstod(val, &pEndPtr);
if (NULL != *pEndPtr)
{
// Не число
aSharedStrings.push_back(val);
pCell->m_oType->SetValue(SimpleTypes::Spreadsheet::celltypeSharedString);
pCell->m_oValue->m_sText = std::to_string(aSharedStrings.size() - 1).c_str();
}
else
{
pCell->m_oValue->m_sText = val;
}
}
}
pRow->m_arrItems.push_back(pCell);
}
pWorksheet->m_oSheetData->m_arrItems.push_back(pRow);
}
}
void ChartWriter::parseCell(const CString& sheet, const int& nRow, const int& nCol, const CString& val, CString* format = NULL)
{
std::map<CString, std::map<int, std::map<int, OOX::Spreadsheet::CCell*>*>*>::const_iterator itSheets = m_mapSheets.find(sheet);
std::map<int, std::map<int, OOX::Spreadsheet::CCell*>*>* rows = NULL;
if(itSheets == m_mapSheets.end())
{
rows = new std::map<int, std::map<int, OOX::Spreadsheet::CCell*>*>();
m_mapSheets.insert(std::make_pair(sheet, rows));
}
else
{
rows = itSheets->second;
}
std::map<int, std::map<int, OOX::Spreadsheet::CCell*>*>::const_iterator itRows = rows->find(nRow);
std::map<int, OOX::Spreadsheet::CCell*>* cells = NULL;
if(itRows == rows->end())
{
cells = new std::map<int, OOX::Spreadsheet::CCell*>();
rows->insert(std::make_pair(nRow, cells));
}
else
{
cells = itRows->second;
}
if(cells->find(nCol) == cells->end())
{
OOX::Spreadsheet::CCell* pNewCell = parseCreateCell(nRow, nCol, val, format);
cells->insert(std::make_pair(nCol, pNewCell));
}
}
OOX::Spreadsheet::CCell* ChartWriter::parseCreateCell(const int& nRow, const int& nCol, const CString& val, CString* format = NULL)
{
OOX::Spreadsheet::CCell* pNewCell = new OOX::Spreadsheet::CCell();
//пока добавляем как есть, shared string после записи таблицы
pNewCell->m_oValue.Init();
pNewCell->m_oValue->m_sText = val;
if(NULL != format)
{
int nXfsIndex = m_aXfs.size();
std::map<CString, int>::const_iterator itFormat = m_mapFormats.find(*format);
if(itFormat == m_mapFormats.end())
{
m_mapFormats[*format] = nXfsIndex;
}
else
{
nXfsIndex = itFormat->second;
}
OOX::Spreadsheet::CXfs* pXfs = new OOX::Spreadsheet::CXfs();
pXfs->m_oBorderId.Init();
pXfs->m_oBorderId->SetValue(0);
pXfs->m_oFillId.Init();
pXfs->m_oFillId->SetValue(0);
pXfs->m_oFontId.Init();
pXfs->m_oFontId->SetValue(0);
pXfs->m_oNumFmtId.Init();
pXfs->m_oNumFmtId->SetValue(NUMID_START + nXfsIndex);
m_aXfs.push_back(pXfs);
pNewCell->m_oStyle.Init();
pNewCell->m_oStyle->SetValue(nXfsIndex);
}
pNewCell->m_oRef.Init();
pNewCell->m_oRef->Append(OOX::Spreadsheet::CWorksheet::combineRef(nRow - 1, nCol - 1));
return pNewCell;
}
void ChartWriter::parseStrRef(const OOX::Spreadsheet::CT_StrRef* pStrRef, bool bUpdateRange, const wchar_t* cRangeName)
{
if(NULL != pStrRef && NULL != pStrRef->m_f)
{
CString wb, sheetFrom, sheetTo;
int nRow1, nCol1, nRow2, nCol2;
if(OOX::Spreadsheet::CWorksheet::parse3DRef(*pStrRef->m_f, wb, sheetFrom, sheetTo, nRow1, nCol1, nRow2, nCol2) &&
sheetFrom.GetLength() > 0 && 0 == wb.GetLength() && 0 == sheetTo.GetLength() &&
NULL != pStrRef->m_strCache)
{
bool bRow = nRow1 == nRow2;
if(bUpdateRange)
{
if(NULL != cRangeName)
{
if(bRow)
{
if(nCol1 > 1)
{
parseCell(sheetFrom, nRow1, nCol1 - 1, CString(cRangeName), NULL);
}
}
else
{
if(nRow1 > 1)
{
parseCell(sheetFrom, nRow1 - 1, nCol1, CString(cRangeName), NULL);
}
}
}
if(-1 == m_nRow1 || m_nRow1 > nRow1)
{
m_nRow1 = nRow1;
}
if(-1 == m_nCol1 || m_nCol1 > nCol1)
{
m_nCol1 = nCol1;
}
if(-1 == m_nRow2 || m_nRow2 < nRow2)
{
m_nRow2 = nRow2;
}
if(-1 == m_nCol2 || m_nCol2 < nCol2)
{
m_nCol2 = nCol2;
}
}
for(size_t i = 0; i < pStrRef->m_strCache->m_pt.size(); ++i)
{
OOX::Spreadsheet::CT_StrVal* val = pStrRef->m_strCache->m_pt[i];
if(NULL != val->m_idx && NULL != val->m_v)
{
int nRow, nCol;
if(bRow)
{
nRow = nRow1;
nCol = nCol1 + *val->m_idx;
}
else
{
nRow = nRow1 + *val->m_idx;
nCol = nCol1;
}
parseCell(sheetFrom, nRow, nCol, *val->m_v);
}
}
}
}
}
void ChartWriter::parseNumRef(const OOX::Spreadsheet::CT_NumRef* pNumRef, bool bUpdateRange, const wchar_t* cRangeName)
{
if(NULL != pNumRef && NULL != pNumRef->m_f)
{
CString wb, sheetFrom, sheetTo;
int nRow1, nCol1, nRow2, nCol2;
if(OOX::Spreadsheet::CWorksheet::parse3DRef(*pNumRef->m_f, wb, sheetFrom, sheetTo, nRow1, nCol1, nRow2, nCol2) &&
sheetFrom.GetLength() > 0 && 0 == wb.GetLength() && 0 == sheetTo.GetLength() && NULL != pNumRef->m_numCache)
{
bool bRow = nRow1 == nRow2;
if(bUpdateRange)
{
if(NULL != cRangeName)
{
if(bRow)
{
if(nCol1 > 1)
{
parseCell(sheetFrom, nRow1, nCol1 - 1, CString(cRangeName), NULL);
}
}
else
{
if(nRow1 > 1)
{
parseCell(sheetFrom, nRow1 - 1, nCol1, CString(cRangeName), NULL);
}
}
}
if(-1 == m_nRow1 || m_nRow1 > nRow1)
{
m_nRow1 = nRow1;
}
if(-1 == m_nCol1 || m_nCol1 > nCol1)
{
m_nCol1 = nCol1;
}
if(-1 == m_nRow2 || m_nRow2 < nRow2)
{
m_nRow2 = nRow2;
}
if(-1 == m_nCol2 || m_nCol2 < nCol2)
{
m_nCol2 = nCol2;
}
}
CString* formatCodeSer = pNumRef->m_numCache->m_formatCode;
for(size_t i = 0; i < pNumRef->m_numCache->m_pt.size(); ++i)
{
OOX::Spreadsheet::CT_NumVal* val = pNumRef->m_numCache->m_pt[i];
if(NULL != val->m_idx && NULL != val->m_v)
{
CString* formatCode = NULL != val->m_formatCode ? val->m_formatCode : formatCodeSer;
int nRow, nCol;
if(bRow)
{
nRow = nRow1;
nCol = nCol1 + *val->m_idx;
}
else
{
nRow = nRow1 + *val->m_idx;
nCol = nCol1;
}
parseCell(sheetFrom, nRow, nCol, *val->m_v, formatCode);
}
}
}
}
}
void ChartWriter::parseMultiLvlStrRef(const OOX::Spreadsheet::CT_MultiLvlStrRef* pMultiLvlStrRef, bool bUpdateRange, const wchar_t* cRangeName)
{
//todo нужен пример
}
void ChartWriter::parseAxDataSource(const OOX::Spreadsheet::CT_AxDataSource* pAxDataSource, bool bUpdateRange, const wchar_t* cRangeName)
{
if(NULL != pAxDataSource)
{
parseStrRef(pAxDataSource->m_strRef, bUpdateRange, cRangeName);
parseNumRef(pAxDataSource->m_numRef, bUpdateRange, cRangeName);
parseMultiLvlStrRef(pAxDataSource->m_multiLvlStrRef, bUpdateRange, cRangeName);
}
}
void ChartWriter::parseNumDataSource(const OOX::Spreadsheet::CT_NumDataSource* pNumDataSource, bool bUpdateRange, const wchar_t* cRangeName)
{
if(NULL != pNumDataSource)
{
parseNumRef(pNumDataSource->m_numRef, bUpdateRange, cRangeName);
}
}
};
#ifndef CHART_WRITER
#define CHART_WRITER
#if defined(_WIN32) || defined (_WIN64)
#include <atlbase.h>
#include <atlstr.h>
#else
#include "../../Common/DocxFormat/Source/Base/ASCString.h"
#endif
#include <string>
#include <map>
#include <vector>
namespace OOX
{
namespace Spreadsheet
{
class CXlsx;
class CT_Chart;
class CWorksheet;
class CCell;
class CXfs;
class CT_StrRef;
class CT_NumRef;
class CT_MultiLvlStrRef;
class CT_AxDataSource;
class CT_NumDataSource;
class CT_Title;
}
}
namespace BinXlsxRW {
class ChartWriter
{
public:
std::map<CString, std::map<int, std::map<int, OOX::Spreadsheet::CCell*>*>*> m_mapSheets;
std::map<CString, int> m_mapFormats;
std::vector<OOX::Spreadsheet::CXfs*> m_aXfs;
std::vector<CString> m_aTableNames;
int m_nRow1;
int m_nCol1;
int m_nRow2;
int m_nCol2;
public:
ChartWriter();
~ChartWriter();
void toXlsx(OOX::Spreadsheet::CXlsx& oXlsx);
void parseChart(const OOX::Spreadsheet::CT_Chart* pChart);
private:
OOX::Spreadsheet::CWorksheet* toXlsxGetSheet(std::map<CString, OOX::Spreadsheet::CWorksheet*>& mapWorksheets, const CString& sName);
void toXlsxSheetdata(OOX::Spreadsheet::CWorksheet* pWorksheet, const std::map<int, std::map<int, OOX::Spreadsheet::CCell*>*>& rows, std::vector<CString>& aSharedStrings);
void parseCell(const CString& sheet, const int& nRow, const int& nCol, const CString& val, CString* format);
OOX::Spreadsheet::CCell* parseCreateCell(const int& nRow, const int& nCol, const CString& val, CString* format);
void parseStrRef(const OOX::Spreadsheet::CT_StrRef* pStrRef, bool bUpdateRange, const wchar_t* cRangeName);
void parseNumRef(const OOX::Spreadsheet::CT_NumRef* pNumRef, bool bUpdateRange, const wchar_t* cRangeName);
void parseMultiLvlStrRef(const OOX::Spreadsheet::CT_MultiLvlStrRef* pMultiLvlStrRef, bool bUpdateRange, const wchar_t* cRangeName);
void parseAxDataSource(const OOX::Spreadsheet::CT_AxDataSource* pAxDataSource, bool bUpdateRange, const wchar_t* cRangeName);
void parseNumDataSource(const OOX::Spreadsheet::CT_NumDataSource* pNumDataSource, bool bUpdateRange, const wchar_t* cRangeName);
};
}
#endif // #ifndef CHART_WRITER
......@@ -7,6 +7,9 @@
#include "../../XlsxSerializerCom/Writer/BinaryReader.h"
#include "../../ASCOfficePPTXFile/Editor/FontPicker.h"
#include "../../OfficeUtils/src/OfficeUtils.h"
#include "ChartWriter.h"
#include "../BinReader/DefaultThemeWriter.h"
namespace BinXlsxRW{
......@@ -140,7 +143,7 @@ namespace BinXlsxRW{
}
return bRes;
}
bool CXlsxSerializer::saveChart(NSBinPptxRW::CBinaryFileReader& oBufferedStream, long lLength, CString& sFilepath, CString& sContentTypePath, CString** sContentTypeElement)
bool CXlsxSerializer::saveChart(NSBinPptxRW::CBinaryFileReader& oBufferedStream, long lLength, CString& sFilepath, CString& sContentTypePath, CString** sContentTypeElement, const LONG& lChartNumber)
{
bool bRes = false;
*sContentTypeElement = NULL;
......@@ -150,12 +153,17 @@ namespace BinXlsxRW{
//получаем sThemePath из bsFilename предполагая что папка theme находится на уровень выше bsFilename
CString sThemePath;
CString sEmbedingPath;
CString sFilenameReverse = sFilepath;sFilenameReverse.MakeReverse();
int nIndex = sFilenameReverse.Find(FILE_SEPARATOR_CHAR);
nIndex = sFilenameReverse.Find(FILE_SEPARATOR_CHAR, nIndex + 1);
if(-1 != nIndex)
sThemePath = sFilepath.Left(sFilepath.GetLength() - nIndex) + _T("theme");
{
CString sFilepathLeft = sFilepath.Left(sFilepath.GetLength() - nIndex);
sThemePath = sFilepathLeft + _T("theme");
sEmbedingPath = sFilepathLeft + _T("embeddings");
}
//todo theme path
BinXlsxRW::SaveParams oSaveParams(sThemePath);
......@@ -165,6 +173,25 @@ namespace BinXlsxRW{
if(oChartSpace.isValid())
{
//save xlsx
if(!sEmbedingPath.IsEmpty())
{
std::wstring sXlsxFilename = L"Microsoft_Excel_Worksheet" + std::to_wstring(lChartNumber) + L".xlsx";
std::wstring sXlsxPath = string2std_string(sEmbedingPath + FILE_SEPARATOR_STR) + sXlsxFilename;
writeChartXlsx(sXlsxPath, oChartSpace);
std::wstring sChartsWorksheetRelsName = L"../embeddings/" + sXlsxFilename;
long rId;
CString bstrChartsWorksheetRelType = OOX::Spreadsheet::FileTypes::ChartsWorksheet.RelationType();
m_pExternalDrawingConverter->WriteRels(bstrChartsWorksheetRelType, std_string2string(sChartsWorksheetRelsName), CString(), &rId);
oChartSpace.m_oChartSpace.m_externalData = new OOX::Spreadsheet::CT_ExternalData();
oChartSpace.m_oChartSpace.m_externalData->m_id = new CString();
oChartSpace.m_oChartSpace.m_externalData->m_id->AppendFormat(L"rId%d", rId);
oChartSpace.m_oChartSpace.m_externalData->m_autoUpdate = new OOX::Spreadsheet::CT_Boolean();
oChartSpace.m_oChartSpace.m_externalData->m_autoUpdate->m_val = new bool(false);
}
std::wstring strFilepath = string2std_string(sFilepath);
CString strDir = std_string2string(NSSystemPath::GetDirectoryName(strFilepath));
CString strFilename = std_string2string(NSSystemPath::GetFileName(strFilepath));
......@@ -202,4 +229,30 @@ namespace BinXlsxRW{
{
m_pExternalDrawingConverter = pDrawingConverter;
}
void CXlsxSerializer::writeChartXlsx(const std::wstring& sDstFile, const OOX::Spreadsheet::CChartSpace& oChart)
{
//анализируем chart
BinXlsxRW::ChartWriter helper;
helper.parseChart(oChart.m_oChartSpace.m_chart);
//создаем temp
std::wstring sTempDir = NSSystemPath::GetDirectoryName(sDstFile) + FILE_SEPARATOR_STR + NSSystemPath::GetFileName(sDstFile) + L"_TEMP";
NSDirectory::CreateDirectory(sTempDir);
OOX::CPath oPath(sTempDir.c_str());
//шиблонные папки
CString sXmlOptions = _T("");
CString sMediaPath;// will be filled by 'CreateXlsxFolders' method
CString sEmbedPath; // will be filled by 'CreateXlsxFolders' method
CreateXlsxFolders (sXmlOptions, std_string2string(sTempDir), sMediaPath, sEmbedPath);
//заполняем Xlsx
OOX::Spreadsheet::CXlsx oXlsx;
helper.toXlsx(oXlsx);
//write
CString sAdditionalContentTypes;
oXlsx.Write(oPath, sAdditionalContentTypes);
//zip
COfficeUtils oOfficeUtils(NULL);
oOfficeUtils.CompressFileOrDirectory(sTempDir, sDstFile, -1);
//clean
NSDirectory::DeleteDirectory(sTempDir);
}
};
......@@ -8,6 +8,15 @@
#include "../../Common/DocxFormat/Source/Base/ASCString.h"
#endif
#include <string>
namespace OOX
{
namespace Spreadsheet
{
class CChartSpace;
}
}
namespace NSBinPptxRW{
class CDrawingConverter;
}
......@@ -32,11 +41,13 @@ namespace BinXlsxRW {
bool saveToFile(const CString& sSrcFileName, const CString& sDstPath, const CString& sXMLOptions);
bool loadChart(CString& sChartPath, NSBinPptxRW::CBinaryFileWriter& oBufferedStream, long& lDataSize);
bool saveChart(NSBinPptxRW::CBinaryFileReader& oBufferedStream, long lLength, CString& sFilename, CString& sContentTypePath, CString** sContentTypeElement);
bool saveChart(NSBinPptxRW::CBinaryFileReader& oBufferedStream, long lLength, CString& sFilename, CString& sContentTypePath, CString** sContentTypeElement, const LONG& lChartNumber);
void setFontDir(CString& sFontDir);
void setEmbeddedFontsDir(CString& sEmbeddedFontsDir);
void setDrawingConverter(NSBinPptxRW::CDrawingConverter* pDrawingConverter);
void writeChartXlsx(const std::wstring& sDstFile ,const OOX::Spreadsheet::CChartSpace& oChart);
};
}
#endif // #ifndef XLSX_SERIALIZER
#-------------------------------------------------
#
# Project created by QtCreator 2014-10-10T14:24:04
#
#-------------------------------------------------
QT -= core gui
TARGET = ASCOfficeDocxFile2Lib
TEMPLATE = lib
CONFIG += staticlib
CONFIG += c++11
win32 {
QMAKE_CXXFLAGS_RELEASE -= -Zc:strictStrings
CONFIG(debug, debug|release) {
QMAKE_CXXFLAGS += /bigobj
}
} else {
QMAKE_CXXFLAGS += -std=c++11 -Wall -Wno-ignored-qualifiers
}
############### destination path ###############
DESTINATION_SDK_PATH = $$PWD/../../SDK/lib
# WINDOWS
win32:contains(QMAKE_TARGET.arch, x86_64):{
CONFIG(debug, debug|release) {
DESTDIR = $$DESTINATION_SDK_PATH/win_64/DEBUG
} else {
DESTDIR = $$DESTINATION_SDK_PATH/win_64
}
}
win32:!contains(QMAKE_TARGET.arch, x86_64):{
CONFIG(debug, debug|release) {
DESTDIR = $$DESTINATION_SDK_PATH/win_32/DEBUG
} else {
DESTDIR = $$DESTINATION_SDK_PATH/win_32
}
}
linux-g++ | linux-g++-64 | linux-g++-32:contains(QMAKE_HOST.arch, x86_64):{
DESTDIR = $$DESTINATION_SDK_PATH/linux_64
}
linux-g++ | linux-g++-64 | linux-g++-32:!contains(QMAKE_HOST.arch, x86_64):{
DESTDIR = $$DESTINATION_SDK_PATH/linux_32
}
mac {
DESTDIR = $$DESTINATION_SDK_PATH/mac_64
}
############### destination path ###############
DEFINES += UNICODE \
_UNICODE \
NODOCX \
_USE_XMLLITE_READER_ \
USE_LITE_READER \
USE_ATL_CSTRING \
USE_AVSOFFICESTUDIO_XMLUTILS \
SOLUTION_ASCOFFICEDOCXFILE2 \
#DISABLE_FILE_DOWNLOADER \
_USE_LIBXML2_READER_ \
LIBXML_READER_ENABLED
INCLUDEPATH += \
../../DesktopEditor/freetype-2.5.2/include
#################### WINDOWS #####################
win32 {
INCLUDEPATH += ../../Common/DocxFormat/Source/XML/libxml2/XML/include
}
#################### WINDOWS #####################
#################### LINUX ########################
linux-g++ | linux-g++-64 | linux-g++-32 {
DEFINES += \
LINUX \
_LINUX \
_LINUX_QT
INCLUDEPATH += /usr/include/libxml2
}
mac {
DEFINES += \
LINUX \
_LINUX \
_LINUX_QT \
_MAC \
MAC
INCLUDEPATH += ../../DesktopEditor/xml/libxml2/include
}
#################### LINUX ########################
SOURCES += ../DocWrapper/DocxSerializer.cpp \
../DocWrapper/FontProcessor.cpp \
../DocWrapper/XlsxSerializer.cpp \
../../XlsxSerializerCom/Common/Common.cpp \
../../XlsxSerializerCom/Reader/ChartFromToBinary.cpp \
../../XlsxSerializerCom/Reader/CommonWriter.cpp \
../../XlsxSerializerCom/Reader/CSVReader.cpp \
../../XlsxSerializerCom/Writer/CSVWriter.cpp
HEADERS += ../DocWrapper/DocxSerializer.h \
../DocWrapper/FontProcessor.h \
../DocWrapper/XlsxSerializer.h \
../BinReader/ChartWriter.h \
../BinReader/CommentsWriter.h \
../BinReader/ContentTypesWriter.h \
../BinReader/DocumentRelsWriter.h \
../BinReader/DocumentWriter.h \
../BinReader/FileWriter.h \
../BinReader/fontTableWriter.h \
../BinReader/HeaderFooterWriter.h \
../BinReader/MediaWriter.h \
../BinReader/NumberingWriter.h \
../BinReader/ReaderClasses.h \
../BinReader/Readers.h \
../BinReader/SettingWriter.h \
../BinReader/StylesWriter.h \
../BinWriter/BinEquationWriter.h \
../BinWriter/BinReaderWriterDefines.h \
../BinWriter/BinWriters.h \
../../XlsxSerializerCom/Common/BinReaderWriterDefines.h \
../../XlsxSerializerCom/Common/Common.h \
../../XlsxSerializerCom/Reader/BinaryWriter.h \
../../XlsxSerializerCom/Reader/ChartFromToBinary.h \
../../XlsxSerializerCom/Reader/CommonWriter.h \
../../XlsxSerializerCom/Reader/CSVReader.h \
../../XlsxSerializerCom/Writer/BinaryCommonReader.h \
../../XlsxSerializerCom/Writer/BinaryReader.h \
../../XlsxSerializerCom/Writer/CSVWriter.h \
../BinReader/webSettingsWriter.h \
../../Common/FileDownloader/FileDownloader.h \
../BinReader/DefaultThemeWriter.h
unix {
target.path = /usr/lib
INSTALLS += target
}
#-------------------------------------------------
#
# Project created by QtCreator 2014-10-10T14:24:04
#
#-------------------------------------------------
QT -= core gui
TARGET = ASCOfficeDocxFile2Lib
TEMPLATE = lib
CONFIG += staticlib
CONFIG += c++11
win32 {
QMAKE_CXXFLAGS_RELEASE -= -Zc:strictStrings
CONFIG(debug, debug|release) {
QMAKE_CXXFLAGS += /bigobj
}
} else {
QMAKE_CXXFLAGS += -std=c++11 -Wall -Wno-ignored-qualifiers
}
############### destination path ###############
DESTINATION_SDK_PATH = $$PWD/../../SDK/lib
# WINDOWS
win32:contains(QMAKE_TARGET.arch, x86_64):{
CONFIG(debug, debug|release) {
DESTDIR = $$DESTINATION_SDK_PATH/win_64/DEBUG
} else {
DESTDIR = $$DESTINATION_SDK_PATH/win_64
}
}
win32:!contains(QMAKE_TARGET.arch, x86_64):{
CONFIG(debug, debug|release) {
DESTDIR = $$DESTINATION_SDK_PATH/win_32/DEBUG
} else {
DESTDIR = $$DESTINATION_SDK_PATH/win_32
}
}
linux-g++ | linux-g++-64 | linux-g++-32:contains(QMAKE_HOST.arch, x86_64):{
DESTDIR = $$DESTINATION_SDK_PATH/linux_64
}
linux-g++ | linux-g++-64 | linux-g++-32:!contains(QMAKE_HOST.arch, x86_64):{
DESTDIR = $$DESTINATION_SDK_PATH/linux_32
}
mac {
DESTDIR = $$DESTINATION_SDK_PATH/mac_64
}
############### destination path ###############
DEFINES += UNICODE \
_UNICODE \
NODOCX \
_USE_XMLLITE_READER_ \
USE_LITE_READER \
USE_ATL_CSTRING \
USE_AVSOFFICESTUDIO_XMLUTILS \
SOLUTION_ASCOFFICEDOCXFILE2 \
#DISABLE_FILE_DOWNLOADER \
_USE_LIBXML2_READER_ \
LIBXML_READER_ENABLED
INCLUDEPATH += \
../../DesktopEditor/freetype-2.5.2/include
#################### WINDOWS #####################
win32 {
INCLUDEPATH += ../../Common/DocxFormat/Source/XML/libxml2/XML/include
}
#################### WINDOWS #####################
#################### LINUX ########################
linux-g++ | linux-g++-64 | linux-g++-32 {
DEFINES += \
LINUX \
_LINUX \
_LINUX_QT
INCLUDEPATH += /usr/include/libxml2
}
mac {
DEFINES += \
LINUX \
_LINUX \
_LINUX_QT \
_MAC \
MAC
INCLUDEPATH += ../../DesktopEditor/xml/libxml2/include
}
#################### LINUX ########################
SOURCES += ../DocWrapper/DocxSerializer.cpp \
../DocWrapper/FontProcessor.cpp \
../DocWrapper/XlsxSerializer.cpp \
../../XlsxSerializerCom/Common/Common.cpp \
../../XlsxSerializerCom/Reader/ChartFromToBinary.cpp \
../../XlsxSerializerCom/Reader/CommonWriter.cpp \
../../XlsxSerializerCom/Reader/CSVReader.cpp \
../../XlsxSerializerCom/Writer/CSVWriter.cpp \
../DocWrapper/ChartWriter.cpp
HEADERS += ../DocWrapper/DocxSerializer.h \
../DocWrapper/FontProcessor.h \
../DocWrapper/XlsxSerializer.h \
../BinReader/ChartWriter.h \
../BinReader/CommentsWriter.h \
../BinReader/ContentTypesWriter.h \
../BinReader/DocumentRelsWriter.h \
../BinReader/DocumentWriter.h \
../BinReader/FileWriter.h \
../BinReader/fontTableWriter.h \
../BinReader/HeaderFooterWriter.h \
../BinReader/MediaWriter.h \
../BinReader/NumberingWriter.h \
../BinReader/ReaderClasses.h \
../BinReader/Readers.h \
../BinReader/SettingWriter.h \
../BinReader/StylesWriter.h \
../BinWriter/BinEquationWriter.h \
../BinWriter/BinReaderWriterDefines.h \
../BinWriter/BinWriters.h \
../../XlsxSerializerCom/Common/BinReaderWriterDefines.h \
../../XlsxSerializerCom/Common/Common.h \
../../XlsxSerializerCom/Reader/BinaryWriter.h \
../../XlsxSerializerCom/Reader/ChartFromToBinary.h \
../../XlsxSerializerCom/Reader/CommonWriter.h \
../../XlsxSerializerCom/Reader/CSVReader.h \
../../XlsxSerializerCom/Writer/BinaryCommonReader.h \
../../XlsxSerializerCom/Writer/BinaryReader.h \
../../XlsxSerializerCom/Writer/CSVWriter.h \
../BinReader/webSettingsWriter.h \
../../Common/FileDownloader/FileDownloader.h \
../BinReader/DefaultThemeWriter.h \
../DocWrapper/ChartWriter.h
unix {
target.path = /usr/lib
INSTALLS += target
}
......@@ -735,6 +735,7 @@ namespace NSBinPptxRW
<Default Extension=\"gif\" ContentType=\"image/gif\"/>\
<Default Extension=\"emf\" ContentType=\"image/x-emf\"/>\
<Default Extension=\"jpg\" ContentType=\"image/jpeg\"/>\
<Default Extension=\"xlsx\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\"/>\
\
<Override PartName=\"/ppt/presentation.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml\" />\
<Override PartName=\"/ppt/presProps.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.presentationml.presProps+xml\" />\
......
......@@ -227,11 +227,11 @@ xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"
CString strPptChartFolder = _T("/ppt/charts/");
if (pReader->m_lDocumentType == XMLWRITER_DOC_TYPE_DOCX)
oXlsxSerializer.saveChart(*pReader, lLen, strChart, strWordChartFolder, &sContentTypes);
oXlsxSerializer.saveChart(*pReader, lLen, strChart, strWordChartFolder, &sContentTypes, m_lChartNumber);
else if (pReader->m_lDocumentType == XMLWRITER_DOC_TYPE_XLSX)
oXlsxSerializer.saveChart(*pReader, lLen, strChart, strXlChartFolder, &sContentTypes);
oXlsxSerializer.saveChart(*pReader, lLen, strChart, strXlChartFolder, &sContentTypes, m_lChartNumber);
else
oXlsxSerializer.saveChart(*pReader, lLen, strChart, strPptChartFolder, &sContentTypes);
oXlsxSerializer.saveChart(*pReader, lLen, strChart, strPptChartFolder, &sContentTypes, m_lChartNumber);
pReader->m_strContentTypes += (*sContentTypes);
RELEASEOBJECT(sContentTypes);
......
......@@ -51,6 +51,10 @@ namespace OOX
_T("application/vnd.openxmlformats-officedocument.drawingml.chart+xml"),
_T("http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart"), true, true);
const FileType ChartsWorksheet(L"../embeddings", L"Microsoft_Excel_Worksheet.xlsx",
_T(""),
_T("http://schemas.openxmlformats.org/officeDocument/2006/relationships/package"), true, true);
const FileType Table(L"../tables", L"table.xml",
_T("application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml"),
_T("http://schemas.openxmlformats.org/officeDocument/2006/relationships/table"), true, true);
......@@ -66,4 +70,4 @@ namespace OOX
}
} // namespace OOX
#endif // OOX_XSLXFILE_TYPES_SPREADSHEET_INCLUDE_H_
\ No newline at end of file
#endif // OOX_XSLXFILE_TYPES_SPREADSHEET_INCLUDE_H_
......@@ -18,7 +18,7 @@ namespace OOX
{
namespace Spreadsheet
{
// child:
//необработанные child:
//<extLst>
class CStyles : public OOX::File, public OOX::Spreadsheet::IFileContainer
{
......@@ -123,9 +123,70 @@ namespace OOX
}
void PrepareToWrite()
{
//fonts
if(false == m_oFonts.IsInit())
{
m_oFonts.Init();
OOX::Spreadsheet::CFont* pFont = new OOX::Spreadsheet::CFont();
pFont->m_oSz.Init();
pFont->m_oSz->m_oVal.Init();
pFont->m_oSz->m_oVal->SetValue(11);
pFont->m_oColor.Init();
pFont->m_oColor->m_oThemeColor.Init();
pFont->m_oColor->m_oThemeColor->SetValue(SimpleTypes::Spreadsheet::themecolorDark1);
pFont->m_oRFont.Init();
pFont->m_oRFont->m_sVal.Init();
pFont->m_oRFont->m_sVal->Append(L"Calibri");
pFont->m_oFamily.Init();
pFont->m_oFamily->m_oFontFamily.Init();
pFont->m_oFamily->m_oFontFamily->SetValue(SimpleTypes::Spreadsheet::fontfamilySwiss);
pFont->m_oScheme.Init();
pFont->m_oScheme->m_oFontScheme.Init();
pFont->m_oScheme->m_oFontScheme->SetValue(SimpleTypes::Spreadsheet::fontschemeMinor);
m_oFonts->m_arrItems.push_back(pFont);
}
if(false == m_oFonts->m_oCount.IsInit())
{
m_oFonts->m_oCount.Init();
m_oFonts->m_oCount->SetValue(m_oFonts->m_arrItems.size());
}
//fills
if(false == m_oFills.IsInit())
{
m_oFills.Init();
OOX::Spreadsheet::CFill* pFill1 = new OOX::Spreadsheet::CFill();
pFill1->m_oPatternFill.Init();
pFill1->m_oPatternFill->m_oPatternType.Init();
pFill1->m_oPatternFill->m_oPatternType->SetValue(SimpleTypes::Spreadsheet::patterntypeNone);
OOX::Spreadsheet::CFill* pFill2 = new OOX::Spreadsheet::CFill();
pFill2->m_oPatternFill.Init();
pFill2->m_oPatternFill->m_oPatternType.Init();
pFill2->m_oPatternFill->m_oPatternType->SetValue(SimpleTypes::Spreadsheet::patterntypeGray125);
m_oFills->m_arrItems.push_back(pFill1);
m_oFills->m_arrItems.push_back(pFill2);
}
if(false == m_oFills->m_oCount.IsInit())
{
m_oFills->m_oCount.Init();
m_oFills->m_oCount->SetValue(m_oFills->m_arrItems.size());
}
//borders
if(false == m_oBorders.IsInit())
{
m_oBorders.Init();
OOX::Spreadsheet::CBorder* pBorder = new OOX::Spreadsheet::CBorder();
pBorder->m_oStart.Init();
pBorder->m_oEnd.Init();
pBorder->m_oTop.Init();
pBorder->m_oBottom.Init();
pBorder->m_oDiagonal.Init();
m_oBorders->m_arrItems.push_back(pBorder);
}
if(false == m_oBorders->m_oCount.IsInit())
{
m_oBorders->m_oCount.Init();
m_oBorders->m_oCount->SetValue(m_oBorders->m_arrItems.size());
}
//cellXfs
if(m_oCellXfs.IsInit())
{
......@@ -142,11 +203,7 @@ namespace OOX
//cellStyles
if(false == m_oCellStyles.IsInit())
m_oCellStyles.Init();
if(false == m_oCellStyles->m_oCount.IsInit())
{
m_oCellStyles->m_oCount.Init();
m_oCellStyles->m_oCount->SetValue(1);
}
if(0 == m_oCellStyles->m_arrItems.size())
{
CCellStyle* pCellStyle = new CCellStyle();
......@@ -157,14 +214,15 @@ namespace OOX
pCellStyle->m_oBuiltinId->SetValue(0);
m_oCellStyles->m_arrItems.push_back(pCellStyle);
}
if(false == m_oCellStyles->m_oCount.IsInit())
{
m_oCellStyles->m_oCount.Init();
m_oCellStyles->m_oCount->SetValue(m_oCellStyles->m_arrItems.size());
}
//cellStyleXfs
if(false == m_oCellStyleXfs.IsInit())
m_oCellStyleXfs.Init();
if(false == m_oCellStyleXfs->m_oCount.IsInit())
{
m_oCellStyleXfs->m_oCount.Init();
m_oCellStyleXfs->m_oCount->SetValue(1);
}
if(0 == m_oCellStyleXfs->m_arrItems.size())
{
CXfs* pXfs = new CXfs();
......@@ -178,6 +236,11 @@ namespace OOX
pXfs->m_oBorderId->SetValue(0);
m_oCellStyleXfs->m_arrItems.push_back(pXfs);
}
if(false == m_oCellStyleXfs->m_oCount.IsInit())
{
m_oCellStyleXfs->m_oCount.Init();
m_oCellStyleXfs->m_oCount->SetValue(m_oCellStyleXfs->m_arrItems.size());
}
//dxfs
if(false == m_oDxfs.IsInit())
m_oDxfs.Init();
......
......@@ -318,6 +318,12 @@ namespace OOX
writer.WriteString(CString(_T(" totalsRowCount=\"1\"")));
else
writer.WriteString(CString(_T(" totalsRowShown=\"0\"")));
if(m_oTableBorderDxfId.IsInit())
{
writer.WriteString(CString(_T(" tableBorderDxfId=\"")));
writer.WriteString(m_oTableBorderDxfId->ToString());
writer.WriteString(CString(_T("\"")));
}
writer.WriteString(CString(_T(">")));
if(m_oAutoFilter.IsInit())
......@@ -370,6 +376,7 @@ namespace OOX
WritingElement_ReadAttributes_Read_if ( oReader, _T("headerRowCount"), m_oHeaderRowCount )
WritingElement_ReadAttributes_Read_if ( oReader, _T("totalsRowCount"), m_oTotalsRowCount )
WritingElement_ReadAttributes_Read_if ( oReader, _T("displayName"), m_oDisplayName )
WritingElement_ReadAttributes_Read_if ( oReader, _T("tableBorderDxfId"), m_oTableBorderDxfId )
WritingElement_ReadAttributes_End( oReader )
}
......@@ -378,6 +385,7 @@ namespace OOX
nullable<SimpleTypes::CUnsignedDecimalNumber<> > m_oHeaderRowCount;
nullable<SimpleTypes::CUnsignedDecimalNumber<> > m_oTotalsRowCount;
nullable<CString > m_oDisplayName;
nullable<SimpleTypes::CUnsignedDecimalNumber<> > m_oTableBorderDxfId;
nullable<CAutofilter > m_oAutoFilter;
nullable<CSortState > m_oSortState;
......
......@@ -24,7 +24,7 @@ namespace OOX
{
namespace Spreadsheet
{
// child:
//необработанные child:
//<cellWatches>
//<colBreaks>
//<controls>
......@@ -374,6 +374,56 @@ namespace OOX
return rId;
}
}
static bool parse3DRef(const CString& sRef, CString& workbook, CString& sheetFrom, CString& sheetTo, int& nRow1, int& nCol1, int& nRow2, int& nCol2)
{
bool bRes = false;
int nIndex = sRef.Find('!');
CString sCellRef;
if(-1 != nIndex)
{
CString sSheetPrefix = sRef.Left(nIndex);
if(sSheetPrefix.GetLength() > 0 && '\'' == sSheetPrefix[0] && '\'' == sSheetPrefix[sSheetPrefix.GetLength() - 1])
{
sSheetPrefix = sSheetPrefix.Mid(1, sSheetPrefix.GetLength() - 2);
}
sSheetPrefix.Replace(L"''", L"'");
int nIndexWbStart = sSheetPrefix.Find('[');
int nIndexWbEnd = sSheetPrefix.Find(']');
if(-1 != nIndexWbStart && -1 != nIndexWbEnd)
{
workbook = sSheetPrefix.Mid(nIndexWbStart + 1, nIndexWbEnd - nIndexWbStart - 1);
sSheetPrefix = sSheetPrefix.Right(sSheetPrefix.GetLength() - nIndexWbEnd - 1);
}
int nIndexColon = sSheetPrefix.Find(':');
if(-1 != nIndexColon)
{
sheetFrom = sSheetPrefix.Left(nIndexColon);
sheetTo = sSheetPrefix.Right(sSheetPrefix.GetLength() - nIndexColon - 1);
}
else
{
sheetFrom = sSheetPrefix;
}
sCellRef = sRef.Right(sRef.GetLength() - nIndex - 1);
}
else
{
sCellRef = sRef;
}
sCellRef.Replace(L"$", L"");
int nIndexColon = sCellRef.Find(':');
if(-1 != nIndexColon)
{
bRes = parseRef(sCellRef.Left(nIndexColon), nRow1, nCol1) && parseRef(sCellRef.Right(sCellRef.GetLength() - nIndexColon - 1), nRow2, nCol2);
}
else
{
bRes = parseRef(sCellRef, nRow1, nCol1);
nRow2 = nRow1;
nCol2 = nCol1;
}
return bRes;
}
static bool parseRef(CString sRef, int& nRow, int& nCol)
{
bool bRes = false;
......@@ -457,4 +507,4 @@ namespace OOX
} //Spreadsheet
} // namespace OOX
#endif // OOX_WORKSHEET_FILE_INCLUDE_H_
\ No newline at end of file
#endif // OOX_WORKSHEET_FILE_INCLUDE_H_
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment