Compare commits

...

5 Commits

Author SHA1 Message Date
cf5458c761 XlsFormat - pivot tables 2017-07-13 18:09:17 +03:00
9115edbd78 fix bug #35382. 2017-07-13 17:51:32 +03:00
3f18f96171 codegen change Pivot constants format 2017-07-13 17:13:38 +03:00
8a75916944 XlsFormat - pivots dB connections 2017-07-12 16:40:36 +03:00
da45eb4f33 XlsFormat - pivots... 2017-07-12 11:25:12 +03:00
83 changed files with 1083 additions and 259 deletions

View File

@ -68,12 +68,12 @@ namespace DocFileFormat
int cp = m_document->FIB->m_RgLw97.ccpText + m_document->FIB->m_RgLw97.ccpFtn + m_document->FIB->m_RgLw97.ccpHdr;
size_t count = m_document->AnnotationsReferencePlex->Elements.size();
for (unsigned int i = 0; i < count; ++i)
for (size_t i = 0; i < count; ++i)
{
AnnotationReferenceDescriptor* atrdPre10 = static_cast<AnnotationReferenceDescriptor*>(m_document->AnnotationsReferencePlex->Elements[index]);
m_pXmlWriter->WriteNodeBegin( L"w:comment", TRUE );
m_pXmlWriter->WriteAttribute( L"w:id", FormatUtils::IntToWideString( index ));
m_pXmlWriter->WriteAttribute( L"w:id", FormatUtils::IntToWideString( index + 1 ));
m_pXmlWriter->WriteAttribute( L"w:author",
FormatUtils::XmlEncode(m_document->AnnotationOwners->at( atrdPre10->GetAuthorIndex() ) ));
m_pXmlWriter->WriteAttribute( L"w:initials", atrdPre10->GetUserInitials());

View File

@ -290,17 +290,15 @@ namespace DocFileFormat
std::vector<wchar_t>* chpxChars = m_document->GetChars(fcChpxStart, fcChpxEnd, cp);
//search for bookmarks in the chars
std::vector<int> bookmarks = searchBookmarks(chpxChars, cp);
//if there are bookmarks in this run, split the run into several runs
if (!bookmarks.empty())
std::vector<int> annot = searchAnnot(chpxChars, cp);
if (!annot.empty())
{
std::list<std::vector<wchar_t>>* runs = splitCharList(chpxChars, &bookmarks);
std::list<std::vector<wchar_t>>* runs = splitCharList(chpxChars, &annot);
if (runs)
{
for (std::list<std::vector<wchar_t> >::iterator iter = runs->begin(); iter != runs->end(); ++iter)
{
if (writeBookmarks(cp))
if (writeAnnotations(cp))
{
cp = writeRun(&(*iter), *cpeIter, cp);
}
@ -311,7 +309,30 @@ namespace DocFileFormat
}
else
{
cp = writeRun(chpxChars, *cpeIter, cp);
//search for bookmarks in the chars
std::vector<int> bookmarks = searchBookmarks(chpxChars, cp);
//if there are bookmarks in this run, split the run into several runs
if (!bookmarks.empty())
{
std::list<std::vector<wchar_t>>* runs = splitCharList(chpxChars, &bookmarks);
if (runs)
{
for (std::list<std::vector<wchar_t> >::iterator iter = runs->begin(); iter != runs->end(); ++iter)
{
if (writeBookmarks(cp))
{
cp = writeRun(&(*iter), *cpeIter, cp);
}
}
RELEASEOBJECT(runs);
}
}
else
{
cp = writeRun(chpxChars, *cpeIter, cp);
}
}
RELEASEOBJECT(chpxChars);
@ -948,19 +969,17 @@ namespace DocFileFormat
}
else if (TextMark::AnnotationReference == code)
{
if (typeid(*this) != typeid(CommentsMapping))
{
m_pXmlWriter->WriteNodeBegin( L"w:commentReference", true );
m_pXmlWriter->WriteAttribute( L"w:id", FormatUtils::IntToWideString( _commentNr ));
m_pXmlWriter->WriteNodeEnd( L"", true );
}
else
if (typeid(*this) == typeid(CommentsMapping))
{
m_pXmlWriter->WriteNodeBegin( L"w:annotationRef", true );
m_pXmlWriter->WriteNodeEnd( L"", true );
}
else
{
m_pXmlWriter->WriteNodeBegin( L"w:commentReference", true );
m_pXmlWriter->WriteAttribute( L"w:id", FormatUtils::IntToWideString( _commentNr ));
m_pXmlWriter->WriteNodeEnd( L"", true );
}
_commentNr++;
}
else if (!FormatUtils::IsControlSymbol(c) && ((int)c != 0xFFFF))
{
@ -1042,6 +1061,30 @@ namespace DocFileFormat
return ret;
}
// Searches for bookmarks in the list of characters.
std::vector<int> DocumentMapping::searchAnnot(std::vector<wchar_t>* chars, int initialCp)
{
std::vector<int> ret;
if (m_document->AnnotStartPlex->IsValid())
{
int cp = initialCp;
size_t count = chars->size();
for (size_t i = 0; i < count; ++i)
{
if ((m_document->AnnotStartPlex->IsCpExists(cp)) || (m_document->AnnotEndPlex->IsCpExists(cp)))
{
ret.push_back(i);
}
++cp;
}
}
return ret;
}
ParagraphPropertyExceptions* DocumentMapping::findValidPapx(int fc)
{
@ -1540,7 +1583,6 @@ namespace DocFileFormat
return cpCellEnd;
}
//
bool DocumentMapping::writeBookmarks(int cp)
{
bool result = true;
@ -1561,7 +1603,27 @@ namespace DocFileFormat
return result;
}
bool DocumentMapping::writeAnnotations(int cp)
{
bool result = true;
for (size_t i = 0; i < m_document->AnnotStartEndCPs.size(); i++)
{
if (m_document->AnnotStartEndCPs[i].first == cp)
{
result = writeAnnotationStart(i + 1);
_commentNr = i + 1;
}
if (m_document->AnnotStartEndCPs[i].second == cp)
{
result = writeAnnotationEnd(i + 1);
_commentNr = i + 1;
}
}
return result;
}
bool DocumentMapping::writeBookmarkStart(short id)
{
// write bookmark start
@ -1585,8 +1647,6 @@ namespace DocFileFormat
bool DocumentMapping::writeBookmarkEnd(short id)
{
// write bookmark end
WideString* bookmarkName = static_cast<WideString*>( m_document->BookmarkNames->operator [] ( id ) );
if ( ( bookmarkName != NULL ) && ( *bookmarkName != L"_PictureBullets" ) )
@ -1602,7 +1662,27 @@ namespace DocFileFormat
return false;
}
bool DocumentMapping::writeAnnotationStart(short id)
{
XMLTools::XMLElement bookmarkElem(L"w:commentRangeStart");
bookmarkElem.AppendAttribute(L"w:id", FormatUtils::IntToWideString(id));
m_pXmlWriter->WriteString(bookmarkElem.GetXMLString());
return true;
}
bool DocumentMapping::writeAnnotationEnd(short id)
{
XMLTools::XMLElement bookmarkElem( L"w:commentRangeEnd" );
bookmarkElem.AppendAttribute( L"w:id", FormatUtils::IntToWideString( id ));
m_pXmlWriter->WriteString( bookmarkElem.GetXMLString());
return true;
}
// Checks if the CHPX is special
bool DocumentMapping::isSpecial(CharacterPropertyExceptions* chpx)
{

View File

@ -99,8 +99,9 @@ namespace DocFileFormat
void writeTextStart ( const std::wstring& textType, bool preserve_space);
void writeTextEnd ( const std::wstring& textType );
// Searches for bookmarks in the list of characters.
std::vector<int> searchBookmarks( std::vector<wchar_t>* chars, int initialCp );
std::vector<int> searchAnnot(std::vector<wchar_t>* chars, int initialCp);
ParagraphPropertyExceptions* findValidPapx( int fc );
// Splits a list of characters into several lists
std::list<std::vector<wchar_t> >* splitCharList( std::vector<wchar_t>* chars, std::vector<int>* splitIndices );
@ -121,6 +122,10 @@ namespace DocFileFormat
bool writeBookmarks ( int cp );
bool writeBookmarkStart ( short id );
bool writeBookmarkEnd ( short id );
bool writeAnnotations ( int cp );
bool writeAnnotationStart( short id );
bool writeAnnotationEnd ( short id );
// Checks if the CHPX is special
bool isSpecial( CharacterPropertyExceptions* chpx );
// Finds the SEPX that is valid for the given CP.

View File

@ -52,7 +52,8 @@ namespace DocFileFormat
TextboxIndividualPlex(NULL),AssocNames(NULL), BookmarkAnnotNames(NULL), Captions(NULL), AutoCaptions(NULL), ListPlex(NULL),
OfficeDrawingPlex(NULL), OfficeDrawingPlexHeader(NULL), SectionPlex(NULL), BookmarkStartPlex(NULL), BookmarkEndPlex(NULL),
AutoTextPlex(NULL), AllPapxFkps(NULL), AllChpxFkps(NULL), AllPapx(NULL), AllPapxVector(NULL), AllSepx(NULL), Styles(NULL), listTable(NULL),
AnnotationOwners(NULL), DocProperties(NULL), listFormatOverrideTable(NULL), headerAndFooterTable(NULL), encryptionHeader(NULL)
AnnotationOwners(NULL), DocProperties(NULL), listFormatOverrideTable(NULL), headerAndFooterTable(NULL),
AnnotStartPlex(NULL), AnnotEndPlex(NULL), encryptionHeader(NULL)
{
m_pCallFunc = pCallFunc;
m_sTempFolder = sTempFolder;
@ -275,12 +276,17 @@ namespace DocFileFormat
TextboxIndividualPlex = new Plex<FTXBXS> (FTXBXS::STRUCTURE_SIZE, TableStream, FIB->m_FibWord97.fcPlcftxbxTxt, FIB->m_FibWord97.lcbPlcftxbxTxt, bOlderVersion);
SectionPlex = new Plex<SectionDescriptor> (SectionDescriptor::STRUCTURE_SIZE, TableStream, FIB->m_FibWord97.fcPlcfSed, FIB->m_FibWord97.lcbPlcfSed, bOlderVersion);
BookmarkStartPlex = new Plex<BookmarkFirst> (BookmarkFirst::STRUCTURE_SIZE, TableStream, FIB->m_FibWord97.fcPlcfBkf, FIB->m_FibWord97.lcbPlcfBkf, bOlderVersion);
BookmarkEndPlex = new Plex<EmptyStructure> (EmptyStructure::STRUCTURE_SIZE, TableStream, FIB->m_FibWord97.fcPlcfBkl, FIB->m_FibWord97.lcbPlcfBkl, bOlderVersion);
TextboxBreakPlex = new Plex<Tbkd> (Tbkd::STRUCTURE_SIZE, TableStream, FIB->m_FibWord97.fcPlcfTxbxBkd, FIB->m_FibWord97.lcbPlcfTxbxBkd, bOlderVersion);
TextboxBreakPlexHeader = new Plex<Tbkd> (Tbkd::STRUCTURE_SIZE, TableStream, FIB->m_FibWord97.fcPlcfTxbxHdrBkd, FIB->m_FibWord97.lcbPlcfTxbxHdrBkd, bOlderVersion);
AnnotStartPlex = new Plex<BookmarkFirst> (BookmarkFirst::STRUCTURE_SIZE, TableStream, FIB->m_FibWord97.fcPlcfAtnBkf, FIB->m_FibWord97.lcbPlcfAtnBkf, bOlderVersion);
AnnotEndPlex = new Plex<EmptyStructure> (EmptyStructure::STRUCTURE_SIZE, TableStream, FIB->m_FibWord97.fcPlcfAtnBkl, FIB->m_FibWord97.lcbPlcfAtnBkl, bOlderVersion);
for (size_t i = 0; i < BookmarkStartPlex->Elements.size(); ++i)
{
BookmarkFirst* pBookmark = static_cast<BookmarkFirst*>(BookmarkStartPlex->Elements[i]);
@ -289,7 +295,14 @@ namespace DocFileFormat
BookmarkStartEndCPs.push_back(std::make_pair(BookmarkStartPlex->CharacterPositions[i], BookmarkEndPlex->CharacterPositions[pBookmark->GetIndex()]));
}
}
for (size_t i = 0; i < AnnotStartPlex->Elements.size(); ++i)
{
BookmarkFirst* pBookmark = static_cast<BookmarkFirst*>(AnnotStartPlex->Elements[i]);
if (pBookmark)
{
AnnotStartEndCPs.push_back(std::make_pair(AnnotStartPlex->CharacterPositions[i], AnnotEndPlex->CharacterPositions[pBookmark->GetIndex()]));
}
}
AutoTextPlex = new Plex<EmptyStructure>(EmptyStructure::STRUCTURE_SIZE, TableStream, FIB->m_FibWord97.fcPlcfGlsy, FIB->m_FibWord97.lcbPlcfGlsy, bOlderVersion);
FieldsPlex = new Plex<FieldCharacter>(FieldCharacter::STRUCTURE_SIZE, TableStream, FIB->m_FibWord97.fcPlcfFldMom, FIB->m_FibWord97.lcbPlcfFldMom, bOlderVersion);
FootnoteDocumentFieldsPlex = new Plex<FieldCharacter>(FieldCharacter::STRUCTURE_SIZE, TableStream, FIB->m_FibWord97.fcPlcfFldFtn, FIB->m_FibWord97.lcbPlcfFldFtn, bOlderVersion);
@ -659,6 +672,8 @@ namespace DocFileFormat
RELEASEOBJECT(SectionPlex);
RELEASEOBJECT(BookmarkStartPlex);
RELEASEOBJECT(BookmarkEndPlex);
RELEASEOBJECT(AnnotStartPlex);
RELEASEOBJECT(AnnotEndPlex);
RELEASEOBJECT(AutoTextPlex);
RELEASEOBJECT(ListPlex);
RELEASEOBJECT(Styles);

View File

@ -162,7 +162,9 @@ namespace DocFileFormat
std::vector<int> * AllPapxVector;// A vector to quick find in AllPapx
std::map<int, int> PictureBulletsCPsMap;
std::vector<std::pair<int, int>> BookmarkStartEndCPs;
std::vector<std::pair<int, int>> AnnotStartEndCPs;
FileInformationBlock * FIB;
StyleSheet * Styles; // The style sheet of the document
@ -204,7 +206,10 @@ namespace DocFileFormat
Plex<SectionDescriptor> *SectionPlex; // A Plex containing all section descriptors
Plex<BookmarkFirst> *BookmarkStartPlex;
Plex<EmptyStructure> *BookmarkEndPlex;
Plex<EmptyStructure> *BookmarkEndPlex;
Plex<BookmarkFirst> *AnnotStartPlex;
Plex<EmptyStructure> *AnnotEndPlex;
Plex<ListNumCache> *ListPlex;
Plex<FieldCharacter> *FieldsPlex;

View File

@ -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;
}

View 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;

View File

@ -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;

View File

@ -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;

View File

@ -37,6 +37,7 @@ namespace XLS
ColInfo::ColInfo()
{
iOutLevel = 0;
}

View File

@ -35,10 +35,12 @@
namespace XLS
{
DbOrParamQry::DbOrParamQry()
DbOrParamQry::DbOrParamQry(int typeRecord_)
{
}
typeRecord = typeRecord_;
param.pbt = query.dbt = 0;
}
DbOrParamQry::~DbOrParamQry()
{
@ -52,10 +54,32 @@ BaseObjectPtr DbOrParamQry::clone()
void DbOrParamQry::readFields(CFRecord& record)
{
#pragma message("####################### DbOrParamQry record is not implemented")
Log::error("DbOrParamQry record is not implemented.");
size_t size = record.getDataSize() - record.getRdPtr();
record.skipNunBytes(record.getDataSize() - record.getRdPtr());
if (typeRecord == 1)
{
unsigned short flags;
record >> param.wTypeSql >> flags >> param.grbit >> param.fVal;
param.pbt = GETBITS(flags, 0, 1);
param.fNonDefaultName = GETBIT(flags, 2);
}
else
{
unsigned short flags;
record >> flags >> query.cparams >> query.cstQuery >> query.cstWebPost >> query.cstSQLSav >> query.cstOdbcConn;
query.dbt = GETBITS(flags, 0, 2);
query.fOdbcConn = GETBIT(flags, 3);
query.fSql = GETBIT(flags, 4);
query.fSqlSav = GETBIT(flags, 5);
query.fWeb = GETBIT(flags, 6);
query.fSavePwd = GETBIT(flags, 7);
query.fTablesOnlyHTML = GETBIT(flags, 8);
}
}
} // namespace XLS

View File

@ -36,24 +36,48 @@
namespace XLS
{
// Logical representation of DbOrParamQry record in BIFF8
class DbOrParamQry: public BiffRecord
{
BIFF_RECORD_DEFINE_TYPE_INFO(DbOrParamQry)
BASE_OBJECT_DEFINE_CLASS_NAME(DbOrParamQry)
public:
DbOrParamQry();
DbOrParamQry(int typeRecord = 2);
~DbOrParamQry();
BaseObjectPtr clone();
void readFields(CFRecord& record);
static const ElementType type = typeDbOrParamQry;
static const ElementType type = typeDbOrParamQry;
int typeRecord;
//PARAMQRY_Fixed - 8 bytes + variable
struct
{
unsigned short wTypeSql;
unsigned char pbt;
bool fNonDefaultName;
unsigned short grbit;
unsigned short fVal;
}param;
//---------------------------------------
struct
{
unsigned char dbt;
bool fOdbcConn;
bool fSql;
bool fSqlSav;
bool fWeb;
bool fSavePwd;
bool fTablesOnlyHTML;
short cparams;
short cstQuery;
short cstWebPost;
short cstSQLSav;
short cstOdbcConn;
}query;
};
} // namespace XLS

View File

@ -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));

View File

@ -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)
{
}

View File

@ -45,7 +45,7 @@ const wchar_t* const AutoFilterDefineNames[] =
Lbl::Lbl()
: rgce(false)
: rgce(false), fGrp(0)
{
}

View File

@ -37,6 +37,7 @@ namespace XLS
Qsir::Qsir()
{
wVerBeforeRefreshAlert = 0;
}

View File

@ -37,6 +37,7 @@ namespace XLS
Row::Row()
{
iOutLevel = ixfe_val = 0;
}

View File

@ -37,6 +37,7 @@ namespace XLS
SXEx::SXEx()
{
cWrapPage = 0;
}

View File

@ -70,11 +70,10 @@ void SXFDB::readFields(CFRecord& record)
fCantGetUniqueItems = GETBIT(flags, 14);
fCalculatedField = GETBIT(flags, 15);
if (fAllAtoms)
{
GlobalWorkbookInfoPtr global_info = record.getGlobalWorkbookInfo();
global_info->arCacheFieldShortSize.push_back(fShortIitms);
}
GlobalWorkbookInfoPtr global_info = record.getGlobalWorkbookInfo();
global_info->arPivotCacheFieldShortSize.push_back(fShortIitms);
global_info->arPivotCacheFields.push_back(fAllAtoms);
}
} // namespace XLS

View File

@ -35,8 +35,9 @@
namespace XLS
{
SXLI::SXLI()
SXLI::SXLI(int count_)
{
count = count_;
}
@ -59,7 +60,7 @@ void SXLI::readFields(CFRecord& record)
{
break;
}
SXLIItem item;
SXLIItem item = {};
unsigned short flags;
@ -81,10 +82,13 @@ void SXLI::readFields(CFRecord& record)
if (item.fSbt && item.itmType < 0x000D)
item.isxviMac++;
for (short i = 0; i < item.isxviMac; i++)
for (short i = 0; i < count/*item.isxviMac*/; i++)
{
short val; record >> val;
item.rgisxvi.push_back(val);
if (val >= 0x0000 && val <= 0x7EF4)
{
item.rgisxvi.push_back(val);
}
}
m_arItems.push_back(item);

View File

@ -55,7 +55,7 @@ class SXLI: public BiffRecordContinued
BIFF_RECORD_DEFINE_TYPE_INFO(SXLI)
BASE_OBJECT_DEFINE_CLASS_NAME(SXLI)
public:
SXLI();
SXLI(int count_);
~SXLI();
BaseObjectPtr clone();
@ -65,6 +65,7 @@ public:
static const ElementType type = typeSXLI;
std::vector<SXLIItem> m_arItems;
int count;
};
} // namespace XLS

View File

@ -31,7 +31,7 @@
*/
#include "SXString.h"
#include "../../../../../Common/DocxFormat/Source/XML/Utils.h"
namespace XLS
{
@ -39,12 +39,10 @@ SXString::SXString()
{
}
SXString::~SXString()
{
}
BaseObjectPtr SXString::clone()
{
return BaseObjectPtr(new SXString(*this));
@ -73,5 +71,15 @@ int SXString::serialize(std::wostream & strm)
return 0;
}
std::wstring SXString::value()
{
std::wstring s = segment.value();
XmlUtils::replace_all(s, L"\x0d", L"_x000d_");
XmlUtils::replace_all(s, L"\x0a", L"_x000a_");
return s;
}
} // namespace XLS

View File

@ -49,6 +49,8 @@ public:
void readFields(CFRecord& record);
std::wstring value();
int serialize(std::wostream & strm);
static const ElementType type = typeSXString;

View File

@ -73,17 +73,13 @@ 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"h", 1);
if (fFormula)
CP_XML_ATTR(L"f", 1);
if (fMissing) CP_XML_ATTR(L"m", 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)

View File

@ -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;
}

View File

@ -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)
{

View File

@ -37,6 +37,7 @@ namespace XLS
Style::Style()
{
ixfe = 0;
}

View File

@ -56,6 +56,18 @@ void SxBool::readFields(CFRecord& record)
val = (flags != 0);
}
int SxBool::serialize(std::wostream & strm)
{
CP_XML_WRITER(strm)
{
CP_XML_NODE(L"b")
{
CP_XML_ATTR(L"v", val);
}
}
return 0;
}
} // namespace XLS

View File

@ -48,6 +48,8 @@ public:
void readFields(CFRecord& record);
int serialize(std::wostream & strm);
static const ElementType type = typeSxBool;
bool val;

View File

@ -37,6 +37,7 @@ namespace XLS
SxFilt::SxFilt()
{
isxvd = iDim = cisxvi = grbitSbt = 0;
}
@ -52,18 +53,18 @@ BaseObjectPtr SxFilt::clone()
void SxFilt::readFields(CFRecord& record)
{
unsigned short flags1;
unsigned char 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);
fSelected = GETBIT(flags2, 0);
isxvd = GETBITS(flags2, 0, 9);
fSelected = GETBIT(flags2, 10);
}
} // namespace XLS

View File

@ -54,11 +54,13 @@ public:
bool sxaxisCol;
bool sxaxisPage;
bool sxaxisData;
unsigned short iDim;
unsigned short isxvd;
char iDim;
char isxvd;
bool fSelected;
unsigned short grbitSbt;
short grbitSbt;
unsigned short cisxvi;
};

View File

@ -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)

View File

@ -37,6 +37,7 @@ namespace XLS
SxSelect::SxSelect()
{
cClick = 0;
}

View File

@ -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);

View File

@ -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;
}

View File

@ -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);

View File

@ -55,6 +55,8 @@ public:
cbRuns = 0;
sp_enabled = false;
preserve_enabled = false;
hAlignment = 0;
vAlignment = 0;
}
~TxO();

View File

@ -37,6 +37,8 @@ namespace XLS
TxtQry::TxtQry()
{
iCpidNew = 0;
iTextDelm = 0;
}

View File

@ -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)
{
}

View File

@ -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)
{

View File

@ -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);

View File

@ -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
{
@ -45,13 +52,72 @@ BiffStructurePtr PtgSxName::clone()
void PtgSxName::loadFields(CFRecord& record)
{
record >> sxIndex;
global_info = record.getGlobalWorkbookInfo();
}
void PtgSxName::assemble(AssemblerStack& ptg_stack, PtgQueue& extra_data, bool full_ref)
{
Log::info("PtgSxName structure is not assemble.");
std::wstring _Name;
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->arPivotCacheSxNames[name->ifdb];
}
else if (!global_info->arPivotSxNames[sxIndex].pair.empty())
{
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)
{
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
{
Log::warning("PtgSxName structure is not assemble.");
ptg_stack.push(L""); // This would let us to continue without an error
}
ptg_stack.push(L"#REF!");
}

View File

@ -44,14 +44,13 @@ class PtgSxName: public OperandPtg
public:
BiffStructurePtr clone();
virtual void loadFields(CFRecord& record);
virtual void loadFields(CFRecord& record);
virtual void assemble(AssemblerStack& ptg_stack, PtgQueue& extra_data, bool full_ref = false);
private:
_UINT32 sxIndex;
private:
GlobalWorkbookInfoPtr global_info;
};
} // namespace XLS

View File

@ -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);

View File

@ -55,10 +55,13 @@ BiffStructurePtr XFExtNoFRT::clone()
void XFExtNoFRT::load(CFRecord& record)
{
if (record.isEOF()) return;
record.skipNunBytes(6); // reserved
unsigned short cexts;
record >> cexts;
for(unsigned short i = 0; i < cexts; ++i)
for(unsigned short i = 0; !record.isEOF() && i < cexts; ++i)
{
ExtProp prop;
record >> prop;

View File

@ -44,8 +44,7 @@ DBB::DBB()
bDate = false;
bNumber = false;
bEmpty = false;
fShortIitms = false;
bBool = false;
}
DBB::~DBB()
@ -75,6 +74,7 @@ const bool DBB::loadContent(BinProcessor& proc)
bDate |= operatr->bDate;
bNumber |= operatr->bNumber;
bEmpty |= operatr->bEmpty;
bBool |= operatr->bBool;
}
if (!m_SXDBB && m_arSXOPER.empty())
@ -92,34 +92,34 @@ int DBB::serialize(std::wostream & strm)
{
CP_XML_NODE(L"r")
{
if (m_arSXOPER.empty() == false)
int indexOPER = 0;
size_t posBlob = 0;
for (size_t i = 0; i < arPivotCacheFields.size(); i++)
{
for (size_t i = 0; i < m_arSXOPER.size(); i++)
if(arPivotCacheFields[i] == false)
{
m_arSXOPER[i]->serialize(CP_XML_STREAM());
}
}
else
{
if (fShortIitms == false)
{
for (size_t i = 0; i < dbb->size; i++)
{
CP_XML_NODE(L"x")
{
CP_XML_ATTR(L"v", dbb->blob[i]);
}
}
m_arSXOPER[indexOPER++]->serialize(CP_XML_STREAM());
}
else
{
unsigned short * values = (unsigned short *)dbb->blob.get();
for (size_t i = 0; i < dbb->size / 2; i++)
if (arPivotCacheFieldShortSize[i])//fShortIitms
{
unsigned short * values = (unsigned short *)(dbb->blob.get() + posBlob);
CP_XML_NODE(L"x")
{
CP_XML_ATTR(L"v", values[i]);
CP_XML_ATTR(L"v", *values);
}
posBlob+=2;
}
else
{
unsigned char * values = (unsigned char *)(dbb->blob.get() + posBlob);
CP_XML_NODE(L"x")
{
CP_XML_ATTR(L"v", *values);
}
posBlob++;
}
}
}

View File

@ -55,12 +55,14 @@ public:
std::vector<BaseObjectPtr> m_arSXOPER;
//---------------------------------------------------
bool fShortIitms;
std::vector<bool> arPivotCacheFields;
std::vector<bool> arPivotCacheFieldShortSize;
bool bString;
bool bDate;
bool bNumber;
bool bEmpty;
bool bBool;
};
} // namespace XLS

View File

@ -63,7 +63,8 @@ public:
{
return false;
}
proc.mandatory<DbOrParamQry>();
DbOrParamQry param(1);
proc.mandatory(param);
return true;
};
};
@ -80,11 +81,14 @@ public:
const bool loadContent(BinProcessor& proc)
{
if(!proc.mandatory<DbOrParamQry>())
DbOrParamQry param(1);
if(!proc.mandatory(param))
{
return false;
}
proc.repeated<Parenthesis_DBQUERY_3>(0, 0);
int count = proc.repeated<Parenthesis_DBQUERY_3>(0, 0);
return true;
};
};
@ -105,8 +109,11 @@ public:
{
return false;
}
proc.repeated<SXString>(0, 0);
int count = proc.repeated<SXString>(0, 0);
proc.optional<Parenthesis_DBQUERY_2>();
return true;
};
};
@ -117,20 +124,126 @@ BaseObjectPtr DBQUERY::clone()
return BaseObjectPtr(new DBQUERY(*this));
}
// DBQUERY = DbOrParamQry [1*SXString [DbOrParamQry *(SXString DbOrParamQry)]] *SXString
const bool DBQUERY::loadContent(BinProcessor& proc)
{
global_info = proc.getGlobalWorkbookInfo();
if(!proc.mandatory<DbOrParamQry>())
{
return false;
}
proc.optional<Parenthesis_DBQUERY_1>();
proc.repeated<SXString>(0, 0);
m_DbQry = elements_.front(); elements_.pop_front();
proc.optional<Parenthesis_DBQUERY_1>();
while(!elements_.empty())
{
SXString* str = dynamic_cast<SXString*>(elements_.front().get());
if (!str)
{
m_DbParam = elements_.front(); elements_.pop_front();
break;
}
m_arSXString.push_back(str->value());
elements_.pop_front();
}
while(!elements_.empty())
{
SXString* str = dynamic_cast<SXString*>(elements_.front().get());
if (str)
{
_DbParam a;
a.string = str->value();
m_arParams.push_back(a);
}
else
{
DbOrParamQry* param = dynamic_cast<DbOrParamQry*>(elements_.front().get());
if (param)
{
m_arParams.back().param = elements_.front();
}
}
elements_.pop_front();
}
int count = proc.repeated<SXString>(0, 0);
while(!elements_.empty())
{
SXString* str = dynamic_cast<SXString*>(elements_.front().get());
if (str)
{
m_arSXString.push_back(str->value());
}
elements_.pop_front();
}
return true;
}
int DBQUERY::serialize(std::wostream & strm)
{
connectionId = ++global_info->connectionId;
CP_XML_WRITER(strm)
{
CP_XML_NODE(L"cacheSource")
{
CP_XML_ATTR(L"type", L"external");
CP_XML_ATTR(L"connectionId", connectionId); //connectionId in connections(root)
}
}
serialize_connection(global_info->connections_stream);
return 0;
}
int DBQUERY::serialize_connection(std::wostream & strm)
{
DbOrParamQry* queryOrParam = dynamic_cast<DbOrParamQry*>(m_DbQry.get());
if (!queryOrParam) return 0;
CP_XML_WRITER(strm)
{
CP_XML_NODE(L"connection")
{
CP_XML_ATTR(L"id", 1); //connectionId in connections(root)
CP_XML_ATTR(L"name", L"Connection");
CP_XML_ATTR(L"type", queryOrParam->query.dbt);
//switch(queryOrParam->query.dbt)
//{
// case 0x1: CP_XML_ATTR(L"type", 1); break;
// case 0x2:
// case 0x3:
// case 0x4:
// case 0x5:
// case 0x6:
// case 0x7:
//}
if (queryOrParam->query.fSavePwd) CP_XML_ATTR(L"savePassword", 1);
if (queryOrParam->query.fSavePwd) CP_XML_ATTR(L"refreshedVersion", 1);
int index = 0;
CP_XML_NODE(L"dbPr")
{
if (index < m_arSXString.size())
{
CP_XML_ATTR(L"command", m_arSXString[index]);
}
index++;
if (index < m_arSXString.size())
{
CP_XML_ATTR(L"connection", m_arSXString[index]);
}
index++;
}
}
}
return 0;
}
} // namespace XLS

View File

@ -35,9 +35,12 @@
namespace XLS
{
struct _DbParam
{
std::wstring string;
BaseObjectPtr param;
};
// Logical representation of DBQUERY union of records
class DBQUERY: public CompositeObject
{
BASE_OBJECT_DEFINE_CLASS_NAME(DBQUERY)
@ -49,6 +52,18 @@ public:
virtual const bool loadContent(BinProcessor& proc);
int serialize(std::wostream & stream);
int serialize_connection(std::wostream & strm);
BaseObjectPtr m_DbQry;
BaseObjectPtr m_DbParam;
std::vector<_DbParam> m_arParams;
std::vector<std::wstring> m_arSXString;
//------------------------------------------------------
GlobalWorkbookInfoPtr global_info;
int connectionId;
};
} // namespace XLS

View File

@ -36,8 +36,6 @@
namespace XLS
{
// Logical representation of DBQUERYEXT union of records
class DBQUERYEXT: public CompositeObject
{
BASE_OBJECT_DEFINE_CLASS_NAME(DBQUERYEXT)
@ -49,6 +47,11 @@ public:
virtual const bool loadContent(BinProcessor& proc);
BaseObjectPtr m_TxtQry;
BaseObjectPtr m_DBQueryExt;
BaseObjectPtr m_ExtString;
std::vector<BaseObjectPtr> m_arExtString;
};
} // namespace XLS

View File

@ -31,10 +31,11 @@
*/
#include "DBQUERYEXT.h"
#include <Logic/Biff_records/DBQueryExt.h>
#include <Logic/Biff_records/ExtString.h>
#include <Logic/Biff_records/OleDbConn.h>
#include <Logic/Biff_records/TxtQry.h>
#include "../Biff_records/DBQueryExt.h"
#include "../Biff_records/ExtString.h"
#include "../Biff_records/OleDbConn.h"
#include "../Biff_records/TxtQry.h"
namespace XLS
{
@ -84,11 +85,30 @@ const bool DBQUERYEXT::loadContent(BinProcessor& proc)
{
return false;
}
proc.optional<ExtString>();
proc.repeated<Parenthesis_DBQUERYEXT_1>(0, 4);
m_DBQueryExt = elements_.back();
elements_.pop_back();
if (proc.optional<ExtString>())
{
m_ExtString = elements_.back();
elements_.pop_back();
}
int count = proc.repeated<Parenthesis_DBQUERYEXT_1>(0, 4);
//....
if(proc.optional<TxtQry>())
{
proc.repeated<ExtString>(0, 0);
m_TxtQry = elements_.back();
elements_.pop_back();
int count = proc.repeated<ExtString>(0, 0);
while(count--)
{
m_arExtString.insert(m_arExtString.begin(), elements_.back());
elements_.pop_back();
}
}
return true;

View File

@ -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*/
switch(bin->nBuiltin)
{
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*/
{
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)

View File

@ -79,6 +79,7 @@ FDB::FDB()
bNumber = false;
bEmpty = false;
bInteger = false;
bBool = false;
}
FDB::~FDB()
@ -96,6 +97,8 @@ BaseObjectPtr FDB::clone()
const bool FDB::loadContent(BinProcessor& proc)
{
global_info = proc.getGlobalWorkbookInfo();
if(!proc.mandatory<SXFDB>())
{
return false;
@ -166,6 +169,7 @@ const bool FDB::loadContent(BinProcessor& proc)
bNumber |= operatr->bNumber;
bEmpty |= operatr->bEmpty;
bInteger|= operatr->bInteger;
bBool |= operatr->bBool;
}
return true;
@ -177,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)
{
@ -187,6 +193,7 @@ int FDB::serialize(std::wostream & strm)
if (fdb_type->wTypeSql > 0)
{
CP_XML_ATTR(L"numFmtId", fdb_type->wTypeSql);
//CP_XML_ATTR(L"sqlType", fdb_type->wTypeSql); //in db
}
if (m_arSRCSXOPER.empty() && m_arGRPSXOPER.empty() == false)
{
@ -211,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)
@ -249,15 +258,17 @@ int FDB::serialize(std::wostream & strm)
{
CP_XML_ATTR(L"containsMixedTypes", 1);
}
else if (!bEmpty && !bString)
else if (!bEmpty && !bString && !bBool)
{
CP_XML_ATTR(L"containsSemiMixedTypes", 0);
}
if (bNumber) CP_XML_ATTR(L"containsNumber", 1);
if (bDate) CP_XML_ATTR(L"containsDate", 1);
if (!bString) CP_XML_ATTR(L"containsString", 0);
if (bEmpty) CP_XML_ATTR(L"containsBlank", 1);
if (bInteger) CP_XML_ATTR(L"containsInteger", 1);
if (!bString && (bInteger || bDate || bNumber || bEmpty))
CP_XML_ATTR(L"containsString", 0);
if (fdb->fnumMinMaxValid)
{

View File

@ -65,7 +65,9 @@ public:
bool bNumber;
bool bEmpty;
bool bInteger;
bool bBool;
GlobalWorkbookInfoPtr global_info;
};
} // namespace XLS

View File

@ -62,6 +62,9 @@ const bool PIVOTCACHE::loadContent(BinProcessor& proc)
{
GlobalWorkbookInfoPtr global_info = proc.getGlobalWorkbookInfo();
global_info->arPivotCacheFieldShortSize.clear();
global_info->arPivotCacheFields.clear();
if(!proc.mandatory<SXDB>())
{
return false;
@ -95,14 +98,8 @@ const bool PIVOTCACHE::loadContent(BinProcessor& proc)
DBB* dbb = dynamic_cast<DBB*>(m_arDBB.back().get());
if (global_info->arCacheFieldShortSize.size() >= m_arDBB.size())
{
dbb->fShortIitms = global_info->arCacheFieldShortSize[m_arDBB.size() - 1];
}
else
{
//???? группы??
}
dbb->arPivotCacheFieldShortSize = global_info->arPivotCacheFieldShortSize;
dbb->arPivotCacheFields = global_info->arPivotCacheFields;
}
if (proc.optional<EOF_T>())
{

View File

@ -55,6 +55,8 @@ public:
std::vector<BaseObjectPtr> m_arFDB;
std::vector<BaseObjectPtr> m_arDBB;
std::vector<bool> m_arAllAtoms;
};
} // namespace XLS

View File

@ -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;
@ -139,7 +144,18 @@ int PIVOTCACHEDEFINITION::serialize_definitions(std::wostream & strm)
}
}
}
if (pivot_cache->m_arSXFORMULA.empty() == false)
{
CP_XML_NODE(L"calculatedItems")
{
CP_XML_ATTR(L"count", pivot_cache->m_arSXFORMULA.size());
for (size_t i = 0; i < pivot_cache->m_arSXFORMULA.size(); i++)
{
pivot_cache->m_arSXFORMULA[i]->serialize(CP_XML_STREAM());
}
}
}
}
}
return 0;

View File

@ -66,6 +66,8 @@ const bool PIVOTCORE::loadContent(BinProcessor& proc)
m_SxView = elements_.back();
elements_.pop_back();
SxView* sxView = dynamic_cast<SxView*>(m_SxView.get());
int count = 0;
count = proc.repeated<PIVOTVD>(0, 0);
@ -90,12 +92,21 @@ const bool PIVOTCORE::loadContent(BinProcessor& proc)
{
m_arSXDI.push_back(elements_.front()); elements_.pop_front();
}
count = proc.repeated<PIVOTLI>(0, 0);
while(count--)
PIVOTLI rwLines(sxView->cDimRw);
if (proc.optional(rwLines))
{
m_arPIVOTLI.push_back(elements_.front()); elements_.pop_front();
}
PIVOTLI colLines(sxView->cDimCol);
if (proc.optional(colLines))
{
m_arPIVOTLI.push_back(elements_.front()); elements_.pop_front();
}
//count = proc.repeated<PIVOTLI>(0, 0);
//while(count--)
//{
// m_arPIVOTLI.push_back(elements_.front()); elements_.pop_front();
//}
if (proc.mandatory<PIVOTEX>())
{

View File

@ -38,8 +38,9 @@
namespace XLS
{
PIVOTLI::PIVOTLI()
PIVOTLI::PIVOTLI(int count_lines_)
{
count_lines = count_lines_;
}
PIVOTLI::~PIVOTLI()
@ -54,7 +55,9 @@ BaseObjectPtr PIVOTLI::clone()
// PIVOTLI = SXLI *Continue
const bool PIVOTLI::loadContent(BinProcessor& proc)
{
if(!proc.mandatory<SXLI>())
SXLI sx_line(count_lines);
if(!proc.mandatory(sx_line))
{
return false;
}
@ -110,6 +113,7 @@ int PIVOTLI::serialize(std::wostream & strm)
}
}
}
return 0;
}
} // namespace XLS

View File

@ -40,7 +40,7 @@ class PIVOTLI: public CompositeObject
{
BASE_OBJECT_DEFINE_CLASS_NAME(PIVOTLI)
public:
PIVOTLI();
PIVOTLI(int count_lines_);
~PIVOTLI();
BaseObjectPtr clone();
@ -52,6 +52,8 @@ public:
static const ElementType type = typePIVOTLI;
BaseObjectPtr m_SXLI;
int count_lines;
};
} // namespace XLS

View File

@ -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)
{

View File

@ -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);
}

View File

@ -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;
}

View File

@ -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

View File

@ -38,6 +38,28 @@
namespace XLS
{
// (SxName *SXPair)
class Parenthesis_SXFMLA: public ABNFParenthesis
{
BASE_OBJECT_DEFINE_CLASS_NAME(Parenthesis_SXFMLA)
public:
BaseObjectPtr clone()
{
return BaseObjectPtr(new Parenthesis_SXFMLA(*this));
}
const bool loadContent(BinProcessor& proc)
{
if(!proc.mandatory<SxName>())
{
return false;
}
int count = proc.repeated<SXPair>(0, 0);
return true;
};
};
SXFMLA::SXFMLA()
{
@ -57,6 +79,8 @@ BaseObjectPtr SXFMLA::clone()
// SXFMLA = SxFmla *(SxName *SXPair)
const bool SXFMLA::loadContent(BinProcessor& proc)
{
global_info = proc.getGlobalWorkbookInfo();
if(!proc.mandatory<SxFmla>())
{
return false;
@ -64,8 +88,48 @@ const bool SXFMLA::loadContent(BinProcessor& proc)
m_SxFmla = elements_.back();
elements_.pop_back();
int count = proc.repeated<Parenthesis_SXFMLA>(0, 0);
while(!elements_.empty())
{
if (dynamic_cast<SxName*>(elements_.front().get()))
{
_sx_name sx_name;
sx_name.name = elements_.front(); elements_.pop_front();
m_arPivotSxNames.push_back(sx_name);
}
else
{
while(!elements_.empty())
{
if (dynamic_cast<SxName*>(elements_.front().get()))
{
break;
}
else
{
m_arPivotSxNames.back().pair.push_back(elements_.front());
elements_.pop_front();
}
}
}
}
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

View File

@ -40,16 +40,22 @@ class SXFMLA: public CompositeObject
{
BASE_OBJECT_DEFINE_CLASS_NAME(SXFMLA)
public:
SXFMLA();
~SXFMLA();
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;
BaseObjectPtr m_SxFmla;
std::vector<_sx_name> m_arPivotSxNames;
//-------------------------------------------------------------------------
GlobalWorkbookInfoPtr global_info;
};
} // namespace XLS

View File

@ -34,7 +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
{
@ -56,6 +64,8 @@ BaseObjectPtr SXFORMULA::clone()
// SXFORMULA = SXFMLA PIVOTRULE SXFormula
const bool SXFORMULA::loadContent(BinProcessor& proc)
{
global_info = proc.getGlobalWorkbookInfo();
if(!proc.mandatory<SXFMLA>())
{
return false;
@ -74,6 +84,60 @@ const bool SXFORMULA::loadContent(BinProcessor& proc)
elements_.pop_back();
} return true;
}
int SXFORMULA::serialize(std::wostream & strm)
{
SXFMLA* fmla = dynamic_cast<SXFMLA*>(m_SXFMLA.get());
if (!fmla) return 0;
PIVOTRULE* pivot_rule = dynamic_cast<PIVOTRULE*>(m_PIVOTRULE.get());
CP_XML_WRITER(strm)
{
CP_XML_NODE(L"calculatedItem")
{
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;
}
} // namespace XLS

View File

@ -47,11 +47,15 @@ public:
virtual const bool loadContent(BinProcessor& proc);
int serialize(std::wostream & stream);
static const ElementType type = typeSXFORMULA;
BaseObjectPtr m_SXFMLA;
BaseObjectPtr m_PIVOTRULE;
BaseObjectPtr m_SXFormula;
GlobalWorkbookInfoPtr global_info;
};
} // namespace XLS

View File

@ -48,6 +48,7 @@ SXOPER::SXOPER()
bNumber = false;
bEmpty = false;
bInteger= false;
bBool = false;
}
SXOPER::~SXOPER()
@ -81,7 +82,7 @@ const bool SXOPER::loadContent(BinProcessor& proc)
}
else if(proc.optional<SxBool>())
{
bNumber = true;
bBool = true;
}
else if(proc.optional<SxErr>())
{
@ -110,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

View File

@ -49,6 +49,8 @@ public:
int serialize(std::wostream & strm);
std::wstring get_value();
static const ElementType type = typeSXOPER;
BaseObjectPtr m_element;
@ -58,6 +60,7 @@ public:
bool bNumber;
bool bEmpty;
bool bInteger;
bool bBool;
};
} // namespace XLS

View File

@ -54,7 +54,6 @@ BaseObjectPtr SXSRC::clone()
return BaseObjectPtr(new SXSRC(*this));
}
// SXSRC = DREF / SXTBL / DBQUERY
const bool SXSRC::loadContent(BinProcessor& proc)
{

View File

@ -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

View File

@ -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

View File

@ -31,11 +31,12 @@
*/
#include "XFS.h"
#include <Logic/Biff_records/XF.h>
#include <Logic/Biff_records/XFCRC.h>
#include <Logic/Biff_records/XFExt.h>
#include <Logic/Biff_structures/ExtProp.h>
#include "../Biff_records/XF.h"
#include "../Biff_records/XFCRC.h"
#include "../Biff_records/XFExt.h"
#include "../Biff_structures/ExtProp.h"
namespace XLS
{

View File

@ -114,8 +114,12 @@ GlobalWorkbookInfo::GlobalWorkbookInfo(const unsigned short code_page, XlsConver
cellStyleXfs_count = 0;
cellStyleDxfs_count = 0;
connectionId = 0;
defaultDigitFontSize = std::pair<float, float>(0, 0);
applicationFonts = NULL;
idPivotCache = 0;
}
GlobalWorkbookInfo::~GlobalWorkbookInfo()

View File

@ -60,6 +60,13 @@ static const std::wstring DefaultPalette[] = {
L"00003366", L"00339966", L"00003300", L"00333300", L"00993300", L"00993366", L"00333399", L"00333333"
};
struct _sx_name
{
BaseObjectPtr name;
std::vector<BaseObjectPtr> pair;
};
class GlobalWorkbookInfo
{
public:
@ -75,7 +82,6 @@ public:
unsigned int GenerateAXESId();
unsigned short CodePage;
CRYPT::DecryptorPtr decryptor;
std::wstring password;
@ -99,8 +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> arCacheFieldShortSize;
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;
@ -134,6 +146,9 @@ public:
int cellStyleDxfs_count;
std::wstringstream users_Dxfs_stream;
std::wstringstream connections_stream;
int connectionId;
XlsConverter *xls_converter;

View File

@ -218,7 +218,6 @@ XlsConverter::XlsConverter(const std::wstring & xls_file, const std::wstring & _
xls_global_info->mapPivotCache.insert(std::make_pair(index, pivot_cache));
}
}
}
catch(...)
{
@ -533,6 +532,7 @@ void XlsConverter::convert(XLS::GlobalsSubstream* global)
{
convert((XLS::PIVOTCACHEDEFINITION*)global->m_arPIVOTCACHEDEFINITION[i].get());
}
xlsx_context->get_pivots_context().add_connections(xls_global_info->connections_stream.str());
}
typedef boost::unordered_map<XLS::FillInfo, int> mapFillInfo;

View File

@ -293,8 +293,14 @@ void xlsx_conversion_context::end_document()
output_document_->get_xl_files().add_pivot_table(content);
}
}
}
if (xlsx_pivots_context_.is_connections())
{
std::wstringstream strm;
xlsx_pivots_context_.write_connections_to(strm);
output_document_->get_xl_files().set_connections( package::simple_element::create(L"connections.xml", strm.str()) );
}
}
output_document_->get_xl_files().set_workbook( package::simple_element::create(L"workbook.xml", strm_workbook.str()) );
output_document_->content_type().set_media(get_mediaitems());
@ -307,10 +313,8 @@ void xlsx_conversion_context::end_document()
output_document_->get_xl_files().set_vml_drawings(drawings_vml);
package::xl_comments_ptr comments = package::xl_comments::create(xlsx_comments_context_handle_.content());
output_document_->get_xl_files().set_comments(comments);
output_document_->get_xl_files().set_comments(comments);
}
}
}

View File

@ -53,7 +53,6 @@ xlsx_content_types_file::xlsx_content_types_file()
content_type_.add_override(L"/_rels/.rels", L"application/vnd.openxmlformats-package.relationships+xml");
content_type_.add_override(L"/xl/_rels/workbook.xml.rels", L"application/vnd.openxmlformats-package.relationships+xml");
content_type_.add_override(L"/xl/sharedStrings.xml", L"application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml");
content_type_.add_override(L"/xl/workbook.xml", L"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml");
content_type_.add_override(L"/xl/styles.xml", L"application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml");
content_type_.add_override(L"/docProps/app.xml", L"application/vnd.openxmlformats-officedocument.extended-properties+xml");
@ -194,7 +193,19 @@ void xl_files::write(const std::wstring & RootPath)
{
sharedStrings_->write(path);
rels_files_.add( relationship( L"shId1", L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings", L"sharedStrings.xml" ) );
}
content_type & contentTypes = this->get_main_document()->content_type().get_content_type();
contentTypes.add_override(L"/xl/sharedStrings.xml", L"application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml");
}
if (connections_)
{
connections_->write(path);
rels_files_.add( relationship( L"cnId1", L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/connections", L"connections.xml" ) );
content_type & contentTypes = this->get_main_document()->content_type().get_content_type();
contentTypes.add_override(L"/xl/connections.xml", L"application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml");
}
if (styles_)
{
@ -255,6 +266,10 @@ void xl_files::set_sharedStrings(element_ptr Element)
{
sharedStrings_ = Element;
}
void xl_files::set_connections(element_ptr Element)
{
connections_ = Element;
}
void xl_files::add_sheet(sheet_content_ptr sheet)
{

View File

@ -223,6 +223,7 @@ public:
void set_workbook (element_ptr Element);
void set_styles (element_ptr Element);
void set_sharedStrings (element_ptr Element);
void set_connections (element_ptr Element);
void add_sheet (sheet_content_ptr sheet);
void set_media (external_items & _Mediaitems);
void set_drawings (element_ptr Element);
@ -241,6 +242,7 @@ private:
element_ptr theme_;
element_ptr workbook_;
element_ptr connections_;
element_ptr styles_;
element_ptr sharedStrings_;
element_ptr media_;

View File

@ -54,6 +54,7 @@ public:
std::vector<_pivot_cache> caches_;
std::vector<_pivot_view> views_;
std::wstring connections_;
};
xlsx_pivots_context::xlsx_pivots_context() : impl_(new xlsx_pivots_context::Impl())
@ -70,7 +71,10 @@ int xlsx_pivots_context::get_cache_count()
{
return (int)impl_->caches_.size();
}
bool xlsx_pivots_context::is_connections()
{
return !impl_->connections_.empty();
}
void xlsx_pivots_context::dump_rels_cache(int index, rels & Rels)
{
if (impl_->caches_[index].recordsData_.empty() == false)
@ -93,6 +97,18 @@ void xlsx_pivots_context::write_cache_definitions_to(int index, std::wostream &
{
strm << impl_->caches_[index].definitionsData_;
}
void xlsx_pivots_context::write_connections_to(std::wostream & strm)
{
CP_XML_WRITER(strm)
{
CP_XML_NODE(L"connections")
{
CP_XML_ATTR(L"xmlns", L"http://schemas.openxmlformats.org/spreadsheetml/2006/main");
CP_XML_STREAM() << impl_->connections_;
}
}
}
void xlsx_pivots_context::write_cache_records_to(int index, std::wostream & strm)
{
@ -112,6 +128,13 @@ int xlsx_pivots_context::add_view(std::wstring table_view, int indexCache)
return (int)impl_->views_.size();
}
void xlsx_pivots_context::add_connections(std::wstring connections)
{
if (connections.empty()) return;
impl_->connections_ = connections;
}
int xlsx_pivots_context::get_view_count()
{
return (int)impl_->views_.size();

View File

@ -51,11 +51,16 @@ public:
void write_cache_definitions_to (int index, std::wostream & strm);
void write_cache_records_to (int index, std::wostream & strm);
void write_connections_to (std::wostream & strm);
void write_table_view_to (int index, std::wostream & strm);
void dump_rels_cache(int index, rels & Rels);
void dump_rels_view (int index, rels & Rels);
void add_connections(std::wstring connections);
bool is_connections();
private:
class Impl;
_CP_PTR(Impl) impl_;

File diff suppressed because one or more lines are too long