diff --git a/ASCOfficeDocxFile2/BinReader/ReaderClasses.h b/ASCOfficeDocxFile2/BinReader/ReaderClasses.h index d12d2aed07..306ca428f1 100644 --- a/ASCOfficeDocxFile2/BinReader/ReaderClasses.h +++ b/ASCOfficeDocxFile2/BinReader/ReaderClasses.h @@ -2297,6 +2297,8 @@ public: std::wstring Layout; std::wstring tblPrChange; std::wstring TableCellSpacing; + std::wstring Caption; + std::wstring Description; bool IsEmpty() { return Jc.empty() && TableInd.empty() && TableW.empty() && TableCellMar.empty() && TableBorders.empty() && Shd.empty() && tblpPr.empty()&& Style.empty() && Look.empty() && tblPrChange.empty() && TableCellSpacing.empty() && RowBandSize.empty() && ColBandSize.empty(); @@ -2336,8 +2338,20 @@ public: sRes += (TableCellMar); if(false == Look.empty()) sRes += (Look); + if(!Caption.empty()) + { + sRes += L""; + } + if(!Description.empty()) + { + sRes += L""; + } if(!tblPrChange.empty()) - sRes += (tblPrChange); + sRes += (tblPrChange); sRes += L""; return sRes; } diff --git a/ASCOfficeDocxFile2/BinReader/Readers.h b/ASCOfficeDocxFile2/BinReader/Readers.h index 8aa31e3e10..fff01a6af5 100644 --- a/ASCOfficeDocxFile2/BinReader/Readers.h +++ b/ASCOfficeDocxFile2/BinReader/Readers.h @@ -1760,6 +1760,14 @@ public: long nSpacing = SerializeCommon::Round( g_dKoef_mm_to_twips * dSpacing); pWiterTblPr->TableCellSpacing = L""; } + else if( c_oSerProp_tblPrType::tblCaption == type ) + { + pWiterTblPr->Caption = m_oBufferedStream.GetString3(length); + } + else if( c_oSerProp_tblPrType::tblDescription == type ) + { + pWiterTblPr->Description = m_oBufferedStream.GetString3(length); + } else res = c_oSerConstants::ReadUnknown; return res; diff --git a/ASCOfficeDocxFile2/BinWriter/BinReaderWriterDefines.h b/ASCOfficeDocxFile2/BinWriter/BinReaderWriterDefines.h index 2bbb37945f..92cdc830a7 100644 --- a/ASCOfficeDocxFile2/BinWriter/BinReaderWriterDefines.h +++ b/ASCOfficeDocxFile2/BinWriter/BinReaderWriterDefines.h @@ -288,7 +288,9 @@ extern int g_nCurFormatVersion; tblPrChange = 13, TableCellSpacing = 14, RowBandSize = 15, - ColBandSize = 16 + ColBandSize = 16, + tblCaption = 17, + tblDescription = 18 };} namespace c_oSer_tblpPrType{enum c_oSer_tblpPrType { diff --git a/ASCOfficeDocxFile2/BinWriter/BinWriters.h b/ASCOfficeDocxFile2/BinWriter/BinWriters.h index 5ce411d90f..d6fca1876c 100644 --- a/ASCOfficeDocxFile2/BinWriter/BinWriters.h +++ b/ASCOfficeDocxFile2/BinWriter/BinWriters.h @@ -1846,6 +1846,16 @@ namespace BinDocxRW m_oBcw.WriteItemEnd(nCurPos); } } + if(tblPr.m_oTblCaption.IsInit()) + { + m_oBcw.m_oStream.WriteBYTE(c_oSerProp_tblPrType::tblCaption); + m_oBcw.m_oStream.WriteStringW(tblPr.m_oTblCaption->ToString2()); + } + if(tblPr.m_oTblDescription.IsInit()) + { + m_oBcw.m_oStream.WriteBYTE(c_oSerProp_tblPrType::tblDescription); + m_oBcw.m_oStream.WriteStringW(tblPr.m_oTblDescription->ToString2()); + } } void WriteTblMar(const OOX::Logic::CTblCellMar& cellMar) { diff --git a/Common/DocxFormat/Source/DocxFormat/Drawing/DrawingExt.cpp b/Common/DocxFormat/Source/DocxFormat/Drawing/DrawingExt.cpp index d4604ce080..04eab7255c 100644 --- a/Common/DocxFormat/Source/DocxFormat/Drawing/DrawingExt.cpp +++ b/Common/DocxFormat/Source/DocxFormat/Drawing/DrawingExt.cpp @@ -31,6 +31,7 @@ */ #include "DrawingExt.h" #include "../../XlsxFormat/Worksheets/Sparkline.h" +#include "../../XlsxFormat/Table/Table.h" #include "../Diagram/DiagramData.h" namespace OOX @@ -43,6 +44,7 @@ namespace OOX if ((m_sUri.IsInit()) && (*m_sUri == L"{63B3BB69-23CF-44E3-9099-C40C66FF867C}" || *m_sUri == L"{05C60535-1F16-4fd2-B633-F4F36F0B64E0}" || + *m_sUri == L"{504A1905-F514-4f6f-8877-14C23A59335A}" || *m_sUri == L"http://schemas.microsoft.com/office/drawing/2008/diagram")) { int nCurDepth = oReader.GetDepth(); @@ -61,6 +63,10 @@ namespace OOX { m_oDataModelExt = oReader; } + else if (sName == _T("table")) + { + m_oAltTextTable = oReader; + } } } else @@ -99,6 +105,12 @@ namespace OOX m_oSparklineGroups->toXML(writer); sResult += writer.GetData().c_str(); } + if(m_oAltTextTable.IsInit()) + { + NSStringUtils::CStringBuilder writer; + m_oAltTextTable->toXML(writer); + sResult += writer.GetData().c_str(); + } sResult += _T(" m_oCompatExt; nullable m_oSparklineGroups; nullable m_oDataModelExt; + nullable m_oAltTextTable; }; //-------------------------------------------------------------------------------- // COfficeArtExtensionList 20.1.2.2.15 (Part 1) diff --git a/Common/DocxFormat/Source/XlsxFormat/Table/Table.h b/Common/DocxFormat/Source/XlsxFormat/Table/Table.h index 956ee2a13c..31916f5074 100644 --- a/Common/DocxFormat/Source/XlsxFormat/Table/Table.h +++ b/Common/DocxFormat/Source/XlsxFormat/Table/Table.h @@ -41,6 +41,57 @@ namespace OOX { namespace Spreadsheet { + class CAltTextTable : public WritingElement + { + public: + WritingElementSpreadsheet_AdditionConstructors(CAltTextTable) + CAltTextTable() + { + } + virtual ~CAltTextTable() + { + } + + public: + virtual std::wstring toXML() const + { + return _T(""); + } + virtual void toXML(NSStringUtils::CStringBuilder& writer) const + { + writer.WriteString(L""); + } + virtual void fromXML(XmlUtils::CXmlLiteReader& oReader) + { + ReadAttributes( oReader ); + + if ( !oReader.IsEmptyNode() ) + oReader.ReadTillEnd(); + } + + virtual EElementType getType () const + { + return et_AltTextTable; + } + + private: + void ReadAttributes(XmlUtils::CXmlLiteReader& oReader) + { + // Читаем атрибуты + WritingElement_ReadAttributes_Start( oReader ) + + WritingElement_ReadAttributes_Read_if ( oReader, _T("altText"), m_oAltText ) + WritingElement_ReadAttributes_Read_if ( oReader, _T("altTextSummary"), m_oAltTextSummary ) + + WritingElement_ReadAttributes_End( oReader ) + } + public: + nullable m_oAltText; + nullable m_oAltTextSummary; + }; class CTableStyleInfo : public WritingElement { public: @@ -315,7 +366,10 @@ namespace OOX m_oTableColumns->toXML(writer); if(m_oTableStyleInfo.IsInit()) m_oTableStyleInfo->toXML(writer); - + if(m_oExtLst.IsInit()) + { + writer.WriteString(m_oExtLst->toXMLWithNS(_T(""))); + } writer.WriteString(L""); } } @@ -339,6 +393,8 @@ namespace OOX m_oTableColumns = oReader; else if ( _T("tableStyleInfo") == sName ) m_oTableStyleInfo = oReader; + else if (_T("extLst") == sName) + m_oExtLst = oReader; } } @@ -372,6 +428,8 @@ namespace OOX nullable m_oSortState; nullable m_oTableColumns; nullable m_oTableStyleInfo; + + nullable m_oExtLst; }; class CTablePart : public WritingElement { diff --git a/Common/DocxFormat/Source/XlsxFormat/WritingElement.h b/Common/DocxFormat/Source/XlsxFormat/WritingElement.h index 07c70a286d..98206b65cc 100644 --- a/Common/DocxFormat/Source/XlsxFormat/WritingElement.h +++ b/Common/DocxFormat/Source/XlsxFormat/WritingElement.h @@ -385,6 +385,7 @@ namespace Spreadsheet et_TableColumns, et_TableColumn, et_TableStyleInfo, + et_AltTextTable, et_SortState, et_SortCondition, et_Autofilter, diff --git a/XlsxSerializerCom/Common/BinReaderWriterDefines.h b/XlsxSerializerCom/Common/BinReaderWriterDefines.h index 37527e38d2..2a1b93996a 100644 --- a/XlsxSerializerCom/Common/BinReaderWriterDefines.h +++ b/XlsxSerializerCom/Common/BinReaderWriterDefines.h @@ -494,7 +494,8 @@ namespace BinXlsxRW SortState = 5, TableColumns = 6, TableStyleInfo = 7, - HeaderRowCount = 8 + HeaderRowCount = 8, + AltTextTable = 9 };} namespace c_oSer_TableStyleInfo{enum c_oSer_TableStyleInfo { @@ -801,6 +802,11 @@ namespace BinXlsxRW SparklineRef = 29, SparklineSqRef = 30 };} + namespace c_oSer_AltTextTable{enum c_oSer_AltTextTable + { + AltText = 0, + AltTextSummary = 1 + };} } #endif // diff --git a/XlsxSerializerCom/Reader/BinaryWriter.h b/XlsxSerializerCom/Reader/BinaryWriter.h index 48a4833a23..3f81380b4d 100644 --- a/XlsxSerializerCom/Reader/BinaryWriter.h +++ b/XlsxSerializerCom/Reader/BinaryWriter.h @@ -145,6 +145,33 @@ namespace BinXlsxRW { WriteTableStyleInfo(oTable.m_oTableStyleInfo.get()); m_oBcw.WriteItemEnd(nCurPos); } + if(oTable.m_oExtLst.IsInit()) + { + for(size_t i = 0; i < oTable.m_oExtLst->m_arrExt.size(); ++i) + { + OOX::Drawing::COfficeArtExtension* pExt = oTable.m_oExtLst->m_arrExt[i]; + if(pExt->m_oAltTextTable.IsInit()) + { + nCurPos = m_oBcw.WriteItemStart(c_oSer_TablePart::AltTextTable); + WriteAltTextTable(pExt->m_oAltTextTable.get()); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + } + } + } + void WriteAltTextTable(const OOX::Spreadsheet::CAltTextTable& oAltTextTable) + { + int nCurPos = 0; + if(oAltTextTable.m_oAltText.IsInit()) + { + m_oBcw.m_oStream.WriteBYTE(c_oSer_AltTextTable::AltText); + m_oBcw.m_oStream.WriteStringW(oAltTextTable.m_oAltText.get()); + } + if(oAltTextTable.m_oAltTextSummary.IsInit()) + { + m_oBcw.m_oStream.WriteBYTE(c_oSer_AltTextTable::AltTextSummary); + m_oBcw.m_oStream.WriteStringW(oAltTextTable.m_oAltTextSummary.get()); + } } void WriteAutoFilter(const OOX::Spreadsheet::CAutofilter& oAutofilter) { diff --git a/XlsxSerializerCom/Writer/BinaryReader.h b/XlsxSerializerCom/Writer/BinaryReader.h index 385e90256c..39b10e417b 100644 --- a/XlsxSerializerCom/Writer/BinaryReader.h +++ b/XlsxSerializerCom/Writer/BinaryReader.h @@ -192,6 +192,37 @@ namespace BinXlsxRW { pTable->m_oTableStyleInfo.Init(); res = Read2(length, &BinaryTableReader::ReadTableStyleInfo, this, pTable->m_oTableStyleInfo.GetPointer()); } + else if(c_oSer_TablePart::AltTextTable == type) + { + OOX::Drawing::COfficeArtExtension* pOfficeArtExtension = new OOX::Drawing::COfficeArtExtension(); + pOfficeArtExtension->m_oAltTextTable.Init(); + + res = Read1(length, &BinaryTableReader::ReadAltTextTable, this, pOfficeArtExtension->m_oAltTextTable.GetPointer()); + + pOfficeArtExtension->m_sUri.Init(); + pOfficeArtExtension->m_sUri->append(_T("{504A1905-F514-4f6f-8877-14C23A59335A}")); + pOfficeArtExtension->m_sAdditionalNamespace = _T(" xmlns:x14=\"http://schemas.microsoft.com/office/spreadsheetml/2009/9/main\""); + pTable->m_oExtLst.Init(); + pTable->m_oExtLst->m_arrExt.push_back(pOfficeArtExtension); + } + else + res = c_oSerConstants::ReadUnknown; + return res; + } + int ReadAltTextTable(BYTE type, long length, void* poResult) + { + int res = c_oSerConstants::ReadOk; + OOX::Spreadsheet::CAltTextTable* pAltTextTable = static_cast(poResult); + if(c_oSer_AltTextTable::AltText == type) + { + pAltTextTable->m_oAltText.Init(); + pAltTextTable->m_oAltText->append(m_oBufferedStream.GetString3(length)); + } + else if(c_oSer_AltTextTable::AltTextSummary == type) + { + pAltTextTable->m_oAltTextSummary.Init(); + pAltTextTable->m_oAltTextSummary->append(m_oBufferedStream.GetString3(length)); + } else res = c_oSerConstants::ReadUnknown; return res;