Commit cf5458c7 authored by ElenaSubbotina's avatar ElenaSubbotina

XlsFormat - pivot tables

parent 9115edbd
......@@ -51,12 +51,12 @@
#pragma comment(lib, "../../build/bin/icu/win_32/icuuc.lib")
#endif
int _tmain(int argc, _TCHAR* argv[])
HRESULT convert_single(std::wstring fileName)
{
HRESULT hr = S_OK;
//////////////////////////////////////////////////////////////////////////
std::wstring srcFileName = argv[1];
std::wstring dstPath = argc > 2 ? argv[2] : srcFileName + L"-my.xlsx";
std::wstring srcFileName = fileName;
std::wstring dstPath = srcFileName + L"-my.xlsx";
std::wstring outputDir = NSDirectory::GetFolderPath(dstPath);
std::wstring dstTempPath = NSDirectory::CreateDirectoryWithUniqueName(outputDir);
......@@ -73,3 +73,26 @@ int _tmain(int argc, _TCHAR* argv[])
return hr;
}
HRESULT convert_directory(std::wstring pathName)
{
HRESULT hr = S_OK;
std::vector<std::wstring> arFiles = NSDirectory::GetFiles(pathName, false);
for (size_t i = 0; i < arFiles.size(); i++)
{
convert_single(arFiles[i]);
}
return S_OK;
}
int _tmain(int argc, _TCHAR* argv[])
{
if (argc < 2) return 1;
HRESULT hr = convert_single(argv[1]);
//HRESULT hr = convert_directory(argv[1]);
return hr;
}
\ No newline at end of file
......@@ -66,6 +66,7 @@ static inline void/*std::wstring &*/trim(std::wstring &s)
AutoFilter::AutoFilter()
{
wTopN = wJoin = 0;
}
......@@ -86,7 +87,7 @@ void AutoFilter::readFields(CFRecord& record)
unsigned short flags;
record >> iEntry >> flags;
wJoin = static_cast<unsigned char>(GETBITS(flags, 0, 1));
wJoin = GETBITS(flags, 0, 1);
fSimple1 = GETBIT(flags, 2);
fSimple2 = GETBIT(flags, 3);
......@@ -94,7 +95,7 @@ void AutoFilter::readFields(CFRecord& record)
fTop = GETBIT(flags, 5); //top(1) or bottom(0)
fPercent = GETBIT(flags, 6);
wTopN = static_cast<unsigned short>(GETBITS(flags, 7, 15));
wTopN = GETBITS(flags, 7, 15);
unsigned short _iEntry = iEntry;
unsigned char _wJoin = wJoin;
......
......@@ -87,7 +87,7 @@ void BOF::readFields(CFRecord& record)
fGlJmp = GETBIT(flags, 10);
fFontLimit = GETBIT(flags, 13);
verXLHigh = static_cast<unsigned char>(GETBITS(flags, 14, 17));
verXLHigh = GETBITS(flags, 14, 17);
record >> verLowestBiff;
unsigned char flags2;
......
......@@ -36,9 +36,9 @@
namespace XLS
{
BookExt::BookExt()
: cb(22)
BookExt::BookExt() : cb(22)
{
mdFactoidDisplay = 0;
}
......@@ -62,15 +62,15 @@ void BookExt::readFields(CFRecord& record)
if (record.loadAnyData(flags))
{
fDontAutoRecover = GETBIT(flags, 0);
fHidePivotList = GETBIT(flags, 1);
fFilterPrivacy = GETBIT(flags, 2);
fEmbedFactoids = GETBIT(flags, 3);
mdFactoidDisplay = static_cast<unsigned char>(GETBITS(flags, 4, 5));
fSavedDuringRecovery = GETBIT(flags, 6);
fCreatedViaMinimalSave = GETBIT(flags, 7);
fOpenedViaDataRecovery = GETBIT(flags, 8);
fOpenedViaSafeLoad = GETBIT(flags, 9);
fDontAutoRecover = GETBIT(flags, 0);
fHidePivotList = GETBIT(flags, 1);
fFilterPrivacy = GETBIT(flags, 2);
fEmbedFactoids = GETBIT(flags, 3);
mdFactoidDisplay = GETBITS(flags, 4, 5);
fSavedDuringRecovery = GETBIT(flags, 6);
fCreatedViaMinimalSave = GETBIT(flags, 7);
fOpenedViaDataRecovery = GETBIT(flags, 8);
fOpenedViaSafeLoad = GETBIT(flags, 9);
}
else return;
......
......@@ -37,6 +37,7 @@ namespace XLS
ColInfo::ColInfo()
{
iOutLevel = 0;
}
......
......@@ -38,6 +38,8 @@ namespace XLS
DbOrParamQry::DbOrParamQry(int typeRecord_)
{
typeRecord = typeRecord_;
param.pbt = query.dbt = 0;
}
DbOrParamQry::~DbOrParamQry()
......
......@@ -71,12 +71,12 @@ void Dv::readFields(CFRecord& record)
record >> flags;
valType = static_cast<_valTypeDv>(GETBITS(flags, 0, 3));
errStyle = static_cast<unsigned char>(GETBITS(flags, 4, 6));
errStyle = GETBITS(flags, 4, 6);
fStrLookup = GETBIT(flags, 7);
fAllowBlank = GETBIT(flags, 8);
fSuppressCombo = GETBIT(flags, 9);
mdImeMode = static_cast<unsigned char>(GETBITS(flags, 10, 17));
mdImeMode = GETBITS(flags, 10, 17);
fShowInputMsg = GETBIT(flags, 18);
fShowErrorMsg = GETBIT(flags, 19);
typOperator = static_cast<_typOperatorDv>(GETBITS(flags, 20, 23));
......
......@@ -36,7 +36,7 @@ namespace XLS
{
ExternName::ExternName(const unsigned short supporting_link_type)
: supbook_cch(supporting_link_type)
: supbook_cch(supporting_link_type), cf(0)
{
}
......
......@@ -45,7 +45,7 @@ const wchar_t* const AutoFilterDefineNames[] =
Lbl::Lbl()
: rgce(false)
: rgce(false), fGrp(0)
{
}
......
......@@ -37,6 +37,7 @@ namespace XLS
Qsir::Qsir()
{
wVerBeforeRefreshAlert = 0;
}
......
......@@ -37,6 +37,7 @@ namespace XLS
Row::Row()
{
iOutLevel = ixfe_val = 0;
}
......
......@@ -37,6 +37,7 @@ namespace XLS
SXEx::SXEx()
{
cWrapPage = 0;
}
......
......@@ -60,7 +60,7 @@ void SXLI::readFields(CFRecord& record)
{
break;
}
SXLIItem item;
SXLIItem item = {};
unsigned short flags;
......
......@@ -74,12 +74,12 @@ int SXVI::serialize(std::wostream & strm)
CP_XML_NODE(L"item")
{
if (fMissing) CP_XML_ATTR(L"m", 1);
if (fHidden) CP_XML_ATTR(L"h", 1);
if (fHideDetail)CP_XML_ATTR(L"sd", 1);
if (fHideDetail)CP_XML_ATTR(L"sd", 0);
if (fFormula) CP_XML_ATTR(L"f", 1);
if (itmType == 0)
{
if (fHidden) CP_XML_ATTR(L"h", 1);
CP_XML_ATTR(L"x", iCache);
}
switch(itmType)
......
......@@ -37,7 +37,7 @@ namespace XLS
Setup::Setup()
// the following may appear uninitialized but we have to store them
: iPaperSize(0), iScale(255), iRes(0), iVRes(0), iCopies(0), fNoOrient(false), fPortrait(false), iPageStart(1)
: iPaperSize(0), iScale(255), iRes(0), iVRes(0), iCopies(0), fNoOrient(false), fPortrait(false), iPageStart(1), iErrors(0)
{
}
......@@ -56,16 +56,17 @@ void Setup::readFields(CFRecord& record)
{
unsigned short flags;
record >> iPaperSize >> iScale >> iPageStart >> iFitWidth >> iFitHeight >> flags;
fLeftToRight = GETBIT(flags, 0);
fPortrait = GETBIT(flags, 1);
fNoPls = GETBIT(flags, 2);
fNoColor = GETBIT(flags, 3);
fDraft = GETBIT(flags, 4);
fNotes = GETBIT(flags, 5);
fNoOrient = GETBIT(flags, 6);
fUsePage = GETBIT(flags, 7);
fEndNotes = GETBIT(flags, 9);
iErrors = GETBITS(flags, 10, 11);
fPortrait = GETBIT(flags, 1);
fNoPls = GETBIT(flags, 2);
fNoColor = GETBIT(flags, 3);
fDraft = GETBIT(flags, 4);
fNotes = GETBIT(flags, 5);
fNoOrient = GETBIT(flags, 6);
fUsePage = GETBIT(flags, 7);
fEndNotes = GETBIT(flags, 9);
iErrors = GETBITS(flags, 10, 11);
record >> iRes >> iVRes >> numHdr >> numFtr >> iCopies;
}
......
......@@ -38,6 +38,7 @@ namespace XLS
SheetExt::SheetExt()
{
icvPlain = 0;
}
......@@ -61,7 +62,7 @@ void SheetExt::readFields(CFRecord& record)
_UINT32 flags;
record >> flags;
icvPlain = static_cast<unsigned char>(GETBITS(flags, 0, 6));
icvPlain = GETBITS(flags, 0, 6);
if(0x00000028 == cb)
{
......
......@@ -37,6 +37,7 @@ namespace XLS
Style::Style()
{
ixfe = 0;
}
......
......@@ -37,6 +37,7 @@ namespace XLS
SxFilt::SxFilt()
{
isxvd = iDim = cisxvi = grbitSbt = 0;
}
......@@ -52,16 +53,15 @@ BaseObjectPtr SxFilt::clone()
void SxFilt::readFields(CFRecord& record)
{
unsigned short flags1;
unsigned short flags2;
unsigned short flags1, flags2;
record >> flags1 >> isxvd >> flags2 >> grbitSbt >> cisxvi;
record >> flags1 >> flags2 >> grbitSbt >> cisxvi;
sxaxisRw = GETBIT(flags1, 0);
sxaxisCol = GETBIT(flags1, 1);
sxaxisPage = GETBIT(flags1, 2);
sxaxisData = GETBIT(flags1, 3);
iDim = GETBITS(flags1, 4, 15);
iDim = GETBITS(flags1, 6, 15);
isxvd = GETBITS(flags2, 0, 9);
fSelected = GETBIT(flags2, 10);
......
......@@ -54,8 +54,10 @@ public:
bool sxaxisCol;
bool sxaxisPage;
bool sxaxisData;
unsigned short iDim;
unsigned short isxvd;
char iDim;
char isxvd;
bool fSelected;
short grbitSbt;
......
......@@ -36,7 +36,7 @@
namespace XLS
{
class SxItm: public BiffRecordContinued
class SxItm: public BiffRecordContinued
{
BIFF_RECORD_DEFINE_TYPE_INFO(SxItm)
BASE_OBJECT_DEFINE_CLASS_NAME(SxItm)
......
......@@ -37,6 +37,7 @@ namespace XLS
SxSelect::SxSelect()
{
cClick = 0;
}
......
......@@ -62,7 +62,7 @@ void Text::readFields(CFRecord& record)
if (record.getGlobalWorkbookInfo()->Version < 0x0600)
{
int orient = GETBITS(flags1, 8, 10);
unsigned char orient = GETBITS(flags1, 8, 10);
switch(orient)
{
case 0: trot = 0; break; // Text orientation: not rotated.
......@@ -75,8 +75,8 @@ void Text::readFields(CFRecord& record)
{
record >> icvText >> flags2 >> trot;
//icv -> from Palette
dlp = static_cast<unsigned char>(GETBITS(flags2, 0, 3));
iReadingOrder = static_cast<unsigned char>(GETBITS(flags2, 14, 15));
dlp = GETBITS(flags2, 0, 3);
iReadingOrder = GETBITS(flags2, 14, 15);
}
fAutoColor = GETBIT(flags1, 0);
......
......@@ -37,6 +37,7 @@ namespace XLS
Tick::Tick()
{
iReadingOrder = 0;
}
......@@ -59,11 +60,11 @@ void Tick::readFields(CFRecord& record)
record.skipNunBytes(16); // reserved
record >> flags >> icv >> trot;
fAutoCo = GETBIT(flags, 0);
fAutoMode = GETBIT(flags, 1);
rot = GETBITS(flags, 2, 4);
fAutoRot = GETBIT(flags, 5);
iReadingOrder = GETBITS(flags, 14, 15);
fAutoCo = GETBIT(flags, 0);
fAutoMode = GETBIT(flags, 1);
rot = GETBITS(flags, 2, 4);
fAutoRot = GETBIT(flags, 5);
iReadingOrder = GETBITS(flags, 14, 15);
_rott = rot;
}
......
......@@ -146,8 +146,8 @@ void TxO::readFields(CFRecord& record)
}
}
hAlignment = static_cast<unsigned char>(GETBITS(flags, 1, 3));
vAlignment = static_cast<unsigned char>(GETBITS(flags, 4, 6)); // reserved2 (2 bits)
hAlignment = GETBITS(flags, 1, 3);
vAlignment = GETBITS(flags, 4, 6); // reserved2 (2 bits)
fLockText = GETBIT(flags, 9); // reserved3 (4 bits)
fJustLast = GETBIT(flags, 14);
......
......@@ -55,6 +55,8 @@ public:
cbRuns = 0;
sp_enabled = false;
preserve_enabled = false;
hAlignment = 0;
vAlignment = 0;
}
~TxO();
......
......@@ -37,6 +37,8 @@ namespace XLS
TxtQry::TxtQry()
{
iCpidNew = 0;
iTextDelm = 0;
}
......
......@@ -37,7 +37,8 @@ namespace XLS
XF::XF(size_t& cell_xf_current_id, size_t& style_xf_current_id)
: cell(cell_xf_current_id, style_xf_current_id),
style(cell_xf_current_id, style_xf_current_id)
style(cell_xf_current_id, style_xf_current_id),
ixfParent(0)
{
}
......
......@@ -41,6 +41,7 @@ namespace XLS
CellXF::CellXF(size_t& cell_xf_current_id, size_t& style_xf_current_id)
: cell_xf_current_id_(cell_xf_current_id), style_xf_current_id_(style_xf_current_id), font_id(0xFFFF)
{
alc = alcV = 0;
}
......@@ -70,7 +71,7 @@ void CellXF::load(CFRecord& record)
fShrinkToFit = 0;//GETBIT(flags1, 20);
iReadOrder = 0;//static_cast<unsigned char>(GETBITS(flags1, 22, 23));
char orient = GETBITS(flags1, 8, 10);
char orient = static_cast<unsigned char>(GETBITS(flags1, 8, 10));
switch(orient)
{
......
......@@ -44,9 +44,9 @@ OfficeArtCOLORREF::OfficeArtCOLORREF()
OfficeArtCOLORREF::OfficeArtCOLORREF(const int raw_data)
{
red = static_cast<unsigned char>(GETBITS(raw_data, 0, 7));
green = static_cast<unsigned char>(GETBITS(raw_data, 8, 15));
blue = static_cast<unsigned char>(GETBITS(raw_data, 16, 23));
red = GETBITS(raw_data, 0, 7);
green = GETBITS(raw_data, 8, 15);
blue = GETBITS(raw_data, 16, 23);
fPaletteIndex = GETBIT(raw_data, 24);
fPaletteRGB = GETBIT(raw_data, 25);
......
......@@ -31,7 +31,14 @@
*/
#include "PtgSxName.h"
#include <Binary/CFRecord.h>
#include "../Biff_unions/PIVOTCACHE.h"
#include "../Biff_unions/FDB.h"
#include "../Biff_unions/SXOPER.h"
#include "../Biff_records/SXFDB.h"
#include "../Biff_records/SxName.h"
#include "../Biff_records/SXPair.h"
namespace XLS
{
......@@ -51,37 +58,58 @@ void PtgSxName::loadFields(CFRecord& record)
void PtgSxName::assemble(AssemblerStack& ptg_stack, PtgQueue& extra_data, bool full_ref)
{
//RevNamePtr tab_id;
//if(!extra_data.empty() && (tab_id = boost::dynamic_pointer_cast<RevName>(extra_data.front())))
//{
// Log::error("PtgNameX struct for revisions is not assemble.");
// ptg_stack.push(L"#REF!");
// extra_data.pop();
// return;
//}
std::wstring _Name;
if(sxIndex > 0 && sxIndex <= global_info->AddinUdfs.size() && !(_Name = global_info->AddinUdfs[sxIndex - 1]).empty())
{
ptg_stack.push(_Name);
}
else if(sxIndex > 0 && sxIndex <= global_info->xti_parsed.size())
{
std::wstring sheet = global_info->xti_parsed[sxIndex-1];
if (!sheet.empty()) sheet += L"!";
if (sxIndex > 0 && sxIndex <= global_info->arDefineNames.size())
if (sxIndex < global_info->arPivotSxNames.size())
{
SxName *name = dynamic_cast<SxName*>(global_info->arPivotSxNames[sxIndex].name.get());
if ((name) && (name->ifdb >= 0 && name->ifdb < global_info->arPivotCacheSxNames.size()))
{
_Name = global_info->arDefineNames[sxIndex - 1];
_Name = global_info->arPivotCacheSxNames[name->ifdb];
}
if (sheet.empty() && _Name.empty() && sxIndex <= global_info->arExternalNames.size() && sxIndex > 0)
else if (!global_info->arPivotSxNames[sxIndex].pair.empty())
{
_Name = global_info->arExternalNames[sxIndex - 1];
}
SXPair *pair = dynamic_cast<SXPair*>(global_info->arPivotSxNames[sxIndex].pair[0].get());
if (pair)
{
std::map<int, BaseObjectPtr>::iterator pFind = global_info->mapPivotCache.find(global_info->idPivotCache);
if (pFind != global_info->mapPivotCache.end())
{
PIVOTCACHE* pivot_cache = dynamic_cast<PIVOTCACHE*>(pFind->second.get());
if (pivot_cache)
{
if (pair->isxvd >= 0 && pair->isxvd < pivot_cache->m_arFDB.size())
{
FDB* field = dynamic_cast<FDB*>(pivot_cache->m_arFDB[pair->isxvd].get());
if (field)
{
ptg_stack.push(sheet + _Name);
SXFDB* field_db= dynamic_cast<SXFDB*>(field->m_SXFDB.get());
if (field_db)
{
_Name = field_db->stFieldName.value();
if (std::wstring::npos != _Name.find(L" "))
{
_Name = L"'" + _Name + L"'";
}
}
if (pair->iCache >= 0 && pair->iCache < field->m_arSRCSXOPER.size())
{
SXOPER* cache = dynamic_cast<SXOPER*>(field->m_arSRCSXOPER[pair->iCache].get());
if (cache)
{
_Name += L"[" + cache->get_value() + L"]";
}
}
}
}
}
}
}
}
ptg_stack.push(_Name);
}
else
{
......
......@@ -41,9 +41,11 @@ namespace XLS
StyleXF::StyleXF(size_t& cell_xf_current_id, size_t& style_xf_current_id)
: cell_xf_current_id_(cell_xf_current_id), style_xf_current_id_(style_xf_current_id), font_id(0xFFFF)
{
font_id = -1;
font_id = -1;
border_x_id = -1;
fill_x_id = -1;
fill.fls = 0;
}
......@@ -83,7 +85,7 @@ void StyleXF::load(CFRecord& record)
case 3: trot = 270; break; // Text orientation: 90 deg clockwise.
}
fill.fls = static_cast<unsigned char>(GETBITS(flags2, 16, 21));
fill.fls = GETBITS(flags2, 16, 21);
fill.icvFore = GETBITS(flags2, 0, 6);
fill.icvBack = GETBITS(flags2, 7, 13);
......@@ -132,7 +134,7 @@ void StyleXF::load(CFRecord& record)
border.icvBottom = (0 != border.dgBottom)? static_cast<unsigned char>(GETBITS(flags3, 7, 13)) : 0;
border.icvDiag = (0 != border.dgDiag) ? static_cast<unsigned char>(GETBITS(flags3, 14, 20)) : 0;
fill.fls = static_cast<unsigned char>(GETBITS(flags3, 26, 31));
fill.fls = GETBITS(flags3, 26, 31);
fill.icvFore = GETBITS(flags4, 0, 6);
fill.icvBack = GETBITS(flags4, 7, 13);
......
......@@ -92,41 +92,26 @@ int DREF::serialize(std::wostream & strm)
}
else if(bin)
{
switch(bin->nBuiltin)
CP_XML_ATTR(L"type", L"worksheet");
CP_XML_NODE(L"worksheetSource")
{
case 0x0004:/*Database*/
case 0x000d:/*_FilterDatabase*/
{
CP_XML_ATTR(L"type", L"external");
//connectionId in connections(root)
}break;
case 0x0000:/*Consolidate_Area*/
//{
// CP_XML_ATTR(L"type", L"consolidation");
// CP_XML_NODE(L"consolidation")
// {
// CP_XML_ATTR(L"name", bin->stFile.value());
// }
//}break;
case 0x0001:/*Auto_Open*/
case 0x0002:/*Auto_Close*/
case 0x0003:/*Extract*/
case 0x0005:/*Criteria*/
case 0x0006:/*Print_Area*/
case 0x0007:/*Print_Titles*/
case 0x0008:/*Recorder*/
case 0x0009:/*Data_Form*/
case 0x000a:/*Auto_Activate*/
case 0x000b:/*Auto_Deactivate*/
case 0x000c:/*Sheet_Title*/
switch(bin->nBuiltin)
{
CP_XML_ATTR(L"type", L"scenario");
CP_XML_NODE(L"worksheetSource")
{
CP_XML_ATTR(L"name", bin->stFile.value());
}
}break;
case 0x0000: CP_XML_ATTR(L"name", L"_xlnm.Consolidate_Area"); break;
case 0x0001: CP_XML_ATTR(L"name", L"_xlnm.Auto_Open"); break;
case 0x0002: CP_XML_ATTR(L"name", L"_xlnm.Auto_Close"); break;
case 0x0003: CP_XML_ATTR(L"name", L"_xlnm.Extract"); break;
case 0x0004: CP_XML_ATTR(L"name", L"_xlnm.Database"); break;
case 0x0005: CP_XML_ATTR(L"name", L"_xlnm.Criteria"); break;
case 0x0006: CP_XML_ATTR(L"name", L"_xlnm.Print_Area"); break;
case 0x0007: CP_XML_ATTR(L"name", L"_xlnm.Print_Titles"); break;
case 0x0008: CP_XML_ATTR(L"name", L"_xlnm.Recorder"); break;
case 0x0009: CP_XML_ATTR(L"name", L"_xlnm.Data_Form"); break;
case 0x000a: CP_XML_ATTR(L"name", L"_xlnm.Auto_Activate"); break;
case 0x000b: CP_XML_ATTR(L"name", L"_xlnm.Auto_Deactivate"); break;
case 0x000c: CP_XML_ATTR(L"name", L"_xlnm.Sheet_Title"); break;
case 0x000d: CP_XML_ATTR(L"name", L"_xlnm._FilterDatabase"); break; //??
}
}
}
else if(ref)
......
......@@ -97,6 +97,8 @@ BaseObjectPtr FDB::clone()
const bool FDB::loadContent(BinProcessor& proc)
{
global_info = proc.getGlobalWorkbookInfo();
if(!proc.mandatory<SXFDB>())
{
return false;
......@@ -179,6 +181,8 @@ int FDB::serialize(std::wostream & strm)
SXFDBType* fdb_type = dynamic_cast<SXFDBType*>(m_SXFDBType.get());
if (!fdb || !fdb_type) return 0;
global_info->arPivotCacheSxNames.push_back(fdb->stFieldName.value());
CP_XML_WRITER(strm)
{
......@@ -214,7 +218,9 @@ int FDB::serialize(std::wostream & strm)
}
if(m_SXFMLA)
{
//{formula
SXFMLA* Formula = dynamic_cast<SXFMLA*>(m_SXFMLA.get());
if (Formula)
Formula->serialize_attr(CP_GET_XML_NODE());
}
if (m_arSRCSXOPER.empty() == false)
......
......@@ -67,6 +67,7 @@ public:
bool bInteger;
bool bBool;
GlobalWorkbookInfoPtr global_info;
};
} // namespace XLS
......
......@@ -91,12 +91,17 @@ const bool PIVOTCACHEDEFINITION::loadContent(BinProcessor& proc)
}
int PIVOTCACHEDEFINITION::serialize_definitions(std::wostream & strm)
{
global_info_->arPivotCacheSxNames.clear();
global_info_->arPivotSxNames.clear();
SXStreamID* streamId = dynamic_cast<SXStreamID*>(m_SXStreamID.get());
if (!streamId) return 0;
std::map<int, BaseObjectPtr>::iterator pFind = global_info_->mapPivotCache.find(streamId->idStm);
if (pFind == global_info_->mapPivotCache.end()) return 0;
global_info_->idPivotCache = streamId->idStm;
PIVOTCACHE* pivot_cache = dynamic_cast<PIVOTCACHE*>(pFind->second.get());
if (!pivot_cache) return 0;
......
......@@ -31,8 +31,8 @@
*/
#include "PIVOTRULE.h"
#include <Logic/Biff_records/SxRule.h>
#include <Logic/Biff_unions/PRFILTER.h>
#include "PRFILTER.h"
#include "../Biff_records/SxRule.h"
namespace XLS
{
......@@ -49,7 +49,6 @@ BaseObjectPtr PIVOTRULE::clone()
return BaseObjectPtr(new PIVOTRULE(*this));
}
// PIVOTRULE = SxRule *PRFILTER
const bool PIVOTRULE::loadContent(BinProcessor& proc)
{
......
......@@ -89,7 +89,8 @@ int PIVOTVD::serialize(std::wostream & strm)
if (vd->sxaxis.bRw) CP_XML_ATTR(L"axis", L"axisRow");
else if (vd->sxaxis.bCol) CP_XML_ATTR(L"axis", L"axisCol");
else if (vd->sxaxis.bPage) CP_XML_ATTR(L"axis", L"axisPage");
else if (vd->sxaxis.bData)
if (vd->sxaxis.bData)
{
CP_XML_ATTR(L"dataField", 1);
}
......
......@@ -31,30 +31,26 @@
*/
#include "PRFILTER.h"
#include <Logic/Biff_records/SxFilt.h>
#include <Logic/Biff_records/SxItm.h>
#include <Logic/Biff_records/Continue.h>
#include "../Biff_records/SxFilt.h"
#include "../Biff_records/SxItm.h"
#include "../Biff_records/Continue.h"
namespace XLS
{
PRFILTER::PRFILTER()
{
}
PRFILTER::~PRFILTER()
{
}
BaseObjectPtr PRFILTER::clone()
{
return BaseObjectPtr(new PRFILTER(*this));
}
// PRFILTER = SxFilt [SxItm *Continue]
const bool PRFILTER::loadContent(BinProcessor& proc)
{
......@@ -62,11 +58,16 @@ const bool PRFILTER::loadContent(BinProcessor& proc)
{
return false;
}
m_SxFilt = elements_.back();
elements_.pop_back();
if(proc.optional<SxItm>())
{
m_SxItm = elements_.back();
elements_.pop_back();
int count = proc.repeated<Continue>(0, 0);
}
return true;
}
......
......@@ -36,8 +36,6 @@
namespace XLS
{
// Logical representation of PRFILTER union of records
class PRFILTER: public CompositeObject
{
BASE_OBJECT_DEFINE_CLASS_NAME(PRFILTER)
......@@ -49,7 +47,10 @@ public:
virtual const bool loadContent(BinProcessor& proc);
static const ElementType type = typePRFILTER;
static const ElementType type = typePRFILTER;
BaseObjectPtr m_SxFilt;
BaseObjectPtr m_SxItm;
};
} // namespace XLS
......
......@@ -79,7 +79,7 @@ BaseObjectPtr SXFMLA::clone()
// SXFMLA = SxFmla *(SxName *SXPair)
const bool SXFMLA::loadContent(BinProcessor& proc)
{
GlobalWorkbookInfoPtr global_info = proc.getGlobalWorkbookInfo();
global_info = proc.getGlobalWorkbookInfo();
if(!proc.mandatory<SxFmla>())
{
......@@ -97,7 +97,7 @@ const bool SXFMLA::loadContent(BinProcessor& proc)
_sx_name sx_name;
sx_name.name = elements_.front(); elements_.pop_front();
global_info->arPivotSxNames.push_back(sx_name);
m_arPivotSxNames.push_back(sx_name);
}
else
{
......@@ -109,7 +109,7 @@ const bool SXFMLA::loadContent(BinProcessor& proc)
}
else
{
global_info->arPivotSxNames.back().pair.push_back(elements_.front());
m_arPivotSxNames.back().pair.push_back(elements_.front());
elements_.pop_front();
}
}
......@@ -119,5 +119,17 @@ const bool SXFMLA::loadContent(BinProcessor& proc)
return true;
}
void SXFMLA::serialize_attr(CP_ATTR_NODE)
{
if (!m_SxFmla) return;
SxFmla* sx_fmla = dynamic_cast<SxFmla*>(m_SxFmla.get());
global_info->arPivotSxNames = m_arPivotSxNames;
CP_XML_ATTR(L"formula", sx_fmla->fmla.getAssembledFormula());
}
} // namespace XLS
......@@ -35,6 +35,7 @@
namespace XLS
{
class SXFMLA: public CompositeObject
{
BASE_OBJECT_DEFINE_CLASS_NAME(SXFMLA)
......@@ -46,10 +47,15 @@ public:
BaseObjectPtr clone();
virtual const bool loadContent(BinProcessor& proc);
void serialize_attr(CP_ATTR_NODE);
static const ElementType type = typeSXFMLA;
static const ElementType type = typeSXFMLA;
BaseObjectPtr m_SxFmla;
std::vector<_sx_name> m_arPivotSxNames;
//-------------------------------------------------------------------------
GlobalWorkbookInfoPtr global_info;
};
} // namespace XLS
......
......@@ -34,11 +34,15 @@
#include "SXFMLA_bu.h"
#include "PIVOTRULE.h"
#include "PRFILTER.h"
#include "../Biff_records/SXFormula.h"
#include "../Biff_records/SxFmla.h"
#include "../Biff_records/SxName.h"
#include "../Biff_records/SXPair.h"
#include "../Biff_records/SxItm.h"
#include "../Biff_records/SxFilt.h"
#include "../Biff_records/SxRule.h"
namespace XLS
{
......@@ -85,21 +89,52 @@ int SXFORMULA::serialize(std::wostream & strm)
SXFMLA* fmla = dynamic_cast<SXFMLA*>(m_SXFMLA.get());
if (!fmla) return 0;
SxFmla* sx_fmla = dynamic_cast<SxFmla*>(fmla->m_SxFmla.get());
PIVOTRULE* pivot_rule = dynamic_cast<PIVOTRULE*>(m_PIVOTRULE.get());
CP_XML_WRITER(strm)
{
CP_XML_NODE(L"calculatedItem")
{
CP_XML_ATTR(L"formula", sx_fmla->fmla.getAssembledFormula());
//for (size_t j = 0; j < global_info->arPivotSxNames.size(); j++)//???
//{
// SxName *name = dynamic_cast<SxName*>(global_info->arPivotSxNames[j].m_SxName.get());
// CP_XML_NODE(L"pivotArea")
// {
// }
//}
fmla->serialize_attr(CP_GET_XML_NODE());
if (pivot_rule)
{
SxRule* rule = dynamic_cast<SxRule*>(pivot_rule->m_SxRule.get());
for (size_t j = 0; j < pivot_rule->m_arPRFILTER.size(); j++)//multi in pivotAreas !!! todooo ???
{
PRFILTER* filter = dynamic_cast<PRFILTER*>(pivot_rule->m_arPRFILTER[j].get());
SxItm* item = dynamic_cast<SxItm*>(filter->m_SxItm.get());
SxFilt* filt = dynamic_cast<SxFilt*>(filter->m_SxFilt.get());
CP_XML_NODE(L"pivotArea")
{
CP_XML_ATTR(L"cacheIndex", 1);//true
CP_XML_ATTR(L"outline", 0);
CP_XML_ATTR(L"fieldPosition", (int)rule->iDim);
CP_XML_NODE(L"references")
{
CP_XML_ATTR(L"count", item->rgisxvi.size());
for (size_t i = 0; i < item->rgisxvi.size(); i++)
{
CP_XML_NODE(L"reference")
{
CP_XML_ATTR(L"field", (int)filt->isxvd);
CP_XML_ATTR(L"count", (int)filt->iDim);
CP_XML_NODE(L"x")
{
CP_XML_ATTR(L"v", item->rgisxvi[i]);
}
}
}
}
}
}
}
}
}
return 0;
......
......@@ -111,5 +111,36 @@ int SXOPER::serialize(std::wostream & strm)
m_element->serialize(strm);
return 0;
}
std::wstring SXOPER::get_value()
{
std::wstring value;
SXNum *num = dynamic_cast<SXNum*>(m_element.get());
if (num)
{
value = std::to_wstring(num->num.data.value);
}
else
{
SXString *str = dynamic_cast<SXString*>(m_element.get());
if (str)
{
value = str->segment.value();
}
else
{
SXDtr *dtr = dynamic_cast<SXDtr*>(m_element.get());
if (dtr)
{
value = dtr->get_string_date();
}
else
{
}
}
}
return value;
}
} // namespace XLS
......@@ -49,6 +49,8 @@ public:
int serialize(std::wostream & strm);
std::wstring get_value();
static const ElementType type = typeSXOPER;
BaseObjectPtr m_element;
......
......@@ -35,6 +35,11 @@
namespace XLS
{
struct _sxtbl_item
{
BaseObjectPtr item;
std::vector<BaseObjectPtr> strings;
};
class SXTBL: public CompositeObject
{
......@@ -47,8 +52,14 @@ public:
virtual const bool loadContent(BinProcessor& proc);
int serialize(std::wostream & stream);
static const ElementType type = typeSXTBL;
BaseObjectPtr m_SXTbl;
std::vector<BaseObjectPtr> m_arDREF;
std::vector<BaseObjectPtr> m_arSxTbpg;
std::vector<_sxtbl_item> m_arSXTBRGIITM;
};
} // namespace XLS
......
......@@ -65,6 +65,7 @@ public:
{
return false;
}
proc.repeated<SXString>(0, 0);
return true;
};
......@@ -80,17 +81,55 @@ BaseObjectPtr SXTBL::clone()
// SXTBL = SXTbl *DREF *SxTbpg *(SXTBRGIITM *SXString)
const bool SXTBL::loadContent(BinProcessor& proc)
{
if(!proc.mandatory<SXTbl>())
{
return false;
}
proc.repeated<DREF>(0, 0);
proc.repeated<SxTbpg>(0, 0);
proc.repeated<Parenthesis_SXTBL_1>(0, 0);
m_SXTbl = elements_.back();
elements_.pop_back();
int count =0;
count = proc.repeated<DREF>(0, 0);
while(!elements_.empty())
{
m_arDREF.push_back(elements_.front());
elements_.pop_front();
}
count = proc.repeated<SxTbpg>(0, 0);
while(!elements_.empty())
{
m_arSxTbpg.push_back(elements_.front());
elements_.pop_front();
}
count = proc.repeated<Parenthesis_SXTBL_1>(0, 0);
while(!elements_.empty())
{
SXTBRGIITM* item = dynamic_cast<SXTBRGIITM*>(elements_.front().get());
if (item)
{
_sxtbl_item it;
it.item = elements_.front();
m_arSXTBRGIITM.push_back(it);
}
else
{
m_arSXTBRGIITM.back().strings.push_back(elements_.front());
}
elements_.pop_front();
}
return true;
}
int SXTBL::serialize(std::wostream & stream)
{
if (!m_SXTbl) return 0;
return 0;
}
} // namespace XLS
......@@ -118,6 +118,8 @@ GlobalWorkbookInfo::GlobalWorkbookInfo(const unsigned short code_page, XlsConver
defaultDigitFontSize = std::pair<float, float>(0, 0);
applicationFonts = NULL;
idPivotCache = 0;
}
GlobalWorkbookInfo::~GlobalWorkbookInfo()
......
......@@ -105,10 +105,14 @@ public:
unsigned int last_AXES_id;
const static unsigned int initial_AXES_id = 0x2000000;
short idPivotCache;
std::map<int, BaseObjectPtr> mapPivotCache;
std::vector<bool> arPivotCacheFields;
std::vector<bool> arPivotCacheFieldShortSize;
std::vector<_sx_name> arPivotSxNames;
std::vector<std::wstring> arPivotCacheSxNames;
std::vector<std::wstring> arPivotCacheReferences;
std::map<std::wstring, std::vector<std::wstring>> mapDefineNames;
std::vector<std::wstring> arDefineNames;
......
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