mirror of
https://github.com/ONLYOFFICE/core.git
synced 2026-02-26 06:53:22 +08:00
Compare commits
5 Commits
v4.5.dev.4
...
core-linux
| Author | SHA1 | Date | |
|---|---|---|---|
| cf5458c761 | |||
| 9115edbd78 | |||
| 3f18f96171 | |||
| 8a75916944 | |||
| da45eb4f33 |
@ -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());
|
||||
|
||||
@ -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)
|
||||
{
|
||||
|
||||
@ -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.
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
@ -49,6 +49,8 @@ public:
|
||||
|
||||
void readFields(CFRecord& record);
|
||||
|
||||
std::wstring value();
|
||||
|
||||
int serialize(std::wostream & strm);
|
||||
|
||||
static const ElementType type = typeSXString;
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
@ -48,6 +48,8 @@ public:
|
||||
|
||||
void readFields(CFRecord& record);
|
||||
|
||||
int serialize(std::wostream & strm);
|
||||
|
||||
static const ElementType type = typeSxBool;
|
||||
|
||||
bool val;
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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;
|
||||
};
|
||||
|
||||
|
||||
@ -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
|
||||
{
|
||||
@ -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!");
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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)
|
||||
{
|
||||
|
||||
@ -65,7 +65,9 @@ public:
|
||||
bool bNumber;
|
||||
bool bEmpty;
|
||||
bool bInteger;
|
||||
bool bBool;
|
||||
|
||||
GlobalWorkbookInfoPtr global_info;
|
||||
};
|
||||
|
||||
} // namespace XLS
|
||||
|
||||
@ -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>())
|
||||
{
|
||||
|
||||
@ -55,6 +55,8 @@ public:
|
||||
std::vector<BaseObjectPtr> m_arFDB;
|
||||
std::vector<BaseObjectPtr> m_arDBB;
|
||||
|
||||
std::vector<bool> m_arAllAtoms;
|
||||
|
||||
};
|
||||
|
||||
} // 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;
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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>())
|
||||
{
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -54,7 +54,6 @@ BaseObjectPtr SXSRC::clone()
|
||||
return BaseObjectPtr(new SXSRC(*this));
|
||||
}
|
||||
|
||||
|
||||
// SXSRC = DREF / SXTBL / DBQUERY
|
||||
const bool SXSRC::loadContent(BinProcessor& proc)
|
||||
{
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
@ -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
|
||||
{
|
||||
|
||||
@ -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()
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -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)
|
||||
{
|
||||
|
||||
@ -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_;
|
||||
|
||||
@ -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();
|
||||
|
||||
@ -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
Reference in New Issue
Block a user