diff --git a/ExcelFile使用帮助.xlsx b/ExcelFile使用帮助.xlsx new file mode 100644 index 0000000..d7f24dd Binary files /dev/null and b/ExcelFile使用帮助.xlsx differ diff --git a/README.md b/README.md index 140b1d5..2ecf197 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,15 @@ # OfficePlugin -TSOffice 项目:纯 TSL 代码实现 excel、word 文件读写 \ No newline at end of file +TSOffice 项目:纯 TSL 代码实现 excel、word 文件读写 + +## 部署 + +### windows + +- [fmt_pubkrnl_plugin](./Windows-X64/fmt_pubkrnl_plugin.dll) 放入 tsl 安装根目录下 Plugin 文件夹 +- [office_plugin](./Windows-X64/office_plugin.dll) 放入 tsl 安装根目录下 Plugin 文件夹 +- [tsxlsx.dll](./Windows-X64/tsxlsx.dll) 放入 tsl 安装根目录 + +## 帮助文档 + +- [Excel 帮助文档](./ExcelFile%E4%BD%BF%E7%94%A8%E5%B8%AE%E5%8A%A9.xlsx) diff --git a/Windows-X64/fmt_pubkrnl_plugin.dll b/Windows-X64/fmt_pubkrnl_plugin.dll new file mode 100644 index 0000000..b24f990 Binary files /dev/null and b/Windows-X64/fmt_pubkrnl_plugin.dll differ diff --git a/Windows-X64/office_plugin.dll b/Windows-X64/office_plugin.dll new file mode 100644 index 0000000..d91d764 Binary files /dev/null and b/Windows-X64/office_plugin.dll differ diff --git a/Windows-X64/tsxlsx.dll b/Windows-X64/tsxlsx.dll new file mode 100644 index 0000000..4495967 Binary files /dev/null and b/Windows-X64/tsxlsx.dll differ diff --git a/funcext/TSOffice/TOfficeObj.tsf b/funcext/TSOffice/TOfficeObj.tsf new file mode 100644 index 0000000..38b46a3 --- /dev/null +++ b/funcext/TSOffice/TOfficeObj.tsf @@ -0,0 +1,4385 @@ +Function TOfficeObj(n); +Begin + case lowercase(n) of + "nodeinfo": + return new NodeInfo(""); + "tfont": + return new TFont(); + "tcomment": + return new TComment(); + "tcomments": + return new TComments(); + "trichtext": + return new TRichText(); + "txdrfromto": + return new TxdrFromTo(); + "toff": + return new TOff(); + "text": + return new TExt(); + "txfrm": + return new TXfrm(); + "tclientdata": + return new TClientData(); + "tgraphicframepr": + return new TGraphicFramePr(); + "tgraphicframe": + return new TGraphicFrame(); + "ttwocellanchor": + return new TtwoCellAnchor(); + "tchart": + return new TChart(); + "tlegend": + return new TLegend(); + "tplot": + return new TPlot(); + "tchartaxis": + return new TChartAxis(); + "tnumfont": + return new TNumFont(); + "tnamelayout": + return new TNameLayout(); + "tpt": + return new Tpt(); + "tstrcache": + return new TStrCache(); + "tstrref": + return new TStrRef(); + "tccat": + return new TcCat(); + "tnumcache": + return new TNumCache(); + "tnumref": + return new TNumRef(); + "tcval": + return new TcVal(); + "ttx": + return new TTx(); + "tsolidfill": + return new TSolidFill(); + "tschemeclr": + return new TSchemeClr(); + "tln": + return new TLn(); + "tcontourclr": + return new TContourClr(); + "tsp3d": + return new TSp3D(); + "tsppr": + return new TspPr(); + "tdpt": + return new TDpt(); + "tmarker": + return new TMarker(); + "tser": + return new TSer(); + "tdlbls": + return new TdLbls(); + "tccharts": + return new TcCharts(); + "tcscaling": + return new TcScaling(); + "tcchartlines": + return new TcChartLines(); + "tcnumfmt": + return new TcNumFmt(); + "tar": + return new TaR(); + "taendpararpr": + return new TaEndParaRPr(); + "tap": + return new TaP(); + "tappr": + return new TaPPr(); + "talatin": + return new TaLatin(); + "taea": + return new TaEa(); + "tacs": + return new TaCs(); + "tarpr": + return new TaRPr(); + "tabodypr": + return new TaBodyPr(); + "ttxpr": + return new TTxPr(); + "tcaxs": + return new TcAxs(); + "tplotarea": + return new TplotArea(); + "tview3d": + return new TView3D(); + "tborder": + return new TBorder(); + "tborders": + return new TBorders(); + "tnumfmts": + return new TNumFmts(); + "tfills": + return new TFills(); + "tpattern": + return new TPattern(); + "tgradient": + return new TGradient(); + "tstop0": + return new TStop0(); + "tstop1": + return new TStop1(); + "talignment": + return new TAlignment(); + "tprotection": + return new TProtection(); + "tstyle": + return new TStyle(); + "theaderfooter": + return new THeaderFooter(); + "tmargins": + return new TMargins(); + "thyperlink": + return new THyperLink(); + "tsheetview": + return new TSheetView(); + "tpagelayout": + return new TPageLayout(); + "tappproperty": + return new TAppProperty(); + "tbr": + return new TBr(); + "twfont": + return new TwFont(); + "twrpr": + return new TwrPr(); + "twppr": + return new TwpPr(); + "tcnvgraphicframepr": + return new TcNvGraphicFramePr(); + "tnvpicpr": + return new TnvPicPr(); + "tprstgeom": + return new TprstGeom(); + "tpicsppr": + return new TpicsPpr(); + "tfill": + return new TFill(); + "tpic": + return new TPic(); + "tgraphicdata": + return new TGraphicData(); + "tgraphic": + return new TGraphic(); + "twinline": + return new TwInline(); + "twdrawing": + return new TwDrawing(); + "trun": + return new TRun(); + "tparagraph": + return new TParagraph(); + "twbody": + return new TwBody(); + "twtcpr": + return new TwTcPr(); + "twtc": + return new TwTc(); + "twtrpr": + return new TwTrPr(); + "twtr": + return new TwTr(); + "twtblpr": + return new TwTblPr(); + "twgridcol": + return new TwGridCol(); + "twtblgrid": + return new TwTblGrid(); + "ttable": + return new TTable(); + "tcoreproperties": + return new TCoreProperties(); + "tpicture": + return new TPicture(); + End; +End; + +/////////////////////////////////////////////////////////////// +/// TFont +/////////////////////////////////////////////////////////////// +type TFont=class(NodeInfo) + Function Create(); overload; + Begin + Create('font'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + //TODO... + End; + + Function GetAttrs(); override; + Begin + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + return array(("name":"background", "obj":Background,"attrEx":"","nodeType":"","attrName":""),("name":"b", "obj":Bold,"attrEx":"","nodeType":"empty","attrName":"") + ,("name":"color", "obj":Color,"attrEx":"","nodeType":"","attrName":"rgb"),("name":"color", "obj":ColorIndex,"attrEx":"index","nodeType":"","attrName":"") + ,("name":"fontstyle", "obj":FontStyle,"attrEx":"","nodeType":"","attrName":""),("name":"i", "obj":Italic,"attrEx":"","nodeType":"empty","attrName":"") + ,("name":"name", "obj":Name,"attrEx":"","nodeType":"","attrName":""),("name":"outlinefont", "obj":OutlineFont,"attrEx":"","nodeType":"","attrName":"") + ,("name":"shadow", "obj":Shadow,"attrEx":"","nodeType":"","attrName":""),("name":"sz", "obj":Size,"attrEx":"","nodeType":"","attrName":"") + ,("name":"strikethrough", "obj":Strikethrough,"attrEx":"","nodeType":"","attrName":""),("name":"subscript", "obj":Subscript,"attrEx":"","nodeType":"","attrName":"") + ,("name":"superscript", "obj":Superscript,"attrEx":"","nodeType":"","attrName":""),("name":"u", "obj":Underline,"attrEx":"","nodeType":"empty","attrName":"") + ,("name":"color", "obj":ThemeColor,"attrEx":"theme","nodeType":"","attrName":""),("name":"tintandshade", "obj":TintAndShade,"attrEx":"","nodeType":"","attrName":"") + ,("name":"rFont", "obj":rFont,"attrEx":"","nodeType":"","attrName":""),("name":"charset", "obj":Charset,"attrEx":"","nodeType":"","attrName":"") + ,("name":"scheme", "obj":ThemeFont,"attrEx":"","nodeType":"","attrName":"")) union ExtNodes; + End; + + //Attributes + + //Nodes + Background; + Bold; + Color; + ColorIndex; + FontStyle; + Italic; + Name; + OutlineFont; + Shadow; + Size; + Strikethrough; + Subscript; + Superscript; + Underline; + ThemeColor; + TintAndShade; + rFont; + Charset; + ThemeFont; +End; + +/////////////////////////////////////////////////////////////// +/// TComment +/////////////////////////////////////////////////////////////// +type TComment=class(NodeInfo) + Function Create(); overload; + Begin + Create('r'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + Font := new TFont('rPr'); + //TODO... + End; + + Function GetAttrs(); override; + Begin + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + return array(("name":Font.NodeName, "obj":Font,"attrEx":"","nodeType":"","attrName":""),("name":"t", "obj":Text,"attrEx":"","nodeType":"pcdata","attrName":"") + ,("name":"t", "obj":Space,"attrEx":"xml:space","nodeType":"","attrName":"")) union ExtNodes; + End; + + //Attributes + + //Nodes + Font; + Text; + Space; +End; + +/////////////////////////////////////////////////////////////// +/// TComments +/////////////////////////////////////////////////////////////// +type TComments=class(NodeInfo) + Function Create(); overload; + Begin + Create('comment/text'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + //TODO... + End; + + Function GetAttrs(); override; + Begin + return array('authorId':AuthorId,'ref':Ref) union ExtAttr; + End; + + Function GetChildren(); override; + Begin + return ExtNodes; + End; + + Function AddComment(text); + Begin + o := new TComment("r"); + ExtNodes[ length(ExtNodes) ] := array("name":"r", "obj":o, "attrEx":"", "nodeType":""); + o.Text := text; + o.Font.Bold := ""; + o.Font.Size := 9; + o.Font.rFont := "宋体"; + o.Font.Charset := 134; + return o; + End; + + Function Comment(index); + Begin + return GetNode(index); + End; + + //Attributes + AuthorId; + Ref; + + //Nodes +End; + +/////////////////////////////////////////////////////////////// +/// TRichText +/////////////////////////////////////////////////////////////// +type TRichText=class(NodeInfo) + Function Create(); overload; + Begin + Create('si'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + //TODO... + End; + + Function GetAttrs(); override; + Begin + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + return ExtNodes; + End; + + Function AddText(text); + Begin + o := new TComment("r"); + ExtNodes[ length(ExtNodes) ] := array("name":"r", "obj":o, "attrEx":"", "nodeType":""); + o.Text := text; + return o; + End; + + Function RichText(index); + Begin + return GetNode(index); + End; + + //Attributes + + //Nodes +End; + +/////////////////////////////////////////////////////////////// +/// TxdrFromTo +/////////////////////////////////////////////////////////////// +type TxdrFromTo=class(NodeInfo) + Function Create(); overload; + Begin + Create('xdr:from'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + //TODO... + End; + + Function GetAttrs(); override; + Begin + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + return array(("name":"xdr:col", "obj":Col,"attrEx":"","nodeType":"pcdata","attrName":""),("name":"xdr:colOff", "obj":ColOff,"attrEx":"","nodeType":"pcdata","attrName":"") + ,("name":"xdr:row", "obj":Row,"attrEx":"","nodeType":"pcdata","attrName":""),("name":"xdr:rowOff", "obj":RowOff,"attrEx":"","nodeType":"pcdata","attrName":"") + ) union ExtNodes; + End; + + //Attributes + + //Nodes + Col; + ColOff; + Row; + RowOff; +End; + +/////////////////////////////////////////////////////////////// +/// TOff +/////////////////////////////////////////////////////////////// +type TOff=class(NodeInfo) + Function Create(); overload; + Begin + Create('a:off'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + //TODO... + End; + + Function GetAttrs(); override; + Begin + return array('x':X,'y':Y) union ExtAttr; + End; + + Function GetChildren(); override; + Begin + return ExtNodes; + End; + + //Attributes + X; + Y; + + //Nodes +End; + +/////////////////////////////////////////////////////////////// +/// TExt +/////////////////////////////////////////////////////////////// +type TExt=class(NodeInfo) + Function Create(); overload; + Begin + Create('a:ext'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + //TODO... + End; + + Function GetAttrs(); override; + Begin + return array('cx':Cx,'cy':Cy) union ExtAttr; + End; + + Function GetChildren(); override; + Begin + return ExtNodes; + End; + + //Attributes + Cx; + Cy; + + //Nodes +End; + +/////////////////////////////////////////////////////////////// +/// TXfrm +/////////////////////////////////////////////////////////////// +type TXfrm=class(NodeInfo) + Function Create(); overload; + Begin + Create('a:xfrm'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + Off := new TOff('a:off'); + Ext := new TExt('a:ext'); + //TODO... + End; + + Function GetAttrs(); override; + Begin + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + return array(("name":Off.NodeName, "obj":Off,"attrEx":"","nodeType":"","attrName":""),("name":Ext.NodeName, "obj":Ext,"attrEx":"","nodeType":"","attrName":"") + ) union ExtNodes; + End; + + //Attributes + + //Nodes + Off; + Ext; +End; + +/////////////////////////////////////////////////////////////// +/// TClientData +/////////////////////////////////////////////////////////////// +type TClientData=class(NodeInfo) + Function Create(); overload; + Begin + Create('x:ClientData'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + ObjectType := "Note"; + MoveWithCells := ""; + SizeWithCells := ""; + //TODO... + End; + + Function GetAttrs(); override; + Begin + return array('ObjectType':ObjectType) union ExtAttr; + End; + + Function GetChildren(); override; + Begin + return array(("name":"x:MoveWithCells", "obj":MoveWithCells,"attrEx":"","nodeType":"empty","attrName":""),("name":"x:SizeWithCells", "obj":SizeWithCells,"attrEx":"","nodeType":"empty","attrName":"") + ,("name":"x:Anchor", "obj":Anchor,"attrEx":"","nodeType":"pcdata","attrName":""),("name":"x:AutoFill", "obj":AutoFill,"attrEx":"","nodeType":"pcdata","attrName":"") + ,("name":"x:Row", "obj":Row,"attrEx":"","nodeType":"pcdata","attrName":""),("name":"x:Column", "obj":Column,"attrEx":"","nodeType":"pcdata","attrName":"") + ) union ExtNodes; + End; + + //Attributes + ObjectType; + + //Nodes + MoveWithCells; + SizeWithCells; + Anchor; + AutoFill; + Row; + Column; +End; + +/////////////////////////////////////////////////////////////// +/// TGraphicFramePr +/////////////////////////////////////////////////////////////// +type TGraphicFramePr=class(NodeInfo) + Function Create(); overload; + Begin + Create('xdr:cNvGraphicFramePr'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + //TODO... + End; + + Function GetAttrs(); override; + Begin + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + return array(("name":"xdr:cNvPr", "obj":Name,"attrEx":"name","nodeType":"","attrName":""),("name":"xdr:cNvPr", "obj":Id,"attrEx":"id","nodeType":"","attrName":"") + ) union ExtNodes; + End; + + //Attributes + + //Nodes + Name; + Id; +End; + +/////////////////////////////////////////////////////////////// +/// TGraphicFrame +/////////////////////////////////////////////////////////////// +type TGraphicFrame=class(NodeInfo) + Function Create(); overload; + Begin + Create('xdr:graphicFrame'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + GraphicFramePr := new TGraphicFramePr('xdr:nvGraphicFramePr'); + Xfrm := new TXfrm('xdr:xfrm'); + Graphic := new TGraphic('a:graphic'); + //TODO... + End; + + Function GetAttrs(); override; + Begin + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + return array(("name":GraphicFramePr.NodeName, "obj":GraphicFramePr,"attrEx":"","nodeType":"","attrName":""),("name":Xfrm.NodeName, "obj":Xfrm,"attrEx":"","nodeType":"","attrName":"") + ,("name":Graphic.NodeName, "obj":Graphic,"attrEx":"","nodeType":"","attrName":"")) union ExtNodes; + End; + + //Attributes + + //Nodes + GraphicFramePr; + Xfrm; + Graphic; +End; + +/////////////////////////////////////////////////////////////// +/// TtwoCellAnchor +/////////////////////////////////////////////////////////////// +type TtwoCellAnchor=class(NodeInfo) + Function Create(); overload; + Begin + Create('xdr:twoCellAnchor'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + XFrom := new TxdrFromTo('xdr:from'); + XTo := new TxdrFromTo('xdr:to'); + GraphicFrame := new TGraphicFrame('xdr:graphicFrame'); + //TODO... + End; + + Function GetAttrs(); override; + Begin + return array('editAs':EditAs) union ExtAttr; + End; + + Function GetChildren(); override; + Begin + return array(("name":XFrom.NodeName, "obj":XFrom,"attrEx":"","nodeType":"","attrName":""),("name":XTo.NodeName, "obj":XTo,"attrEx":"","nodeType":"","attrName":"") + ,("name":GraphicFrame.NodeName, "obj":GraphicFrame,"attrEx":"","nodeType":"","attrName":"")) union ExtNodes; + End; + + //Attributes + EditAs; + + //Nodes + XFrom; + XTo; + GraphicFrame; +End; + +/////////////////////////////////////////////////////////////// +/// TChart +/////////////////////////////////////////////////////////////// +type TChart=class(NodeInfo) + Function Create(); overload; + Begin + Create('t:chart'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + Series := array(); + XAxis := new TChartAxis('XAxis'); + YAxis := new TChartAxis('YAxis'); + Legend := new TLegend('Legend'); + Plotarea := new TPlot('Plotarea'); + //TODO... + End; + + Function GetAttrs(); override; + Begin + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + return array(("name":"BegColOff", "obj":BegColOff,"attrEx":"","nodeType":"","attrName":""),("name":"BegRowOff", "obj":BegRowOff,"attrEx":"","nodeType":"","attrName":"") + ,("name":"EndColOff", "obj":EndColOff,"attrEx":"","nodeType":"","attrName":""),("name":"EndRowOff", "obj":EndRowOff,"attrEx":"","nodeType":"","attrName":"") + ,("name":"Name", "obj":Name,"attrEx":"","nodeType":"","attrName":""),("name":"Title", "obj":Title,"attrEx":"","nodeType":"","attrName":"") + ,("name":"Type", "obj":Type,"attrEx":"","nodeType":"","attrName":""),("name":"VaryColors", "obj":VaryColors,"attrEx":"","nodeType":"","attrName":"") + ,("name":"ShowLegendKey", "obj":ShowLegendKey,"attrEx":"","nodeType":"","attrName":""),("name":"ShowVal", "obj":ShowVal,"attrEx":"","nodeType":"","attrName":"") + ,("name":"ShowCatName", "obj":ShowCatName,"attrEx":"","nodeType":"","attrName":""),("name":"ShowSerName", "obj":ShowSerName,"attrEx":"","nodeType":"","attrName":"") + ,("name":"ShowBubbleSize", "obj":ShowBubbleSize,"attrEx":"","nodeType":"","attrName":""),("name":"ShowPercent", "obj":ShowPercent,"attrEx":"","nodeType":"","attrName":"") + ,("name":"ShowLeaderLines", "obj":ShowLeaderLines,"attrEx":"","nodeType":"","attrName":""),("name":"Ord", "obj":Ord,"attrEx":"","nodeType":"","attrName":"") + ,("name":"Series", "obj":Series,"attrEx":"","nodeType":"","attrName":""),("name":XAxis.NodeName, "obj":XAxis,"attrEx":"","nodeType":"","attrName":"") + ,("name":YAxis.NodeName, "obj":YAxis,"attrEx":"","nodeType":"","attrName":""),("name":Legend.NodeName, "obj":Legend,"attrEx":"","nodeType":"","attrName":"") + ,("name":Plotarea.NodeName, "obj":Plotarea,"attrEx":"","nodeType":"","attrName":""),("name":"ShowBlanksAs", "obj":ShowBlanksAs,"attrEx":"","nodeType":"","attrName":"") + ,("name":"ChartNode", "obj":ChartNode,"attrEx":"","nodeType":"","attrName":""),("name":"C", "obj":C,"attrEx":"","nodeType":"","attrName":"") + ,("name":"xmlObj", "obj":xmlObj,"attrEx":"","nodeType":"","attrName":"")) union ExtNodes; + End; + + Function AddSeries(Name, Categories, Value); + Begin + Series union= array(("Name":Name,"Categories":Categories,"Values":Value)); + End; + + //Attributes + + //Nodes + BegColOff; + BegRowOff; + EndColOff; + EndRowOff; + Name; + Title; + Type; + VaryColors; + ShowLegendKey; + ShowVal; + ShowCatName; + ShowSerName; + ShowBubbleSize; + ShowPercent; + ShowLeaderLines; + Ord; + Series; + XAxis; + YAxis; + Legend; + Plotarea; + ShowBlanksAs; + ChartNode; + C; + xmlObj; +End; + +/////////////////////////////////////////////////////////////// +/// TLegend +/////////////////////////////////////////////////////////////// +type TLegend=class(NodeInfo) + Function Create(); overload; + Begin + Create('legend'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + //TODO... + End; + + Function GetAttrs(); override; + Begin + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + return array(("name":"ShowLegendKey", "obj":ShowLegendKey,"attrEx":"","nodeType":"","attrName":""),("name":"Position", "obj":Position,"attrEx":"","nodeType":"","attrName":"") + ,("name":"None", "obj":None,"attrEx":"","nodeType":"","attrName":"")) union ExtNodes; + End; + + //Attributes + + //Nodes + ShowLegendKey; + Position; + None; +End; + +/////////////////////////////////////////////////////////////// +/// TPlot +/////////////////////////////////////////////////////////////// +type TPlot=class(NodeInfo) + Function Create(); overload; + Begin + Create('TPlot'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + //TODO... + End; + + Function GetAttrs(); override; + Begin + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + return array(("name":"ShowBubbleSize", "obj":ShowBubbleSize,"attrEx":"","nodeType":"","attrName":""),("name":"ShowCatName", "obj":ShowCatName,"attrEx":"","nodeType":"","attrName":"") + ,("name":"ShowLeaderLines", "obj":ShowLeaderLines,"attrEx":"","nodeType":"","attrName":""),("name":"ShowPercent", "obj":ShowPercent,"attrEx":"","nodeType":"","attrName":"") + ,("name":"ShowSerName", "obj":ShowSerName,"attrEx":"","nodeType":"","attrName":""),("name":"ShowVal", "obj":ShowVal,"attrEx":"","nodeType":"","attrName":"") + ) union ExtNodes; + End; + + //Attributes + + //Nodes + ShowBubbleSize; + ShowCatName; + ShowLeaderLines; + ShowPercent; + ShowSerName; + ShowVal; +End; + +/////////////////////////////////////////////////////////////// +/// TChartAxis +/////////////////////////////////////////////////////////////// +type TChartAxis=class(NodeInfo) + Function Create(); overload; + Begin + Create('ChartAxis'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + NumFont := new TNumFont('NumFont'); + NameLayout := new TNameLayout('NameLayout'); + //TODO... + End; + + Function GetAttrs(); override; + Begin + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + return array(("name":"None", "obj":None,"attrEx":"","nodeType":"","attrName":""),("name":"Crossing", "obj":Crossing,"attrEx":"","nodeType":"","attrName":"") + ,("name":"MajorGridlines", "obj":MajorGridlines,"attrEx":"","nodeType":"","attrName":""),("name":"MinorGridlines", "obj":MinorGridlines,"attrEx":"","nodeType":"","attrName":"") + ,("name":"MajorTickMark", "obj":MajorTickMark,"attrEx":"","nodeType":"","attrName":""),("name":"MinorTickMark", "obj":MinorTickMark,"attrEx":"","nodeType":"","attrName":"") + ,("name":"MinorUnitType", "obj":MinorUnitType,"attrEx":"","nodeType":"","attrName":""),("name":"MajorUnit", "obj":MajorUnit,"attrEx":"","nodeType":"","attrName":"") + ,("name":"MajorUnitType", "obj":MajorUnitType,"attrEx":"","nodeType":"","attrName":""),("name":"TickLabelSkip", "obj":TickLabelSkip,"attrEx":"","nodeType":"","attrName":"") + ,("name":"DisplayUnits", "obj":DisplayUnits,"attrEx":"","nodeType":"","attrName":""),("name":"DisplayUnitsVisible", "obj":DisplayUnitsVisible,"attrEx":"","nodeType":"","attrName":"") + ,("name":"DateAxis", "obj":DateAxis,"attrEx":"","nodeType":"","attrName":""),("name":"ReverseOrder", "obj":ReverseOrder,"attrEx":"","nodeType":"","attrName":"") + ,("name":"Max", "obj":Max,"attrEx":"","nodeType":"","attrName":""),("name":"Min", "obj":Min,"attrEx":"","nodeType":"","attrName":"") + ,("name":"NumFormat", "obj":NumFormat,"attrEx":"","nodeType":"","attrName":""),("name":NumFont.NodeName, "obj":NumFont,"attrEx":"","nodeType":"","attrName":"") + ,("name":"LogBase", "obj":LogBase,"attrEx":"","nodeType":"","attrName":""),("name":NameLayout.NodeName, "obj":NameLayout,"attrEx":"","nodeType":"","attrName":"") + ) union ExtNodes; + End; + + //Attributes + + //Nodes + None; + Crossing; + MajorGridlines; + MinorGridlines; + MajorTickMark; + MinorTickMark; + MinorUnitType; + MajorUnit; + MajorUnitType; + TickLabelSkip; + DisplayUnits; + DisplayUnitsVisible; + DateAxis; + ReverseOrder; + Max; + Min; + NumFormat; + NumFont; + LogBase; + NameLayout; +End; + +/////////////////////////////////////////////////////////////// +/// TNumFont +/////////////////////////////////////////////////////////////// +type TNumFont=class(NodeInfo) + Function Create(); overload; + Begin + Create('NumFont'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + //TODO... + End; + + Function GetAttrs(); override; + Begin + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + return array(("name":"Color", "obj":Color,"attrEx":"","nodeType":"","attrName":""),("name":"Bold", "obj":Bold,"attrEx":"","nodeType":"","attrName":"") + ,("name":"Italic", "obj":Italic,"attrEx":"","nodeType":"","attrName":""),("name":"Underline", "obj":Underline,"attrEx":"","nodeType":"","attrName":"") + ) union ExtNodes; + End; + + //Attributes + + //Nodes + Color; + Bold; + Italic; + Underline; +End; + +/////////////////////////////////////////////////////////////// +/// TNameLayout +/////////////////////////////////////////////////////////////// +type TNameLayout=class(NodeInfo) + Function Create(); overload; + Begin + Create('NameLayout'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + //TODO... + End; + + Function GetAttrs(); override; + Begin + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + return array(("name":"X", "obj":X,"attrEx":"","nodeType":"","attrName":""),("name":"Y", "obj":Y,"attrEx":"","nodeType":"","attrName":"") + ,("name":"Width", "obj":Width,"attrEx":"","nodeType":"","attrName":""),("name":"Height", "obj":Height,"attrEx":"","nodeType":"","attrName":"") + ) union ExtNodes; + End; + + //Attributes + + //Nodes + X; + Y; + Width; + Height; +End; + +/////////////////////////////////////////////////////////////// +/// Tpt +/////////////////////////////////////////////////////////////// +type Tpt=class(NodeInfo) + Function Create(); overload; + Begin + Create('pt'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + //TODO... + End; + + Function GetAttrs(); override; + Begin + return array('idx':IDx) union ExtAttr; + End; + + Function GetChildren(); override; + Begin + return array(("name":"v", "obj":V,"attrEx":"","nodeType":"","attrName":"")) union ExtNodes; + End; + + //Attributes + IDx; + + //Nodes + V; +End; + +/////////////////////////////////////////////////////////////// +/// TStrCache +/////////////////////////////////////////////////////////////// +type TStrCache=class(NodeInfo) + Function Create(); overload; + Begin + Create('strRef'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + Pt := new Tpt('pt'); + //TODO... + End; + + Function GetAttrs(); override; + Begin + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + return array(("name":"ptCount", "obj":PtCount,"attrEx":"","nodeType":"","attrName":""),("name":Pt.NodeName, "obj":Pt,"attrEx":"","nodeType":"","attrName":"") + ) union ExtNodes; + End; + + //Attributes + + //Nodes + PtCount; + Pt; +End; + +/////////////////////////////////////////////////////////////// +/// TStrRef +/////////////////////////////////////////////////////////////// +type TStrRef=class(NodeInfo) + Function Create(); overload; + Begin + Create('strRef'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + StrCache := new TStrCache('strCache'); + //TODO... + End; + + Function GetAttrs(); override; + Begin + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + return array(("name":"f", "obj":F,"attrEx":"","nodeType":"pcdata","attrName":""),("name":StrCache.NodeName, "obj":StrCache,"attrEx":"","nodeType":"","attrName":"") + ) union ExtNodes; + End; + + //Attributes + + //Nodes + F; + StrCache; +End; + +/////////////////////////////////////////////////////////////// +/// TcCat +/////////////////////////////////////////////////////////////// +type TcCat=class(NodeInfo) + Function Create(); overload; + Begin + Create('cat'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + StrRef := new TStrRef('strRef'); + //TODO... + End; + + Function GetAttrs(); override; + Begin + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + return array(("name":StrRef.NodeName, "obj":StrRef,"attrEx":"","nodeType":"","attrName":"")) union ExtNodes; + End; + + //Attributes + + //Nodes + StrRef; +End; + +/////////////////////////////////////////////////////////////// +/// TNumCache +/////////////////////////////////////////////////////////////// +type TNumCache=class(NodeInfo) + Function Create(); overload; + Begin + Create('numCache'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + Pt := new Tpt('pt'); + //TODO... + End; + + Function GetAttrs(); override; + Begin + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + return array(("name":"formatCode", "obj":FormatCode,"attrEx":"","nodeType":"","attrName":""),("name":"ptCount", "obj":PtCount,"attrEx":"","nodeType":"","attrName":"") + ,("name":Pt.NodeName, "obj":Pt,"attrEx":"","nodeType":"","attrName":"")) union ExtNodes; + End; + + //Attributes + + //Nodes + FormatCode; + PtCount; + Pt; +End; + +/////////////////////////////////////////////////////////////// +/// TNumRef +/////////////////////////////////////////////////////////////// +type TNumRef=class(NodeInfo) + Function Create(); overload; + Begin + Create('numRef'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + NumCache := new TNumCache('numCache'); + //TODO... + End; + + Function GetAttrs(); override; + Begin + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + return array(("name":"f", "obj":F,"attrEx":"","nodeType":"pcdata","attrName":""),("name":NumCache.NodeName, "obj":NumCache,"attrEx":"","nodeType":"","attrName":"") + ) union ExtNodes; + End; + + //Attributes + + //Nodes + F; + NumCache; +End; + +/////////////////////////////////////////////////////////////// +/// TcVal +/////////////////////////////////////////////////////////////// +type TcVal=class(NodeInfo) + Function Create(); overload; + Begin + Create('val'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + NumRef := new TNumRef('numRef'); + //TODO... + End; + + Function GetAttrs(); override; + Begin + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + return array(("name":NumRef.NodeName, "obj":NumRef,"attrEx":"","nodeType":"","attrName":"")) union ExtNodes; + End; + + //Attributes + + //Nodes + NumRef; +End; + +/////////////////////////////////////////////////////////////// +/// TTx +/////////////////////////////////////////////////////////////// +type TTx=class(NodeInfo) + Function Create(); overload; + Begin + Create('tx'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + StrRef := new TStrRef('strRef'); + //TODO... + End; + + Function GetAttrs(); override; + Begin + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + return array(("name":StrRef.NodeName, "obj":StrRef,"attrEx":"","nodeType":"","attrName":"")) union ExtNodes; + End; + + //Attributes + + //Nodes + StrRef; +End; + +/////////////////////////////////////////////////////////////// +/// TSolidFill +/////////////////////////////////////////////////////////////// +type TSolidFill=class(NodeInfo) + Function Create(); overload; + Begin + Create('a:solidFill'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + SchemeClr := new TSchemeClr('a:schemeClr'); + //TODO... + End; + + Function GetAttrs(); override; + Begin + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + return array(("name":SchemeClr.NodeName, "obj":SchemeClr,"attrEx":"","nodeType":"","attrName":""),("name":"a:srgbClr", "obj":SrgbClr,"attrEx":"","nodeType":"","attrName":"") + ) union ExtNodes; + End; + + //Attributes + + //Nodes + SchemeClr; + SrgbClr; +End; + +/////////////////////////////////////////////////////////////// +/// TSchemeClr +/////////////////////////////////////////////////////////////// +type TSchemeClr=class(NodeInfo) + Function Create(); overload; + Begin + Create('a:schemeClr'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + //TODO... + End; + + Function GetAttrs(); override; + Begin + return array('val':Val) union ExtAttr; + End; + + Function GetChildren(); override; + Begin + return array(("name":"a:lumMod", "obj":LumMod,"attrEx":"","nodeType":"","attrName":""),("name":"a:lumOff", "obj":LumOff,"attrEx":"","nodeType":"","attrName":"") + ) union ExtNodes; + End; + + //Attributes + Val; + + //Nodes + LumMod; + LumOff; +End; + +/////////////////////////////////////////////////////////////// +/// TLn +/////////////////////////////////////////////////////////////// +type TLn=class(NodeInfo) + Function Create(); overload; + Begin + Create('t:Ln'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + SolidFill := new TSolidFill('a:solidFill'); + //TODO... + End; + + Function GetAttrs(); override; + Begin + return array('algn':Algn,'cap':Cap,'cmpd':Cmpd,'w':W) union ExtAttr; + End; + + Function GetChildren(); override; + Begin + return array(("name":"a:noFill", "obj":NoFill,"attrEx":"","nodeType":"","attrName":""),("name":"a:round", "obj":Round,"attrEx":"","nodeType":"","attrName":"") + ,("name":SolidFill.NodeName, "obj":SolidFill,"attrEx":"","nodeType":"","attrName":"")) union ExtNodes; + End; + + //Attributes + Algn; + Cap; + Cmpd; + W; + + //Nodes + NoFill; + Round; + SolidFill; +End; + +/////////////////////////////////////////////////////////////// +/// TContourClr +/////////////////////////////////////////////////////////////// +type TContourClr=class(NodeInfo) + Function Create(); overload; + Begin + Create('a:contourClr'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + SchemeClr := new TSchemeClr('a:schemeClr'); + //TODO... + End; + + Function GetAttrs(); override; + Begin + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + return array(("name":SchemeClr.NodeName, "obj":SchemeClr,"attrEx":"","nodeType":"","attrName":"")) union ExtNodes; + End; + + //Attributes + + //Nodes + SchemeClr; +End; + +/////////////////////////////////////////////////////////////// +/// TSp3D +/////////////////////////////////////////////////////////////// +type TSp3D=class(NodeInfo) + Function Create(); overload; + Begin + Create('a:sp3d'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + ContourClr := new TContourClr('a:contourClr'); + //TODO... + End; + + Function GetAttrs(); override; + Begin + return array('contourW':ContourW) union ExtAttr; + End; + + Function GetChildren(); override; + Begin + return array(("name":ContourClr.NodeName, "obj":ContourClr,"attrEx":"","nodeType":"","attrName":"")) union ExtNodes; + End; + + //Attributes + ContourW; + + //Nodes + ContourClr; +End; + +/////////////////////////////////////////////////////////////// +/// TspPr +/////////////////////////////////////////////////////////////// +type TspPr=class(NodeInfo) + Function Create(); overload; + Begin + Create('spPr'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + SolidFill := new TSolidFill('a:solidFill'); + Ln := new TLn('a:Ln'); + Sp3D := new TSp3D('a:sp3d'); + //TODO... + End; + + Function GetAttrs(); override; + Begin + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + return array(("name":"a:noFill", "obj":NoFill,"attrEx":"","nodeType":"","attrName":""),("name":SolidFill.NodeName, "obj":SolidFill,"attrEx":"","nodeType":"","attrName":"") + ,("name":Ln.NodeName, "obj":Ln,"attrEx":"","nodeType":"","attrName":""),("name":Sp3D.NodeName, "obj":Sp3D,"attrEx":"","nodeType":"","attrName":"") + ,("name":"a:effectLst", "obj":EffectLst,"attrEx":"","nodeType":"","attrName":"")) union ExtNodes; + End; + + //Attributes + + //Nodes + NoFill; + SolidFill; + Ln; + Sp3D; + EffectLst; +End; + +/////////////////////////////////////////////////////////////// +/// TDpt +/////////////////////////////////////////////////////////////// +type TDpt=class(NodeInfo) + Function Create(); overload; + Begin + Create('dPt'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + SpPr := new TspPr('spPr'); + //TODO... + End; + + Function GetAttrs(); override; + Begin + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + return array(("name":"idx", "obj":IDx,"attrEx":"","nodeType":"","attrName":""),("name":"bubble3D", "obj":Bubble3D,"attrEx":"","nodeType":"","attrName":"") + ,("name":SpPr.NodeName, "obj":SpPr,"attrEx":"","nodeType":"","attrName":"")) union ExtNodes; + End; + + //Attributes + + //Nodes + IDx; + Bubble3D; + SpPr; +End; + +/////////////////////////////////////////////////////////////// +/// TMarker +/////////////////////////////////////////////////////////////// +type TMarker=class(NodeInfo) + Function Create(); overload; + Begin + Create('marker'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + SpPr := new TspPr('spPr'); + //TODO... + End; + + Function GetAttrs(); override; + Begin + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + return array(("name":"symbol", "obj":Symbol,"attrEx":"","nodeType":"","attrName":""),("name":"size", "obj":Size,"attrEx":"","nodeType":"","attrName":"") + ,("name":SpPr.NodeName, "obj":SpPr,"attrEx":"","nodeType":"","attrName":"")) union ExtNodes; + End; + + //Attributes + + //Nodes + Symbol; + Size; + SpPr; +End; + +/////////////////////////////////////////////////////////////// +/// TSer +/////////////////////////////////////////////////////////////// +type TSer=class(NodeInfo) + Function Create(); overload; + Begin + Create('t:chart'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + Tx := new TTx('tx'); + SpPr := new TspPr('spPr'); + DPt := new TDpt('dPt'); + DLbls := new TdLbls('dLbls'); + Marker := new TMarker('marker'); + Cat := new TcCat('cat'); + Val := new TcVal('val'); + XVal := new TcCat('xVal'); + YVal := new TcVal('yVal'); + BubbleSize := new TcVal('bubbleSize'); + //TODO... + End; + + Function GetAttrs(); override; + Begin + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + return array(("name":"idx", "obj":IDx,"attrEx":"","nodeType":"","attrName":""),("name":"order", "obj":Ord,"attrEx":"","nodeType":"","attrName":"") + ,("name":Tx.NodeName, "obj":Tx,"attrEx":"","nodeType":"","attrName":""),("name":SpPr.NodeName, "obj":SpPr,"attrEx":"","nodeType":"","attrName":"") + ,("name":DPt.NodeName, "obj":DPt,"attrEx":"","nodeType":"","attrName":""),("name":DLbls.NodeName, "obj":DLbls,"attrEx":"","nodeType":"","attrName":"") + ,("name":Marker.NodeName, "obj":Marker,"attrEx":"","nodeType":"","attrName":""),("name":"invertIfNegative", "obj":InvertIfNegative,"attrEx":"","nodeType":"","attrName":"") + ,("name":Cat.NodeName, "obj":Cat,"attrEx":"","nodeType":"","attrName":""),("name":Val.NodeName, "obj":Val,"attrEx":"","nodeType":"","attrName":"") + ,("name":XVal.NodeName, "obj":XVal,"attrEx":"","nodeType":"","attrName":""),("name":YVal.NodeName, "obj":YVal,"attrEx":"","nodeType":"","attrName":"") + ,("name":"smooth", "obj":Smooth,"attrEx":"","nodeType":"","attrName":""),("name":BubbleSize.NodeName, "obj":BubbleSize,"attrEx":"","nodeType":"","attrName":"") + ,("name":"bubble3D", "obj":Bubble3D,"attrEx":"","nodeType":"","attrName":"")) union ExtNodes; + End; + + //Attributes + + //Nodes + IDx; + Ord; + Tx; + SpPr; + DPt; + DLbls; + Marker; + InvertIfNegative; + Cat; + Val; + XVal; + YVal; + Smooth; + BubbleSize; + Bubble3D; +End; + +/////////////////////////////////////////////////////////////// +/// TdLbls +/////////////////////////////////////////////////////////////// +type TdLbls=class(NodeInfo) + Function Create(); overload; + Begin + Create('t:chart'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + //TODO... + End; + + Function GetAttrs(); override; + Begin + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + return array(("name":"showLegendKey", "obj":ShowLegendKey,"attrEx":"","nodeType":"","attrName":""),("name":"showVal", "obj":ShowVal,"attrEx":"","nodeType":"","attrName":"") + ,("name":"showCatName", "obj":ShowCatName,"attrEx":"","nodeType":"","attrName":""),("name":"showSerName", "obj":ShowSerName,"attrEx":"","nodeType":"","attrName":"") + ,("name":"showPercent", "obj":ShowPercent,"attrEx":"","nodeType":"","attrName":""),("name":"showBubbleSize", "obj":ShowBubbleSize,"attrEx":"","nodeType":"","attrName":"") + ,("name":"showLeaderLines", "obj":ShowLeaderLines,"attrEx":"","nodeType":"","attrName":"")) union ExtNodes; + End; + + //Attributes + + //Nodes + ShowLegendKey; + ShowVal; + ShowCatName; + ShowSerName; + ShowPercent; + ShowBubbleSize; + ShowLeaderLines; +End; + +/////////////////////////////////////////////////////////////// +/// TcCharts +/////////////////////////////////////////////////////////////// +type TcCharts=class(NodeInfo) + Function Create(); overload; + Begin + Create('t:chart'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + Ser := array(); + DLbls := new TdLbls('dLbls'); + //TODO... + End; + + Function GetAttrs(); override; + Begin + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + return array(("name":"barDir", "obj":BarDir,"attrEx":"","nodeType":"","attrName":""),("name":"bubbleScale", "obj":BubbleScale,"attrEx":"","nodeType":"","attrName":"") + ,("name":"grouping", "obj":Grouping,"attrEx":"","nodeType":"","attrName":""),("name":"radarStyle", "obj":RadarStyle,"attrEx":"","nodeType":"","attrName":"") + ,("name":"scatterStyle", "obj":ScatterStyle,"attrEx":"","nodeType":"","attrName":""),("name":"ofPieType", "obj":OfPieType,"attrEx":"","nodeType":"","attrName":"") + ,("name":"varyColors", "obj":VaryColors,"attrEx":"","nodeType":"","attrName":""),("name":"wireframe", "obj":Wireframe,"attrEx":"","nodeType":"","attrName":"") + ,("name":"ser", "obj":Ser,"attrEx":"","nodeType":"","attrName":"","arrObj":"array"),("name":"serLines", "obj":SerLines,"attrEx":"","nodeType":"","attrName":"") + ,("name":DLbls.NodeName, "obj":DLbls,"attrEx":"","nodeType":"","attrName":""),("name":"shape", "obj":Shape,"attrEx":"","nodeType":"","attrName":"") + ,("name":"holeSize", "obj":HoleSize,"attrEx":"","nodeType":"","attrName":""),("name":"smooth", "obj":Smooth,"attrEx":"","nodeType":"","attrName":"") + ,("name":"overlap", "obj":Overlap,"attrEx":"","nodeType":"","attrName":""),("name":"axId", "obj":AxID,"attrEx":"","nodeType":"","attrName":"") + ,("name":"axId", "obj":AxID2,"attrEx":"","nodeType":"","attrName":""),("name":"axId", "obj":AxID3,"attrEx":"","nodeType":"","attrName":"") + ) union ExtNodes; + End; + + //Attributes + + //Nodes + BarDir; + BubbleScale; + Grouping; + RadarStyle; + ScatterStyle; + OfPieType; + VaryColors; + Wireframe; + Ser; + SerLines; + DLbls; + Shape; + HoleSize; + Smooth; + Overlap; + AxID; + AxID2; + AxID3; +End; + +/////////////////////////////////////////////////////////////// +/// TcScaling +/////////////////////////////////////////////////////////////// +type TcScaling=class(NodeInfo) + Function Create(); overload; + Begin + Create('scaling'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + //TODO... + End; + + Function GetAttrs(); override; + Begin + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + return array(("name":"logBase", "obj":LogBase,"attrEx":"","nodeType":"","attrName":""),("name":"orientation", "obj":Orientation,"attrEx":"","nodeType":"","attrName":"") + ,("name":"max", "obj":Max,"attrEx":"","nodeType":"","attrName":""),("name":"min", "obj":Min,"attrEx":"","nodeType":"","attrName":"") + ) union ExtNodes; + End; + + //Attributes + + //Nodes + LogBase; + Orientation; + Max; + Min; +End; + +/////////////////////////////////////////////////////////////// +/// TcChartLines +/////////////////////////////////////////////////////////////// +type TcChartLines=class(NodeInfo) + Function Create(); overload; + Begin + Create('cChartLines'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + SpPr := new TspPr('spPr'); + //TODO... + End; + + Function GetAttrs(); override; + Begin + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + return array(("name":SpPr.NodeName, "obj":SpPr,"attrEx":"","nodeType":"","attrName":"")) union ExtNodes; + End; + + //Attributes + + //Nodes + SpPr; +End; + +/////////////////////////////////////////////////////////////// +/// TcNumFmt +/////////////////////////////////////////////////////////////// +type TcNumFmt=class(NodeInfo) + Function Create(); overload; + Begin + Create('numFmt'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + //TODO... + End; + + Function GetAttrs(); override; + Begin + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + return array(("name":"formatCode", "obj":FormatCode,"attrEx":"","nodeType":"","attrName":""),("name":"sourceLinked", "obj":SourceLinked,"attrEx":"","nodeType":"","attrName":"") + ) union ExtNodes; + End; + + //Attributes + + //Nodes + FormatCode; + SourceLinked; +End; + +/////////////////////////////////////////////////////////////// +/// TaR +/////////////////////////////////////////////////////////////// +type TaR=class(NodeInfo) + Function Create(); overload; + Begin + Create('a:r'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + RPr := new TaRpr('a:rPr'); + //TODO... + End; + + Function GetAttrs(); override; + Begin + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + return array(("name":RPr.NodeName, "obj":RPr,"attrEx":"","nodeType":"","attrName":""),("name":"a:t", "obj":T,"attrEx":"","nodeType":"","attrName":"") + ) union ExtNodes; + End; + + //Attributes + + //Nodes + RPr; + T; +End; + +/////////////////////////////////////////////////////////////// +/// TaEndParaRPr +/////////////////////////////////////////////////////////////// +type TaEndParaRPr=class(NodeInfo) + Function Create(); overload; + Begin + Create('a:endParaRPr'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + //TODO... + End; + + Function GetAttrs(); override; + Begin + return array('lang':Lang,'altLang':AltLang,'sz':Sz) union ExtAttr; + End; + + Function GetChildren(); override; + Begin + return ExtNodes; + End; + + //Attributes + Lang; + AltLang; + Sz; + + //Nodes +End; + +/////////////////////////////////////////////////////////////// +/// TaP +/////////////////////////////////////////////////////////////// +type TaP=class(NodeInfo) + Function Create(); overload; + Begin + Create('a:p'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + PPr := new TaPPr('a:pPr'); + R := new TaR('a:r'); + EndParaRPr := new TaEndParaRPr('a:endParaRPr'); + //TODO... + End; + + Function GetAttrs(); override; + Begin + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + return array(("name":PPr.NodeName, "obj":PPr,"attrEx":"","nodeType":"","attrName":""),("name":R.NodeName, "obj":R,"attrEx":"","nodeType":"","attrName":"") + ,("name":EndParaRPr.NodeName, "obj":EndParaRPr,"attrEx":"","nodeType":"","attrName":"")) union ExtNodes; + End; + + //Attributes + + //Nodes + PPr; + R; + EndParaRPr; +End; + +/////////////////////////////////////////////////////////////// +/// TaPPr +/////////////////////////////////////////////////////////////// +type TaPPr=class(NodeInfo) + Function Create(); overload; + Begin + Create('a:pPr'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + DefRPr := new TaRPr('a:defRPr'); + //TODO... + End; + + Function GetAttrs(); override; + Begin + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + return array(("name":DefRPr.NodeName, "obj":DefRPr,"attrEx":"","nodeType":"","attrName":"")) union ExtNodes; + End; + + //Attributes + + //Nodes + DefRPr; +End; + +/////////////////////////////////////////////////////////////// +/// TaLatin +/////////////////////////////////////////////////////////////// +type TaLatin=class(NodeInfo) + Function Create(); overload; + Begin + Create('a:latin'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + //TODO... + End; + + Function GetAttrs(); override; + Begin + return array('typeface':Typeface) union ExtAttr; + End; + + Function GetChildren(); override; + Begin + return ExtNodes; + End; + + //Attributes + Typeface; + + //Nodes +End; + +/////////////////////////////////////////////////////////////// +/// TaEa +/////////////////////////////////////////////////////////////// +type TaEa=class(NodeInfo) + Function Create(); overload; + Begin + Create('a:ea'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + //TODO... + End; + + Function GetAttrs(); override; + Begin + return array('typeface':Typeface) union ExtAttr; + End; + + Function GetChildren(); override; + Begin + return ExtNodes; + End; + + //Attributes + Typeface; + + //Nodes +End; + +/////////////////////////////////////////////////////////////// +/// TaCs +/////////////////////////////////////////////////////////////// +type TaCs=class(NodeInfo) + Function Create(); overload; + Begin + Create('a:cs'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + //TODO... + End; + + Function GetAttrs(); override; + Begin + return array('typeface':Typeface) union ExtAttr; + End; + + Function GetChildren(); override; + Begin + return ExtNodes; + End; + + //Attributes + Typeface; + + //Nodes +End; + +/////////////////////////////////////////////////////////////// +/// TaRPr +/////////////////////////////////////////////////////////////// +type TaRPr=class(NodeInfo) + Function Create(); overload; + Begin + Create('a:defRPr'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + SolidFill := new TSolidFill('a:solidFill'); + Latin := new TaLatin('a:latin'); + Ea := new TaEa('a:ea'); + Cs := new TaCs('a:cs'); + //TODO... + End; + + Function GetAttrs(); override; + Begin + return array('altLang':AltLang,'b':B,'baseline':Baseline,'bmk':Bmk,'cap':Cap,'dirty':Dirty,'err':Err,'i':I,'kern':Kern,'kumimoji':Kumimoji,'lang':Lang,'noProof':NoProof,'normalizeH':NormalizeH,'smtId':SmtID,'spc':Spc,'strike':Strike,'sz':Sz,'smtClean':SmtClean,'u':U) union ExtAttr; + End; + + Function GetChildren(); override; + Begin + return array(("name":SolidFill.NodeName, "obj":SolidFill,"attrEx":"","nodeType":"","attrName":""),("name":Latin.NodeName, "obj":Latin,"attrEx":"","nodeType":"","attrName":"") + ,("name":Ea.NodeName, "obj":Ea,"attrEx":"","nodeType":"","attrName":""),("name":Cs.NodeName, "obj":Cs,"attrEx":"","nodeType":"","attrName":"") + ) union ExtNodes; + End; + + //Attributes + AltLang; + B; + Baseline; + Bmk; + Cap; + Dirty; + Err; + I; + Kern; + Kumimoji; + Lang; + NoProof; + NormalizeH; + SmtID; + Spc; + Strike; + Sz; + SmtClean; + U; + + //Nodes + SolidFill; + Latin; + Ea; + Cs; +End; + +/////////////////////////////////////////////////////////////// +/// TaBodyPr +/////////////////////////////////////////////////////////////// +type TaBodyPr=class(NodeInfo) + Function Create(); overload; + Begin + Create('a:bodyPr'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + //TODO... + End; + + Function GetAttrs(); override; + Begin + return array('anchor':Anchor,'anchorCtr':AnchorCtr,'rot':Rot,'bIns':BIns,'compatLnSpc':CompatLnSpc,'forceAA':ForceAA,'fromWordArt':FromWordArt,'horzOverflow':HorzOverflow,'lIns':LIns,'numCol':NumCol,'rIns':RIns,'rtlCol':RtlCol,'spcCol':SpcCol,'spcFirstLastPara':SpcFirstLastPara,'tIns':TIns,'upright':Upright,'vert':Vert,'vertOverflow':VertOverflow,'wrap':Wrap) union ExtAttr; + End; + + Function GetChildren(); override; + Begin + return ExtNodes; + End; + + //Attributes + Anchor; + AnchorCtr; + Rot; + BIns; + CompatLnSpc; + ForceAA; + FromWordArt; + HorzOverflow; + LIns; + NumCol; + RIns; + RtlCol; + SpcCol; + SpcFirstLastPara; + TIns; + Upright; + Vert; + VertOverflow; + Wrap; + + //Nodes +End; + +/////////////////////////////////////////////////////////////// +/// TTxPr +/////////////////////////////////////////////////////////////// +type TTxPr=class(NodeInfo) + Function Create(); overload; + Begin + Create('txPr'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + BodyPr := new TaBodyPr('a:bodyPr'); + P := new TaP('a:p'); + //TODO... + End; + + Function GetAttrs(); override; + Begin + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + return array(("name":BodyPr.NodeName, "obj":BodyPr,"attrEx":"","nodeType":"","attrName":""),("name":"a:lstStyle", "obj":LstStyle,"attrEx":"","nodeType":"","attrName":"") + ,("name":P.NodeName, "obj":P,"attrEx":"","nodeType":"","attrName":"")) union ExtNodes; + End; + + //Attributes + + //Nodes + BodyPr; + LstStyle; + P; +End; + +/////////////////////////////////////////////////////////////// +/// TcAxs +/////////////////////////////////////////////////////////////// +type TcAxs=class(NodeInfo) + Function Create(); overload; + Begin + Create('catAx'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + Scaling := new TcScaling('scaling'); + MajorGridlines := new TcChartLines('majorGridlines'); + MinorGridlines := new TcChartLines('minorGridlines'); + NumFmt := new TcNumFmt('numFmt'); + SpPr := new TspPr('spPr'); + TxPr := new TTxPr('txPr'); + //TODO... + End; + + Function GetAttrs(); override; + Begin + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + return array(("name":"axId", "obj":AxID,"attrEx":"","nodeType":"","attrName":""),("name":Scaling.NodeName, "obj":Scaling,"attrEx":"","nodeType":"","attrName":"") + ,("name":"delete", "obj":Del,"attrEx":"","nodeType":"","attrName":""),("name":"axPos", "obj":AxPos,"attrEx":"","nodeType":"","attrName":"") + ,("name":MajorGridlines.NodeName, "obj":MajorGridlines,"attrEx":"","nodeType":"","attrName":""),("name":MinorGridlines.NodeName, "obj":MinorGridlines,"attrEx":"","nodeType":"","attrName":"") + ,("name":NumFmt.NodeName, "obj":NumFmt,"attrEx":"","nodeType":"","attrName":""),("name":"majorTickMark", "obj":MajorTickMark,"attrEx":"","nodeType":"","attrName":"") + ,("name":"minorTickMark", "obj":MinorTickMark,"attrEx":"","nodeType":"","attrName":""),("name":"tickLblPos", "obj":TickLblPos,"attrEx":"","nodeType":"","attrName":"") + ,("name":SpPr.NodeName, "obj":SpPr,"attrEx":"","nodeType":"","attrName":""),("name":TxPr.NodeName, "obj":TxPr,"attrEx":"","nodeType":"","attrName":"") + ,("name":"crossAx", "obj":CrossAx,"attrEx":"","nodeType":"","attrName":""),("name":"crosses", "obj":Crosses,"attrEx":"","nodeType":"","attrName":"") + ,("name":"crossBetween", "obj":CrossBetween,"attrEx":"","nodeType":"","attrName":""),("name":"majorUnit", "obj":MajorUnit,"attrEx":"","nodeType":"","attrName":"") + ,("name":"minorUnit", "obj":MinorUnit,"attrEx":"","nodeType":"","attrName":""),("name":"auto", "obj":Auto,"attrEx":"","nodeType":"","attrName":"") + ,("name":"lblAlgn", "obj":LblAlgn,"attrEx":"","nodeType":"","attrName":""),("name":"lblOffset", "obj":LblOffset,"attrEx":"","nodeType":"","attrName":"") + ,("name":"tickLblSkip", "obj":TickLblSkip,"attrEx":"","nodeType":"","attrName":""),("name":"tickMarkSkip", "obj":TickMarkSkip,"attrEx":"","nodeType":"","attrName":"") + ,("name":"NoMultiLvlLbl", "obj":NoMultiLvlLbl,"attrEx":"","nodeType":"","attrName":"")) union ExtNodes; + End; + + //Attributes + + //Nodes + AxID; + Scaling; + Del; + AxPos; + MajorGridlines; + MinorGridlines; + NumFmt; + MajorTickMark; + MinorTickMark; + TickLblPos; + SpPr; + TxPr; + CrossAx; + Crosses; + CrossBetween; + MajorUnit; + MinorUnit; + Auto; + LblAlgn; + LblOffset; + TickLblSkip; + TickMarkSkip; + NoMultiLvlLbl; +End; + +/////////////////////////////////////////////////////////////// +/// TplotArea +/////////////////////////////////////////////////////////////// +type TplotArea=class(NodeInfo) + Function Create(); overload; + Begin + Create('plotArea'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + Chart := new TcCharts('chartname'); + CatAx := new TcAxs('catAx'); + ValAx := new TcAxs('valAx'); + SerAx := new TcAxs('serAx'); + SpPr := new TspPr('spPr'); + //TODO... + End; + + Function GetAttrs(); override; + Begin + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + return array(("name":"layout", "obj":Layout,"attrEx":"","nodeType":"","attrName":""),("name":Chart.NodeName, "obj":Chart,"attrEx":"","nodeType":"","attrName":"") + ,("name":CatAx.NodeName, "obj":CatAx,"attrEx":"","nodeType":"","attrName":""),("name":ValAx.NodeName, "obj":ValAx,"attrEx":"","nodeType":"","attrName":"") + ,("name":SerAx.NodeName, "obj":SerAx,"attrEx":"","nodeType":"","attrName":""),("name":SpPr.NodeName, "obj":SpPr,"attrEx":"","nodeType":"","attrName":"") + ) union ExtNodes; + End; + + //Attributes + + //Nodes + Layout; + Chart; + CatAx; + ValAx; + SerAx; + SpPr; +End; + +/////////////////////////////////////////////////////////////// +/// TView3D +/////////////////////////////////////////////////////////////// +type TView3D=class(NodeInfo) + Function Create(); overload; + Begin + Create('view3D'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + //TODO... + End; + + Function GetAttrs(); override; + Begin + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + return array(("name":"rotX", "obj":RotX,"attrEx":"rgb","nodeType":"","attrName":""),("name":"rotY", "obj":RotY,"attrEx":"index","nodeType":"","attrName":"") + ,("name":"rAngAx", "obj":RAngAx,"attrEx":"","nodeType":"","attrName":""),("name":"depthPercent", "obj":DepthPercent,"attrEx":"","nodeType":"","attrName":"") + ,("name":"perspective", "obj":Perspective,"attrEx":"","nodeType":"","attrName":"")) union ExtNodes; + End; + + //Attributes + + //Nodes + RotX; + RotY; + RAngAx; + DepthPercent; + Perspective; +End; + +/////////////////////////////////////////////////////////////// +/// TBorder +/////////////////////////////////////////////////////////////// +type TBorder=class(NodeInfo) + Function Create(); overload; + Begin + Create('border'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + //TODO... + End; + + Function GetAttrs(); override; + Begin + return array('style':LineStyle) union ExtAttr; + End; + + Function GetChildren(); override; + Begin + return array(("name":"color", "obj":Color,"attrEx":"rgb","nodeType":"","attrName":""),("name":"color", "obj":ColorIndex,"attrEx":"index","nodeType":"","attrName":"") + ,("name":"weight", "obj":Weight,"attrEx":"","nodeType":"","attrName":""),("name":"color", "obj":ThemeColor,"attrEx":"theme","nodeType":"","attrName":"") + ,("name":"tintandshade", "obj":TintAndShade,"attrEx":"","nodeType":"","attrName":"")) union ExtNodes; + End; + + //Attributes + LineStyle; + + //Nodes + Color; + ColorIndex; + Weight; + ThemeColor; + TintAndShade; +End; + +/////////////////////////////////////////////////////////////// +/// TBorders +/////////////////////////////////////////////////////////////// +type TBorders=class(NodeInfo) + Function Create(); overload; + Begin + Create('border'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + Left := new TBorder('left'); + Right := new TBorder('right'); + Top := new TBorder('top'); + Bottom := new TBorder('bottom'); + Diagonal := new TBorder('diagonal'); + //TODO... + End; + + Function GetAttrs(); override; + Begin + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + return array(("name":Left.NodeName, "obj":Left,"attrEx":"","nodeType":"","attrName":""),("name":Right.NodeName, "obj":Right,"attrEx":"","nodeType":"","attrName":"") + ,("name":Top.NodeName, "obj":Top,"attrEx":"","nodeType":"","attrName":""),("name":Bottom.NodeName, "obj":Bottom,"attrEx":"","nodeType":"","attrName":"") + ,("name":Diagonal.NodeName, "obj":Diagonal,"attrEx":"","nodeType":"","attrName":"")) union ExtNodes; + End; + + //Attributes + + //Nodes + Left; + Right; + Top; + Bottom; + Diagonal; +End; + +/////////////////////////////////////////////////////////////// +/// TNumFmts +/////////////////////////////////////////////////////////////// +type TNumFmts=class(NodeInfo) + Function Create(); overload; + Begin + Create('numFmts'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + //TODO... + End; + + Function GetAttrs(); override; + Begin + return array('numFmtId':NumFmtId,'formatCode':FormatCode) union ExtAttr; + End; + + Function GetChildren(); override; + Begin + return ExtNodes; + End; + + //Attributes + NumFmtId; + FormatCode; + + //Nodes +End; + +/////////////////////////////////////////////////////////////// +/// TFills +/////////////////////////////////////////////////////////////// +type TFills=class(NodeInfo) + Function Create(); overload; + Begin + Create('fill'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + Pattern := new TPattern('patternFill'); + Gradient := new TGradient('gradientFill'); + //TODO... + End; + + Function GetAttrs(); override; + Begin + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + return array(("name":Pattern.NodeName, "obj":Pattern,"attrEx":"","nodeType":"","attrName":""),("name":Gradient.NodeName, "obj":Gradient,"attrEx":"","nodeType":"","attrName":"") + ) union ExtNodes; + End; + + //Attributes + + //Nodes + Pattern; + Gradient; +End; + +/////////////////////////////////////////////////////////////// +/// TPattern +/////////////////////////////////////////////////////////////// +type TPattern=class(NodeInfo) + Function Create(); overload; + Begin + Create('patternFill'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + //TODO... + End; + + Function GetAttrs(); override; + Begin + return array('patternType':PatternType) union ExtAttr; + End; + + Function GetChildren(); override; + Begin + return array(("name":"fgcolor", "obj":ForeColor,"attrEx":"rgb","nodeType":"","attrName":""),("name":"bgcolor", "obj":BackColor,"attrEx":"rgb","nodeType":"","attrName":"") + ) union ExtNodes; + End; + + //Attributes + PatternType; + + //Nodes + ForeColor; + BackColor; +End; + +/////////////////////////////////////////////////////////////// +/// TGradient +/////////////////////////////////////////////////////////////// +type TGradient=class(NodeInfo) + Function Create(); overload; + Begin + Create('gradientFill'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + TopPosition := new TStop0('stop'); + BottomPosition := new TStop1('stop'); + //TODO... + End; + + Function GetAttrs(); override; + Begin + return array('degree':Degree,'type':Type,'left':Left,'right':Right,'top':Top,'bottom':Bottom) union ExtAttr; + End; + + Function GetChildren(); override; + Begin + return array(("name":TopPosition.NodeName, "obj":TopPosition,"attrEx":"","nodeType":"","attrName":""),("name":BottomPosition.NodeName, "obj":BottomPosition,"attrEx":"","nodeType":"","attrName":"") + ) union ExtNodes; + End; + + //Attributes + Degree; + Type; + Left; + Right; + Top; + Bottom; + + //Nodes + TopPosition; + BottomPosition; +End; + +/////////////////////////////////////////////////////////////// +/// TStop0 +/////////////////////////////////////////////////////////////// +type TStop0=class(NodeInfo) + Function Create(); overload; + Begin + Create('stop'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + //TODO... + End; + + Function GetAttrs(); override; + Begin + return array('position':Position) union ExtAttr; + End; + + Function GetChildren(); override; + Begin + return array(("name":"color", "obj":Color,"attrEx":"rgb","nodeType":"","attrName":""),("name":"color", "obj":ColorIndex,"attrEx":"index","nodeType":"","attrName":"") + ,("name":"color", "obj":ThemeColor,"attrEx":"theme","nodeType":"","attrName":"")) union ExtNodes; + End; + + //Attributes + Position; + + //Nodes + Color; + ColorIndex; + ThemeColor; +End; + +/////////////////////////////////////////////////////////////// +/// TStop1 +/////////////////////////////////////////////////////////////// +type TStop1=class(NodeInfo) + Function Create(); overload; + Begin + Create('stop'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + //TODO... + End; + + Function GetAttrs(); override; + Begin + return array('position':Position) union ExtAttr; + End; + + Function GetChildren(); override; + Begin + return array(("name":"color", "obj":Color,"attrEx":"rgb","nodeType":"","attrName":""),("name":"color", "obj":ColorIndex,"attrEx":"index","nodeType":"","attrName":"") + ,("name":"color", "obj":ThemeColor,"attrEx":"theme","nodeType":"","attrName":"")) union ExtNodes; + End; + + //Attributes + Position; + + //Nodes + Color; + ColorIndex; + ThemeColor; +End; + +/////////////////////////////////////////////////////////////// +/// TAlignment +/////////////////////////////////////////////////////////////// +type TAlignment=class(NodeInfo) + Function Create(); overload; + Begin + Create('alignment'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + //TODO... + End; + + Function GetAttrs(); override; + Begin + return array('horizontal':Horizontal,'vertical':Vertical,'wrapText':WrapText) union ExtAttr; + End; + + Function GetChildren(); override; + Begin + return ExtNodes; + End; + + //Attributes + Horizontal; + Vertical; + WrapText; + + //Nodes +End; + +/////////////////////////////////////////////////////////////// +/// TProtection +/////////////////////////////////////////////////////////////// +type TProtection=class(NodeInfo) + Function Create(); overload; + Begin + Create('protection'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + //TODO... + End; + + Function GetAttrs(); override; + Begin + return array('locked':Lock,'hidden':Hide) union ExtAttr; + End; + + Function GetChildren(); override; + Begin + return ExtNodes; + End; + + //Attributes + Lock; + Hide; + + //Nodes +End; + +/////////////////////////////////////////////////////////////// +/// TStyle +/////////////////////////////////////////////////////////////// +type TStyle=class(NodeInfo) + Function Create(); overload; + Begin + Create('xf'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + Border := new TBorders('border'); + Font := new TFont('font'); + NumberFormat := new TNumFmts('numFmt'); + Fill := new TFills('fill'); + Alignment := new TAlignment('alignment'); + Protection := new TProtection('protection'); + //TODO... + End; + + Function GetAttrs(); override; + Begin + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + return array(("name":Border.NodeName, "obj":Border,"attrEx":"","nodeType":"","attrName":""),("name":Font.NodeName, "obj":Font,"attrEx":"","nodeType":"","attrName":"") + ,("name":NumberFormat.NodeName, "obj":NumberFormat,"attrEx":"","nodeType":"","attrName":""),("name":Fill.NodeName, "obj":Fill,"attrEx":"","nodeType":"","attrName":"") + ,("name":Alignment.NodeName, "obj":Alignment,"attrEx":"","nodeType":"","attrName":""),("name":Protection.NodeName, "obj":Protection,"attrEx":"","nodeType":"","attrName":"") + ) union ExtNodes; + End; + + //Attributes + + //Nodes + Border; + Font; + NumberFormat; + Fill; + Alignment; + Protection; +End; + +/////////////////////////////////////////////////////////////// +/// THeaderFooter +/////////////////////////////////////////////////////////////// +type THeaderFooter=class(NodeInfo) + Function Create(); overload; + Begin + Create('headerFooter'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + //TODO... + End; + + Function GetAttrs(); override; + Begin + return array('differentOddEven':DifferentOddEven,'differentFirst':DifferentFirst,'scaleWithDoc':ScaleWithDoc,'alignWithMargins':AlignWithMargin) union ExtAttr; + End; + + Function GetChildren(); override; + Begin + return array(("name":"oddHeader", "obj":OddHeader,"attrEx":"","nodeType":"pcdata","attrName":""),("name":"oddFooter", "obj":OddFooter,"attrEx":"","nodeType":"pcdata","attrName":"") + ,("name":"evenHeader", "obj":EvenHeader,"attrEx":"","nodeType":"pcdata","attrName":""),("name":"evenFooter", "obj":EvenFooter,"attrEx":"","nodeType":"pcdata","attrName":"") + ,("name":"firstHeader", "obj":FirstHeader,"attrEx":"","nodeType":"pcdata","attrName":""),("name":"firstFooter", "obj":FirstFooter,"attrEx":"","nodeType":"pcdata","attrName":"") + ) union ExtNodes; + End; + + //Attributes + DifferentOddEven; + DifferentFirst; + ScaleWithDoc; + AlignWithMargin; + + //Nodes + OddHeader; + OddFooter; + EvenHeader; + EvenFooter; + FirstHeader; + FirstFooter; +End; + +/////////////////////////////////////////////////////////////// +/// TMargins +/////////////////////////////////////////////////////////////// +type TMargins=class(NodeInfo) + Function Create(); overload; + Begin + Create('pageMargins'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + bottom := 0.75; + footer := 0.5; + header := 0.5; + left := 0.75; + right := 0.75; + top := 0.75; + //TODO... + End; + + Function GetAttrs(); override; + Begin + return array('bottom':Bottom,'footer':Footer,'header':Header,'left':Left,'right':Right,'top':Top) union ExtAttr; + End; + + Function GetChildren(); override; + Begin + return ExtNodes; + End; + + //Attributes + Bottom; + Footer; + Header; + Left; + Right; + Top; + + //Nodes +End; + +/////////////////////////////////////////////////////////////// +/// THyperLink +/////////////////////////////////////////////////////////////// +type THyperLink=class(NodeInfo) + Function Create(); overload; + Begin + Create('hyperlink'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + //TODO... + End; + + Function GetAttrs(); override; + Begin + return array('linkType':LinkType,'linkUrl':LinkUrl,'ref':Axis,'display':Display,'tooltip':Tooltip) union ExtAttr; + End; + + Function GetChildren(); override; + Begin + return ExtNodes; + End; + + //Attributes + LinkType; + LinkUrl; + Axis; + Display; + Tooltip; + + //Nodes +End; + +/////////////////////////////////////////////////////////////// +/// TSheetView +/////////////////////////////////////////////////////////////// +type TSheetView=class(NodeInfo) + Function Create(); overload; + Begin + Create('sheetView'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + //TODO... + End; + + Function GetAttrs(); override; + Begin + return array('showGridLines':ShowGridLines,'showRowColHeaders':ShowRowColHeaders,'zoomScale':ZoomScale,'zoomScaleNormal':ZoomScaleNormal) union ExtAttr; + End; + + Function GetChildren(); override; + Begin + return ExtNodes; + End; + + //Attributes + ShowGridLines; + ShowRowColHeaders; + ZoomScale; + ZoomScaleNormal; + + //Nodes +End; + +/////////////////////////////////////////////////////////////// +/// TPageLayout +/////////////////////////////////////////////////////////////// +type TPageLayout=class(NodeInfo) + Function Create(); overload; + Begin + Create('pageSetup'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + //TODO... + End; + + Function GetAttrs(); override; + Begin + return array('scale':Scale,'fitToWidth':FitToWidth,'fitToHeight':FitToHeight,'paperSize':PaperSize,'orientation':Orientation,'blackAndWhite':BlackAndWhite,'firstPageNumber':FirstPageNumber,'errors':CellError,'draft':Draft,'cellComments':CellComments) union ExtAttr; + End; + + Function GetChildren(); override; + Begin + return ExtNodes; + End; + + //Attributes + Scale; + FitToWidth; + FitToHeight; + PaperSize; + Orientation; + BlackAndWhite; + FirstPageNumber; + CellError; + Draft; + CellComments; + + //Nodes +End; + +/////////////////////////////////////////////////////////////// +/// TAppProperty +/////////////////////////////////////////////////////////////// +type TAppProperty=class(NodeInfo) + Function Create(); overload; + Begin + Create('Properties'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + //TODO... + End; + + Function GetAttrs(); override; + Begin + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + return array(("name":"Application", "obj":Application,"attrEx":"","nodeType":"pcdata","attrName":""),("name":"DocSecurity", "obj":DocSecurity,"attrEx":"","nodeType":"pcdata","attrName":"") + ,("name":"ScaleCrop", "obj":ScaleCrop,"attrEx":"","nodeType":"pcdata","attrName":""),("name":"Company", "obj":Company,"attrEx":"","nodeType":"pcdata","attrName":"") + ,("name":"LinksUpToDate", "obj":LinksUpToDate,"attrEx":"","nodeType":"pcdata","attrName":""),("name":"SharedDoc", "obj":SharedDoc,"attrEx":"","nodeType":"pcdata","attrName":"") + ,("name":"HyperlinksChanged", "obj":HyperlinksChanged,"attrEx":"","nodeType":"pcdata","attrName":""),("name":"AppVersion", "obj":AppVersion,"attrEx":"","nodeType":"pcdata","attrName":"") + ) union ExtNodes; + End; + + //Attributes + + //Nodes + Application; + DocSecurity; + ScaleCrop; + Company; + LinksUpToDate; + SharedDoc; + HyperlinksChanged; + AppVersion; +End; + +/////////////////////////////////////////////////////////////// +/// TBr +/////////////////////////////////////////////////////////////// +type TBr=class(NodeInfo) + Function Create(); overload; + Begin + Create('w:br'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + //TODO... + End; + + Function GetAttrs(); override; + Begin + return array('w:type':Type) union ExtAttr; + End; + + Function GetChildren(); override; + Begin + return ExtNodes; + End; + + //Attributes + Type; + + //Nodes +End; + +/////////////////////////////////////////////////////////////// +/// TwFont +/////////////////////////////////////////////////////////////// +type TwFont=class(NodeInfo) + Function Create(); overload; + Begin + Create('w:rFonts'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + //TODO... + End; + + Function GetAttrs(); override; + Begin + return array('w:eastAsia':eastAsia,'w:eastAsiaTheme':eastAsiaTheme,'w:hAnsi':hAnsi,'w:hAnsiTheme':hAnsiTheme,'w:hint':hint,'w:ascii':ascii,'w:asciiTheme':asciiTheme,'w:cs':cs,'w:csTheme':csTheme) union ExtAttr; + End; + + Function GetChildren(); override; + Begin + return ExtNodes; + End; + + //Attributes + eastAsia; + eastAsiaTheme; + hAnsi; + hAnsiTheme; + hint; + ascii; + asciiTheme; + cs; + csTheme; + + //Nodes +End; + +/////////////////////////////////////////////////////////////// +/// TwrPr +/////////////////////////////////////////////////////////////// +type TwrPr=class(NodeInfo) + Function Create(); overload; + Begin + Create('w:rPr'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + Font := new TwFont('w:rFonts'); + //TODO... + End; + + Function GetAttrs(); override; + Begin + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + return array(("name":Font.NodeName, "obj":Font,"attrEx":"","nodeType":"","attrName":""),("name":"w:b", "obj":Bold,"attrEx":"","nodeType":"empty","attrName":"") + ,("name":"w:bCs", "obj":bCs,"attrEx":"","nodeType":"empty","attrName":""),("name":"w:i", "obj":I,"attrEx":"","nodeType":"empty","attrName":"") + ,("name":"w:strike", "obj":Strike,"attrEx":"","nodeType":"empty","attrName":""),("name":"w:dstrike", "obj":dStrike,"attrEx":"w:val","nodeType":"","attrName":"") + ,("name":"w:sz", "obj":Size,"attrEx":"w:val","nodeType":"","attrName":""),("name":"w:szCs", "obj":szCs,"attrEx":"w:val","nodeType":"","attrName":"") + ,("name":"w:u", "obj":U,"attrEx":"w:val","nodeType":"","attrName":""),("name":"w:vertAlign", "obj":vertAlign,"attrEx":"w:val","nodeType":"","attrName":"") + ,("name":"w:lang", "obj":Lang,"attrEx":"w:val","nodeType":"","attrName":""),("name":"w:lang", "obj":eastAsia,"attrEx":"w:eastAsia","nodeType":"","attrName":"") + ) union ExtNodes; + End; + + //Attributes + + //Nodes + Font; + Bold; + bCs; + I; + Strike; + dStrike; + Size; + szCs; + U; + vertAlign; + Lang; + eastAsia; +End; + +/////////////////////////////////////////////////////////////// +/// TwpPr +/////////////////////////////////////////////////////////////// +type TwpPr=class(NodeInfo) + Function Create(); overload; + Begin + Create('w:pPr'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + rPr := new TwrPr('w:rPr'); + //TODO... + End; + + Function GetAttrs(); override; + Begin + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + return array(("name":rPr.NodeName, "obj":rPr,"attrEx":"","nodeType":"","attrName":"")) union ExtNodes; + End; + + //Attributes + + //Nodes + rPr; +End; + +/////////////////////////////////////////////////////////////// +/// TcNvGraphicFramePr +/////////////////////////////////////////////////////////////// +type TcNvGraphicFramePr=class(NodeInfo) + Function Create(); overload; + Begin + Create('wp:TcNvGraphicFramePr'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + //TODO... + End; + + Function GetAttrs(); override; + Begin + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + return array(("name":"a:graphicFrameLocks", "obj":noChangeAspect,"attrEx":"noChangeAspect","nodeType":"","attrName":""),("name":"a:graphicFrameLocks", "obj":xmlns,"attrEx":"xmlns:a","nodeType":"","attrName":"") + ) union ExtNodes; + End; + + //Attributes + + //Nodes + noChangeAspect; + xmlns; +End; + +/////////////////////////////////////////////////////////////// +/// TnvPicPr +/////////////////////////////////////////////////////////////// +type TnvPicPr=class(NodeInfo) + Function Create(); overload; + Begin + Create('pic:nvPicPr'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + //TODO... + End; + + Function GetAttrs(); override; + Begin + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + return array(("name":"pic:cNvPr", "obj":Name,"attrEx":"name","nodeType":"","attrName":""),("name":"pic:cNvPr", "obj":ID,"attrEx":"id","nodeType":"","attrName":"") + ,("name":"pic:cNvPr", "obj":Descr,"attrEx":"descr","nodeType":"","attrName":"")) union ExtNodes; + End; + + //Attributes + + //Nodes + Name; + ID; + Descr; +End; + +/////////////////////////////////////////////////////////////// +/// TprstGeom +/////////////////////////////////////////////////////////////// +type TprstGeom=class(NodeInfo) + Function Create(); overload; + Begin + Create('a:prstGeom'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + //TODO... + End; + + Function GetAttrs(); override; + Begin + return array('prst':prst) union ExtAttr; + End; + + Function GetChildren(); override; + Begin + return ExtNodes; + End; + + //Attributes + prst; + + //Nodes +End; + +/////////////////////////////////////////////////////////////// +/// TpicsPpr +/////////////////////////////////////////////////////////////// +type TpicsPpr=class(NodeInfo) + Function Create(); overload; + Begin + Create('pic:spPr'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + PrstGeom := new TprstGeom('a:prstGeom'); + XFrm := new TXfrm('a:xfrm'); + //TODO... + End; + + Function GetAttrs(); override; + Begin + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + return array(("name":PrstGeom.NodeName, "obj":PrstGeom,"attrEx":"","nodeType":"","attrName":""),("name":XFrm.NodeName, "obj":XFrm,"attrEx":"","nodeType":"","attrName":"") + ) union ExtNodes; + End; + + //Attributes + + //Nodes + PrstGeom; + XFrm; +End; + +/////////////////////////////////////////////////////////////// +/// TFill +/////////////////////////////////////////////////////////////// +type TFill=class(NodeInfo) + Function Create(); overload; + Begin + Create('pic:blipFill'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + //TODO... + End; + + Function GetAttrs(); override; + Begin + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + return array(("name":"a:blip", "obj":blip,"attrEx":"r:embed","nodeType":"","attrName":"")) union ExtNodes; + End; + + //Attributes + + //Nodes + blip; +End; + +/////////////////////////////////////////////////////////////// +/// TPic +/////////////////////////////////////////////////////////////// +type TPic=class(NodeInfo) + Function Create(); overload; + Begin + Create('pic:pic'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + nvPicPr := new TnvPicPr('pic:nvPicPr'); + Fill := new TFill('pic:blipFill'); + spPr := new TpicsPpr('pic:spPr'); + //TODO... + End; + + Function GetAttrs(); override; + Begin + return array('xmlns:pic':xmlns) union ExtAttr; + End; + + Function GetChildren(); override; + Begin + return array(("name":nvPicPr.NodeName, "obj":nvPicPr,"attrEx":"","nodeType":"","attrName":""),("name":Fill.NodeName, "obj":Fill,"attrEx":"","nodeType":"","attrName":"") + ,("name":spPr.NodeName, "obj":spPr,"attrEx":"","nodeType":"","attrName":"")) union ExtNodes; + End; + + //Attributes + xmlns; + + //Nodes + nvPicPr; + Fill; + spPr; +End; + +/////////////////////////////////////////////////////////////// +/// TGraphicData +/////////////////////////////////////////////////////////////// +type TGraphicData=class(NodeInfo) + Function Create(); overload; + Begin + Create('a:graphicData'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + Pic := new TPic('pic:pic'); + //TODO... + End; + + Function GetAttrs(); override; + Begin + return array('uri':uri) union ExtAttr; + End; + + Function GetChildren(); override; + Begin + return array(("name":"c:chart", "obj":R,"attrEx":"xmlns:r","nodeType":"","attrName":""),("name":"c:chart", "obj":Rid,"attrEx":"r:id","nodeType":"","attrName":"") + ,("name":"c:chart", "obj":C,"attrEx":"xmlns:c","nodeType":"","attrName":""),("name":Pic.NodeName, "obj":Pic,"attrEx":"","nodeType":"","attrName":"") + ) union ExtNodes; + End; + + //Attributes + uri; + + //Nodes + R; + Rid; + C; + Pic; +End; + +/////////////////////////////////////////////////////////////// +/// TGraphic +/////////////////////////////////////////////////////////////// +type TGraphic=class(NodeInfo) + Function Create(); overload; + Begin + Create('a:graphic'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + GraphicData := new TGraphicData('a:graphicData'); + //TODO... + End; + + Function GetAttrs(); override; + Begin + return array('xmlns:a':xmlns) union ExtAttr; + End; + + Function GetChildren(); override; + Begin + return array(("name":GraphicData.NodeName, "obj":GraphicData,"attrEx":"","nodeType":"","attrName":"")) union ExtNodes; + End; + + //Attributes + xmlns; + + //Nodes + GraphicData; +End; + +/////////////////////////////////////////////////////////////// +/// TwInline +/////////////////////////////////////////////////////////////// +type TwInline=class(NodeInfo) + Function Create(); overload; + Begin + Create('wp:inline'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + cNvGraphicFramePr := new TcNvGraphicFramePr('wp:cNvGraphicFramePr'); + Graphic := new TGraphic('a:graphic'); + //TODO... + End; + + Function GetAttrs(); override; + Begin + return array('distR':distR,'distL':distL,'distB':distB,'distT':distT) union ExtAttr; + End; + + Function GetChildren(); override; + Begin + return array(("name":"wp:extent", "obj":cy,"attrEx":"cy","nodeType":"","attrName":""),("name":"wp:extent", "obj":cx,"attrEx":"cx","nodeType":"","attrName":"") + ,("name":"wp:effectExtent", "obj":r,"attrEx":"r","nodeType":"","attrName":""),("name":"wp:effectExtent", "obj":b,"attrEx":"b","nodeType":"","attrName":"") + ,("name":"wp:effectExtent", "obj":t,"attrEx":"t","nodeType":"","attrName":""),("name":"wp:effectExtent", "obj":l,"attrEx":"l","nodeType":"","attrName":"") + ,("name":"wp:docPr", "obj":Name,"attrEx":"name","nodeType":"","attrName":""),("name":"wp:docPr", "obj":ID,"attrEx":"id","nodeType":"","attrName":"") + ,("name":"wp:docPr", "obj":Descr,"attrEx":"descr","nodeType":"","attrName":""),("name":cNvGraphicFramePr.NodeName, "obj":cNvGraphicFramePr,"attrEx":"","nodeType":"","attrName":"") + ,("name":Graphic.NodeName, "obj":Graphic,"attrEx":"","nodeType":"","attrName":"")) union ExtNodes; + End; + + //Attributes + distR; + distL; + distB; + distT; + + //Nodes + cy; + cx; + r; + b; + t; + l; + Name; + ID; + Descr; + cNvGraphicFramePr; + Graphic; +End; + +/////////////////////////////////////////////////////////////// +/// TwDrawing +/////////////////////////////////////////////////////////////// +type TwDrawing=class(NodeInfo) + Function Create(); overload; + Begin + Create('w:drawing'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + WInline := new TwInline('wp:inline'); + //TODO... + End; + + Function GetAttrs(); override; + Begin + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + return array(("name":WInline.NodeName, "obj":WInline,"attrEx":"","nodeType":"","attrName":"")) union ExtNodes; + End; + + //Attributes + + //Nodes + WInline; +End; + +/////////////////////////////////////////////////////////////// +/// TRun +/////////////////////////////////////////////////////////////// +type TRun=class(NodeInfo) + Function Create(); overload; + Begin + Create('w:r'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + rPr := new TwrPr('w:rPr'); + Br := new TBr('w:br'); + Drawing := new TwDrawing('w:drawing'); + //TODO... + End; + + Function GetAttrs(); override; + Begin + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + return array(("name":rPr.NodeName, "obj":rPr,"attrEx":"","nodeType":"","attrName":""),("name":"w:t", "obj":Text,"attrEx":"","nodeType":"pcdata","attrName":"") + ,("name":Br.NodeName, "obj":Br,"attrEx":"","nodeType":"","attrName":""),("name":Drawing.NodeName, "obj":Drawing,"attrEx":"","nodeType":"","attrName":"") + ) union ExtNodes; + End; + + //Attributes + + //Nodes + rPr; + Text; + Br; + Drawing; +End; + +/////////////////////////////////////////////////////////////// +/// TParagraph +/////////////////////////////////////////////////////////////// +type TParagraph=class(NodeInfo, DocumentPart) + Function Create(); overload; + Begin + Create('w:p'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + pPr := new TwpPr('w:pPr'); + Run := new TRun('w:r'); + //TODO... + End; + + Function GetAttrs(); override; + Begin + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + return array(("name":pPr.NodeName, "obj":pPr,"attrEx":"","nodeType":"","attrName":""),("name":Run.NodeName, "obj":Run,"attrEx":"","nodeType":"","attrName":"") + ) union ExtNodes; + End; + + //Attributes + + //Nodes + pPr; + Run; +End; + +/////////////////////////////////////////////////////////////// +/// TwBody +/////////////////////////////////////////////////////////////// +type TwBody=class(NodeInfo, DocumentBody) + Function Create(); overload; + Begin + Create('w:body'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + Parts := array(); + //TODO... + End; + + Function GetAttrs(); override; + Begin + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + return array(("name":"w:p", "obj":Parts,"attrEx":"","nodeType":"","attrName":"","arrObj":"array")) union ExtNodes; + End; + + //Attributes + + //Nodes + Parts; +End; + +/////////////////////////////////////////////////////////////// +/// TwTcPr +/////////////////////////////////////////////////////////////// +type TwTcPr=class(NodeInfo) + Function Create(); overload; + Begin + Create('w:tcPr'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + //TODO... + End; + + Function GetAttrs(); override; + Begin + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + return array(("name":"w:tcW", "obj":Width,"attrEx":"w:w","nodeType":"","attrName":""),("name":"w:tcW", "obj":Type,"attrEx":"w:type","nodeType":"","attrName":"") + ,("name":"w:shd", "obj":Shd,"attrEx":"w:val","nodeType":"","attrName":""),("name":"w:shd", "obj":Color,"attrEx":"w:color","nodeType":"","attrName":"") + ,("name":"w:shd", "obj":Fill,"attrEx":"w:fill","nodeType":"","attrName":"")) union ExtNodes; + End; + + //Attributes + + //Nodes + Width; + Type; + Shd; + Color; + Fill; +End; + +/////////////////////////////////////////////////////////////// +/// TwTc +/////////////////////////////////////////////////////////////// +type TwTc=class(NodeInfo) + Function Create(); overload; + Begin + Create('w:tc'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + TcPr := new TwTcPr('w:tcPr'); + P := new TParagraph('w:p'); + //TODO... + End; + + Function GetAttrs(); override; + Begin + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + return array(("name":TcPr.NodeName, "obj":TcPr,"attrEx":"","nodeType":"","attrName":""),("name":P.NodeName, "obj":P,"attrEx":"","nodeType":"","attrName":"") + ) union ExtNodes; + End; + + //Attributes + + //Nodes + TcPr; + P; +End; + +/////////////////////////////////////////////////////////////// +/// TwTrPr +/////////////////////////////////////////////////////////////// +type TwTrPr=class(NodeInfo) + Function Create(); overload; + Begin + Create('w:trPr'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + //TODO... + End; + + Function GetAttrs(); override; + Begin + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + return array(("name":"w:trHeight", "obj":Height,"attrEx":"w:val","nodeType":"","attrName":""),("name":"w:trHeight", "obj":Rule,"attrEx":"w:hRule","nodeType":"","attrName":"") + ,("name":"w:jc", "obj":JC,"attrEx":"w:val","nodeType":"","attrName":"")) union ExtNodes; + End; + + //Attributes + + //Nodes + Height; + Rule; + JC; +End; + +/////////////////////////////////////////////////////////////// +/// TwTr +/////////////////////////////////////////////////////////////// +type TwTr=class(NodeInfo) + Function Create(); overload; + Begin + Create('w:tr'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + TrPr := new TwTrPr('w:trPr'); + Tc := array(); + //TODO... + End; + + Function GetAttrs(); override; + Begin + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + return array(("name":TrPr.NodeName, "obj":TrPr,"attrEx":"","nodeType":"","attrName":""),("name":"w:tc", "obj":Tc,"attrEx":"","nodeType":"","attrName":"","arrObj":"array") + ) union ExtNodes; + End; + + //Attributes + + //Nodes + TrPr; + Tc; +End; + +/////////////////////////////////////////////////////////////// +/// TwTblPr +/////////////////////////////////////////////////////////////// +type TwTblPr=class(NodeInfo) + Function Create(); overload; + Begin + Create('w:tblPr'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + //TODO... + End; + + Function GetAttrs(); override; + Begin + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + return array(("name":"w:tblStyle", "obj":Style,"attrEx":"w:val","nodeType":"","attrName":""),("name":"w:tblW", "obj":W,"attrEx":"w:w","nodeType":"","attrName":"") + ,("name":"w:tblW", "obj":Type,"attrEx":"w:type","nodeType":"","attrName":""),("name":"w:tblLook", "obj":Val,"attrEx":"w:val","nodeType":"","attrName":"") + ,("name":"w:tblLook", "obj":NoVBand,"attrEx":"w:noVBand","nodeType":"","attrName":""),("name":"w:tblLook", "obj":NoHBand,"attrEx":"w:noHBand","nodeType":"","attrName":"") + ,("name":"w:tblLook", "obj":LastRow,"attrEx":"w:lastRow","nodeType":"","attrName":""),("name":"w:tblLook", "obj":LastColumn,"attrEx":"w:lastColumn","nodeType":"","attrName":"") + ,("name":"w:tblLook", "obj":FirstRow,"attrEx":"w:firstRow","nodeType":"","attrName":""),("name":"w:tblLook", "obj":FirstColumn,"attrEx":"w:firstColumn","nodeType":"","attrName":"") + ) union ExtNodes; + End; + + //Attributes + + //Nodes + Style; + W; + Type; + Val; + NoVBand; + NoHBand; + LastRow; + LastColumn; + FirstRow; + FirstColumn; +End; + +/////////////////////////////////////////////////////////////// +/// TwGridCol +/////////////////////////////////////////////////////////////// +type TwGridCol=class(NodeInfo) + Function Create(); overload; + Begin + Create('w:gridCol'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + //TODO... + End; + + Function GetAttrs(); override; + Begin + return array('w:w':W) union ExtAttr; + End; + + Function GetChildren(); override; + Begin + return ExtNodes; + End; + + //Attributes + W; + + //Nodes +End; + +/////////////////////////////////////////////////////////////// +/// TwTblGrid +/////////////////////////////////////////////////////////////// +type TwTblGrid=class(NodeInfo) + Function Create(); overload; + Begin + Create('w:tblGrid'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + GridCol := array(); + //TODO... + End; + + Function GetAttrs(); override; + Begin + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + return array(("name":"w:gridCol", "obj":GridCol,"attrEx":"","nodeType":"","attrName":"","arrObj":"array")) union ExtNodes; + End; + + //Attributes + + //Nodes + GridCol; +End; + +/////////////////////////////////////////////////////////////// +/// TTable +/////////////////////////////////////////////////////////////// +type TTable=class(NodeInfo, DocumentTable) + Function Create(); overload; + Begin + Create('w:tbl'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + TblPr := new TwTblPr('w:tblPr'); + TblGrid := new TwTblGrid('w:tblGrid'); + TR := array(); + //TODO... + End; + + Function GetAttrs(); override; + Begin + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + return array(("name":TblPr.NodeName, "obj":TblPr,"attrEx":"","nodeType":"","attrName":""),("name":TblGrid.NodeName, "obj":TblGrid,"attrEx":"","nodeType":"","attrName":"") + ,("name":"w:node", "obj":Node,"attrEx":"","nodeType":"","attrName":""),("name":"w:tr", "obj":TR,"attrEx":"","nodeType":"","attrName":"","arrObj":"array") + ) union ExtNodes; + End; + + Function Style(styleId); + Begin + TblPr.Style := styleId; + End; + + //Attributes + + //Nodes + TblPr; + TblGrid; + Node; + TR; +End; + +/////////////////////////////////////////////////////////////// +/// TCoreProperties +/////////////////////////////////////////////////////////////// +type TCoreProperties=class(NodeInfo, CoreProperties) + Function Create(); overload; + Begin + Create('w:p'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + //TODO... + End; + + Function GetAttrs(); override; + Begin + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + return ExtNodes; + End; + + //Attributes + + //Nodes +End; + +/////////////////////////////////////////////////////////////// +/// TPicture +/////////////////////////////////////////////////////////////// +type TPicture=class(NodeInfo, DocumentPicture) + Function Create(); overload; + Begin + Create('w:p'); + End; + + Function Create(name); overload; + Begin + Class(NodeInfo).Create(name); + Init(); + End; + + Function Init(); + Begin + pPr := new TwpPr('w:pPr'); + Run := new TRun('w:r'); + //TODO... + End; + + Function GetAttrs(); override; + Begin + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + return array(("name":pPr.NodeName, "obj":pPr,"attrEx":"","nodeType":"","attrName":""),("name":Run.NodeName, "obj":Run,"attrEx":"","nodeType":"","attrName":"") + ) union ExtNodes; + End; + + //Attributes + + //Nodes + pPr; + Run; +End; + diff --git a/funcext/TSOffice/TSExcelFile.tsf b/funcext/TSOffice/TSExcelFile.tsf new file mode 100644 index 0000000..d1fb401 --- /dev/null +++ b/funcext/TSOffice/TSExcelFile.tsf @@ -0,0 +1,882 @@ +Type TSExcelFile = Class + ///Version: V1.0 2022-08-08 + ///适用于 Microsoft Excel? 2007 及以上版本创建的电子表格文档。支持 XLSX / XLSM / XLTM / XLTX 等多种文档格式。 + ///纯TSL模块实现 + ///Excel文件读写接口 + + //缺省构造函数 + Function Create(); overload; + Begin + init(); + End; + + //构造函数,打开已经存在的excel文件 + //alias: string,文件目录别名 + //fname: string,文件名 + Function Create(alias, fname); overload; + Begin + init(); + OpenFile(alias, fname); + End; + + //析构函数 + Function Destory(); + Begin + End; + + //初始化 + Function init(); + Begin + zipfile_ := new ZipFile(); + xml_ := new xlsxXml(); + End; + + ///打开excel文件 + ///alias: string,文件目录别名 + ///fname: string,文件名 + ///返回:[err, errmsg] + Function OpenFile(alias, fname); + Begin + if not ifObj(zipfile_) then return array(-1, 'Create ZipFile object fail.'); + [err, errmsg] := zipfile_.Open(alias, fname); + if err=0 then Begin + workbook_ := new xlsxWorkBook(zipfile_, xml_); + workbook_.Load(); + End; + return array(err, errmsg); + End; + + ///新建excel文件 + ///返回:[err, info] + Function NewFile(); + Begin + path := ExtractFileDir(ExtractFileDir(PluginPath())); +{$IFNDEF Win32} + defaultFileName := path + '\\funcext\\TSOffice\\default.xlsx'; +{$ELSE} + defaultFileName := path + '/funcext/TSOffice/default.xlsx'; +{$ENDIF} + [err, errinfo] := OpenFile('', defaultFileName); + if not err then return array(err, errinfo); + + if not ifObj(zipfile_) then return array(-1, 'Create ZipFile object fail.'); + zipfile_.Add(xml_.GetFileName('rels'), xml_.XmlHeader() + xml_.GetTemplate('rels')); + zipfile_.Add(xml_.GetFileName('docProps_app'), xml_.XmlHeader() + xml_.GetTemplate('docProps_app')); + zipfile_.Add(xml_.GetFileName('docProps_core'), xml_.XmlHeader() + xml_.GetTemplate('docProps_core')); + zipfile_.Add(xml_.GetFileName('workbook_rels'), xml_.XmlHeader() + xml_.GetTemplate('workbook_rels')); + zipfile_.Add(xml_.GetFileName('theme1'), xml_.XmlHeader() + xml_.GetTemplate('theme1')); + zipfile_.Add(xml_.GetFileName('sheet1'), xml_.XmlHeader() + xml_.GetTemplate('sheet1')); + zipfile_.Add(xml_.GetFileName('styles'), xml_.XmlHeader() + xml_.GetTemplate('styles')); + zipfile_.Add(xml_.GetFileName('workbook'), xml_.XmlHeader() + xml_.GetTemplate('workbook')); + zipfile_.Add(xml_.GetFileName('Content_Types'), xml_.XmlHeader() + xml_.GetTemplate('Content_Types')); + workbook_ := new xlsxWorkBook(zipfile_, xml_); + workbook_.Load(); + return array(0, 'ok'); + End; + + ///保存文件 + ///返回: [err, info] + Function Save(); + Begin + return zipfile_.Save(); + End; + + ///另存为 + ///alias: string,文件目录别名 + ///fname: string,文件名 + ///返回: [err, info] + Function SaveAs(alias, fname); + Begin + return zipfile_.Save(alias, fname); + End; + + ///真实文件名 + ///返回:string + Function FileName(); + Begin + return zipfile_.FileName(); + End; + + ///获取工作表列表 + ///返回: arry('Sheet1','Sheet2') + Function GetSheets(); + Begin + return workbook_.GetSheets(); + End; + + ///获取工作表数 + ///返回: integer + Function GetSheetsCount(); + Begin + return workbook_.GetSheetsCount(); + End; + + ///获取工作表名 + ///index: int,工作表索引 + ///返回: [err, sheetname:string] + Function GetSheetName(index); + Begin + return workbook_.GetSheets()[index]; + End; + + ///设置工作表名 + ///sourceName: string, 原工作表名 + ///destName: string,目标工作表名 + ///返回:[err, errinfo] + Function SetSheetName(sourceName, destName); + Begin + return workbook_.SetSheetName(sourceName, destName); + End; + + ///创建新sheet + ///sheet: string,工作表名称 + ///返回: [err, info] + Function NewSheet(sheet); + Begin + return workbook_.NewSheet(sheet); + End; + + ///删除sheet + ///sheet: string,工作表名称 + ///返回: [err, info] + Function DeleteSheet(sheet); + Begin + return workbook_.DeleteSheet(sheet); + End; + + ///获取总列数 + ///sheet: string,工作表名称 + ///返回: [err, TotalCols:int] + Function TotalCols(sheet); + Begin + o := workbook_.GetSheetObj(sheet); + if ifObj(o) then return array(0, o.TotalCols()); + return array(-1, ''); + End; + + ///获取总行数 + ///sheet: string,工作表名称 + ///返回: [err, TotalRows:int] + Function TotalRows(sheet); + Begin + o := workbook_.GetSheetObj(sheet); + if ifObj(o) then return array(0, o.TotalRows()); + return array(-1, ''); + End; + + ///获取单元格的值 + ///sheet: string,工作表名称 + ///axis: string,单元格坐标,如: "A6" + ///返回: [err, value:string] + Function GetCellValue(sheet, axis); + Begin + o := workbook_.GetSheetObj(sheet); + if ifObj(o) then return o.GetCellValue(axis); + return array(-1, ''); + End; + + ///设置单元格的值 + ///sheet: string,工作表名称 + ///axis: string,单元格坐标,如: "A6" + ///val: Var,可以是整数、字符串、数值型等;nil 不设置值(可以调用ClearCell方法清空单元格),只设置属性 + ///[opt:Tany],可选参数,单元格属性,可以是xml字符串或天软数组 + /// xml串:opt := ''; + /// 数组: opt := array('t':'s', 's':'1'); + /// 属性t:单元格数据类型,不设置的话,数据类型为val的数据类型; + /// t ->('s' 共享字符串、'b' bool 类型、'e' 错误类型、'inlineStr' 内联字符串类型、nil 数字类型、'str' 公式类型) + /// 属性s:单元格样式 + ///返回: [err, info] + Function SetCellValue(sheet, axis, val, opt); + Begin + o := workbook_.GetSheetObj(sheet); + if ifObj(o) then return array(0, o.SetCellValue(axis, val, opt)); + return array(-1, ''); + End; + + ///获取富文本格式 + ///sheet: string,工作表名称 + ///axis: string,单元格,如"A7" + ///返回: [err, richtxt:string],参见SetCellRichText + Function GetCellRichText(sheet, axis); + Begin + o := workbook_.GetSheetObj(sheet); + if ifObj(o) then return o.GetCellValue(axis, 'RichText'); + return array(-1, ''); + End; + + ///设置富文本格式 + ///sheet: string,工作表名称 + ///axis: string,单元格,如"A7" + ///richtext: string,xml串或富文本对象TSOffice('TRichText') + ///返回: [err, info] + Function SetCellRichText(sheet, axis, richtext); + Begin + o := workbook_.GetSheetObj(sheet); + if ifObj(o) then Begin + if ifObj(richtext) then + richtext := class(xlsxXml).Dom2Xml(richtext.Marshal()); + return array(0, o.SetCellValue(axis, richtext, array('t':'s'), 'RichText')); + End; + return array(-1, 'The Sheet is not exist.'); + End; + + ///清空单元格 + ///sheet: string,工作表名称 + ///[TopLeft: string],左上角坐标,可选参数 + ///[BottomRight: string],右下角坐标,可选参数, + /// 用法1:ClearCell(); //Clear整个sheet + /// 用法2:ClearCell('A2'); //Clear 'A2'单元格 + /// 用法3:ClearCell('A5', 'D8'); //Clear矩形区间所有单元格 + ///返回: [err, info] + Function ClearCell(sheet, TopLeft, BottomRight); + Begin + o := workbook_.GetSheetObj(sheet); + if ifObj(o) then return array(0, o.ClearCell(TopLeft, BottomRight)); + return array(-1, ''); + End; + + ///设置公式 + ///sheet: string,工作表名称 + ///axis: string,单元格,如"A7" + ///formula: string,公式 + ///返回: [err, info] + Function SetCellFormula(sheet, axis, formula); + Begin + o := workbook_.GetSheetObj(sheet); + if ifObj(o) then return o.SetCellFormula(axis, formula); + return array(-1, ''); + End; + + ///获取公式 + ///sheet: string,工作表名称 + ///axis: string,单元格,如"A7" + ///返回: [err, formula:string] + Function GetCellFormula(sheet, axis); + Begin + o := workbook_.GetSheetObj(sheet); + if ifObj(o) then return o.GetCellFormula(axis); + return array(-1, ''); + End; + + ///按行赋值 + ///sheet: string,工作表名称 + ///axis: string,起始坐标,如: "A4" + ///slice: array(),一维数组array(1,2,3,2,1,"hello") + ///返回: [err, info] + Function SetSheetRow(sheet, axis, slice); + Begin + [err, col, row] := CellNameToCoordinates(axis); + if err then + return array(err, col); + for i:=0 to length(slice)-1 do Begin + [err, cell] := CoordinatesToCellName(col + i, row); + //println('{}->{}',cell,slice[i]); + SetCellValue(sheet, cell, slice[i]); + End; + return array(0, 'ok'); + End; + + ///插入数据表 + ///sheet: string,工作表名称 + ///axis: string,左上角坐标,如: "A4" + ///data: table,数据表 + ///[IncludeHeader: bool] 是否包括表头,默认FALSE + ///[IncludeIndex: bool] 是否自动添加索引号,默认FALSE + ///返回: [err, info] + Function InsertTable(sheet, axis, data, IncludeHeader, IncludeIndex); + Begin + if not ifarray(data) or length(data)=0 then + return array(-1, "Invalid Data."); + if FieldCount(data)=0 then Begin //数据是一维数组 + return SetSheetRow(sheet, axis, data); + End; + [err, colNum, rowNum] := CellNameToCoordinates(axis); + if err then + return array(err, colNum); + if IncludeHeader then Begin + fields := FieldNames(data); + if IncludeIndex then Begin + fields := array("Index") union fields; + End; + [err, info] := SetSheetRow(sheet, axis, fields); + if err then + return array(err, info); + rowNum ++; + End; + if IncludeIndex then Begin + for i:=0 to length(data)-1 do Begin + [err, cell] := CoordinatesToCellName(colNum, rowNum + i); + if err then + return array(err, cell); + SetCellValue(sheet, cell, i+1); + End; + colNum ++; + End; + for i:=0 to length(data)-1 do Begin + [err, cell] := CoordinatesToCellName(colNum, rowNum + i); + if err then + return array(err, cell); + t := sselect * from data where thisrowindex = i End; + //PrintLn("cell={},data={}->{}",cell, data[i],t); + [err, info] := SetSheetRow(sheet, cell, t); + if err then + return array(err, info); + End; + return array(0, "OK"); + End; + + ///读取数据表 + ///sheet: string,工作表名称 + ///TopLeft: string,左上角坐标,如: "A4" + ///BottomRight: string,右下角坐标,如: "B8",为空获取从TopLeft开始的整张表 + ///返回: [err, data:table] + Function GetTable(sheet, TopLeft, BottomRight); + Begin + o := workbook_.GetSheetObj(sheet); + if ifObj(o) then return array(0, o.Import(TopLeft, BottomRight)); + return array(-1, ''); + End; + + ///插入列,在指定列前插入空白列 + ///sheet: string,工作表名称 + ///col: string 列名,如: "D" + ///返回: [err, info] + Function InsertCol(sheet, col); + Begin + return workbook_.InsertCol(sheet, col); + End; + + ///插入行,在指定列前插入空白行 + ///sheet: string,工作表名称 + ///row: int + ///返回: [err, info] + Function InsertRow(sheet, row); + Begin + return workbook_.InsertRow(sheet, row); + End; + + ///删除列 + ///sheet: string,工作表名称 + ///col: string,如: "D" + ///返回: [err, info] + Function RemoveCol(sheet, col); + Begin + return workbook_.RemoveCol(sheet, col); + End; + + ///删除行 + ///sheet: string,工作表名称 + ///row: int + ///返回: [err, info] + Function RemoveRow(sheet, row); + Begin + return workbook_.RemoveRow(sheet, row); + End; + + ///设置行高度 + ///sheet: string,工作表 + ///row: int,行 + ///height: double + ///返回: [err, info] + Function SetRowHeight(sheet, row, height); + Begin + return workbook_.SetRowHeight(sheet, row, height); + End; + + ///获取行高度 + ///sheet: string,工作表 + ///row: int,行 + ///返回: [err, info] + Function GetRowHeight(sheet, row); + Begin + return workbook_.GetRowHeight(sheet, row); + End; + + ///设置列宽度 + ///sheet: string,工作表 + ///startcol: string,开始列,如: "A" + ///endcol: string,结束列,如: "D" + ///width: double + ///返回: [err, info] + Function SetColWidth(sheet, startCol, endCol, width); + Begin + return workbook_.SetColWidth(sheet, startCol, endCol, width); + End; + + ///获取列宽度 + ///sheet: string,工作表 + ///col: int,列 + ///返回: [err, info] + Function GetColWidth(sheet, col); + Begin + return workbook_.GetColWidth(sheet, col); + End; + + ///设置工作表默认列宽 + ///sheet: string,工作表 + ///width:double + ///返回: [err, info] + Function SetSheetDefaultColWidth(sheet, width); + Begin + return workbook_.SetSheetDefaultColWidth(sheet, width); + End + + ///获取工作表默认列宽 + ///sheet: string,工作表 + ///返回: [err, width] + Function GetSheetDefaultColWidth(sheet); + Begin + return workbook_.GetSheetDefaultColWidth(sheet); + End + + ///添加批注 + ///sheet: string,工作表名称 + ///axis: string,单元格,如"A7" + ///Author:string + ///comment: string + ///返回: [err, info] + Function AddComment(sheet, axis, Author, comment); + Begin + o := getOj(sheet, 'xlsxComment'); + if not ifObj(o) then return array(1, 'The sheet is not exist.'); + return o.AddComment(axis, Author, comment); + End; + + ///添加图表 + ///sheet: string,工作表名称 + ///range:string,图表所处矩形区域,"A5:F10" + ///chart:TChart对象 + ///返回: [err, info] + Function AddChart(sheet, range, chart); + Begin + o := getOj(sheet, 'xlsxChart'); + if not ifObj(o) then return array(1, 'The sheet is not exist.'); + if not ifObj(chart) then return array(2, 'Invalid chart param.'); + return o.AddChart(range, chart); + End; + + ///获取图表列表 + ///sheet: string,工作表名称 + ///返回: [err, ChartList] + Function GetCharts(sheet); + Begin + return workbook_.GetCharts(sheet); + End; + + ///单元格坐标切分 + ///cell: string,单元格坐标 + ///返回: [err, col:string, row:int],"AK47" -> return array(0, "AK", 47); + Function SplitCellName(cell); + Begin + return xlsx_call("SplitCellName", cell); + End; + + ///单元格坐标组合 + ///col: string + ///row: int + ///返回 [err, cell:string],参见SplitCellName + Function JoinCellName(col, row); + Begin + return xlsx_call("JoinCellName", col, row); + End; + + ///列名转索引 + ///name: string + ///返回 [err, index:int],"AK" -> return array(0, 37); + Function ColumnNameToNumber(name); + Begin + return xlsx_call("ColumnNameToNumber", name); + End; + + ///索引转列名 + ///index: int + ///返回 [err, name:string],37 -> return array(0, "AK"); + Function ColumnNumberToName(index); + Begin + return xlsx_call("ColumnNumberToName", index); + End; + + ///单元格坐标转索引 + ///cell: string + ///返回 [err, col:int, row: int] "A2" -> [1,2] + Function CellNameToCoordinates(cell); + Begin + return xlsx_call("CellNameToCoordinates", cell); + End; + + ///索引转单元格坐标 + ///col: int + ///row: int + ///abs: bool ,true返回"$A$1"格式,false返回"A1"格式 + ///返回 [err, cell:string] [1,2,true] -> "$A$2" + Function CoordinatesToCellName(col, row, abs); + Begin + return xlsx_call("CoordinatesToCellName", col, row, abs); + End; + + ///RGB与HSL色彩空间色值转换 + ///r: int + ///g: int + ///b: int + ///返回: [err, h:double, s:double, l:double] + Function RGBToHSL(r, g, b); + Begin + return xlsx_call("RGBToHSL", r, g, b); + End; + + ///HSL与RGB色彩空间色值转换 + ///h: double + ///s: double + ///l: double + ///返回: [err, r:int, g:int, b:int] + Function HSLToRGB(sheet, h, s, l); + Begin + return xlsx_call("HSLToRGB", h, s, l); + End; + + ///新建样式对象 + ///style: TStyle对象 + ///返回: styleid + Function NewStyle(style); + Begin + styleObj := new xlsxStyles('', self); + return array(0, styleObj.GetStyleId(style)); + End + + ///设置单元格样式 + ///sheet: string,工作表名称 + ///TopLeft: string,左上角坐标 + ///BottomRight: string,右下角坐标 + ///styleid: string,样式Id + ///返回: [err, info] + Function SetCellStyle(sheet, TopLeft, BottomRight, styleid); + Begin + o := workbook_.GetSheetObj(sheet); + if ifObj(o) then return array(0, o.SetCellStyle(TopLeft, BottomRight, styleid)); + return array(-1, ''); + End; + + ///获取单元格样式Id,获取到的Id可以在复制单元格样式时,作为调用 SetCellValue、或SetCellStyle 函数的参数使用。 + ///sheet: string,工作表名称 + ///axis: string,单元格,如"A7" + ///返回: [err, datastyle: int] + Function GetCellStyle(sheet, axis); + Begin + o := workbook_.GetSheetObj(sheet); + if ifObj(o) then return array(0, o.GetCellStyle(axis)); + return array(-1, 'The sheet is not exist.'); + End; + + ///设置工作表页眉页脚 + ///sheet:string,工作表名称 + ///headerFooter: xlsxHeaderFooter对象 + ///返回:[err, info] + Function SetSheetHeaderFooter(sheet, headerFooter); + Begin + o := getOj(sheet, 'xlsxHeaderFooter'); + if not ifObj(o) then return array(0, 'HeaderFooter对象不存在'); + o.SetHeaderFooter(headerFooter); + return array(1, ''); + End + + ///设置工作表可见性 + ///sheet: string, 工作表名称 + ///visible: bool + ///返回:[err, info] + Function SetSheetVisible(sheet, visible); + Begin + return workbook_.SetSheetVisible(sheet, visible); + End + + ///获取工作表可见性 + ///sheet: string,工作表名称 + ///返回: [err, visibility: bool] + Function GetSheetVisible(sheet); + Begin + return workbook_.GetSheetVisible(sheet); + End; + + ///设置行可见性 + ///sheet: string,工作表 + ///row: int,行 + ///visible: bool + ///返回: [err, info] + Function SetRowVisible(sheet, row, visible) + Begin + return workbook_.SetRowVisible(sheet, row, visible); + End + + ///获取工作表行可见性 + ///sheet: string,工作表名称 + ///row: int, 行 + ///返回: [err, visible:int] + Function GetRowVisble(sheet, row); + Begin + return workbook_.GetRowVisble(sheet, row); + End + + ///设置列可见性 + ///sheet: string,工作表 + ///col: string,列,如:'A' + ///visible: bool + ///返回: [err, info] + Function SetColVisible(sheet, col, visible) + Begin + [err, col] := ColumnNameToNumber(col); + if err then return array(-1, col); + return workbook_.SetColVisible(sheet, col, visible); + End + + ///获取工作表列可见性 + ///sheet: string,工作表名称 + ///col: string,列 + ///返回: [err, visible:int] + Function GetColVisble(sheet, col); + Begin + [err, col] := ColumnNameToNumber(col); + if err then return array(-1, col); + return workbook_.GetColVisble(sheet, col); + End + + ///设置工作表页边距 + ///sheet: string,工作表名称 + ///margins: TMargins 对象 + ///返回: [err, info] + Function SetPageMargins(sheet, margins); + Begin + o := getOj(sheet, 'xlsxMargins'); + if not ifObj(o) then return array(0, 'The sheet is not exist'); + o.SetPageMargins(margins); + return array(0, ''); + End; + + ///获取工作表页边距 + ///sheet: string,工作表名称 + ///返回: [err, info] + ///无错误时返回TMargins对象 + Function GetPageMargins(sheet); + Begin + o := getOj(sheet, 'xlsxMargins'); + if not ifObj(o) then return array(0, 'The sheet is not exist'); + return o.GetPageMargins(); + End; + + ///合并单元格 + ///sheet: string,工作表名称 + ///hcell: string,左上角坐标 + ///vcell: string,右下角坐标 + ///返回: [err, info] + Function MergeCell(sheet, hcell, vcell); + Begin + return workbook_.MergeCell(sheet, hcell, vcell); + End; + + ///取消合并单元格 + ///sheet: string,工作表名称 + ///hcell: string,左上角坐标 + ///vcell: string,右下角坐标 + ///返回: [err, info] + Function UnMergeCell(sheet, hcell, vcell); + Begin + return workbook_.UnMergeCell(sheet, hcell, vcell); + End; + + ///设置工作表视图属性 + ///sheet: string,工作表名称 + ///viewIndex: int,视图索引 + ///sheet: object,TSheetView对象 + ///返回: [err, info] + Function SetSheetViewOptions(sheet, viewIndex, sheetView); + Begin + o := getOj(sheet, 'xlsxSheetView'); + if not ifObj(o) then return array(1, 'The sheet is not exist'); + return o.SetSheetViewOptions(viewIndex, sheetView); + End; + + ///获取工作表视图属性 + ///sheet: string,工作表名称 + ///viewindex: int,视图索引,viewIndex 可以是负数,如果是这样,则向后计数(-1 代表最后一个视图) + ///返回: [err, SheetView] + Function GetSheetViewOptions(sheet, viewIndex); + Begin + o := getOj(sheet, 'xlsxSheetView'); + if not ifObj(o) then return array(0, 'The sheet is not exist'); + return o.GetSheetViewOptions(viewIndex); + End; + + ///设置工作表页面布局 + ///sheet: string,工作表名称 + ///pageLayout: pageLayout对象,属性: + /// BlackAndWhite bool //BlackAndWhite specified print black and white. + /// FirstPageNumber int //FirstPageNumber specified the first printed page number. If no value is specified, then 'automatic' is assumed. + /// PageLayoutOrientation string //PageLayoutOrientation defines the orientation of page layout for a worksheet. + /// PageLayoutPaperSize int //PageLayoutPaperSize defines the paper size of the worksheet. + /// FitToHeight int //FitToHeight specified the number of vertical pages to fit on. + /// FitToWidth int //FitToWidth specified the number of horizontal pages to fit on. + /// PageLayoutScale int //PageLayoutScale defines the print scaling. This attribute is restricted to values ranging from 10 (10%) to 400 (400%). This setting is overridden when fitToWidth and/or fitToHeight are in use. + ///返回: [err, info] + Function SetPageLayout(sheet, pageLayout); + Begin + o := getOj(sheet, 'xlsxPageLayout'); + if not ifObj(o) then return array(1, 'The sheet is not exist'); + return o.SetPageLayout(sheet, pageLayout); + End; + + ///获取工作表页面布局 + ///sheet: string,工作表名称 + ///返回: [err, option:pageLayout对象] + Function GetPageLayout(sheet); + Begin + o := getOj(sheet, 'xlsxPageLayout'); + if not ifObj(o) then return array(1, 'The sheet is not exist'); + return o.GetPageLayout(); + End; + + ///设置工作簿应用程序属性 + ///appProps: TAppProperty对象,属性: + /// Application string + /// ScaleCrop bool + /// DocSecurity int + /// Company string + /// LinksUpToDate bool + /// HyperlinksChanged bool + /// AppVersion string + ///返回: [err, info] + Function SetAppProps(appProps); + Begin + o := getOj('', 'xlsxAppProperty'); + if not ifObj(o) then return array(1, 'AppProperty error!'); + return o.SetAppProps(appProps); + End; + + ///获取应用程序属性 + ///返回: [err, props:TAppProperty对象] + Function GetAppProps(); + Begin + o := getOj('', 'xlsxAppProperty'); + if not ifObj(o) then return array(1, 'AppProperty error!'); + return o.GetAppProps(); + End; + + ///sheet: string,工作表名称 + ///返回: [err, info] + Function SetDefaultSheet(sheet); + Begin + return workbook_.SetDefaultSheet(sheet); + End + + ///返回:[err, sheet] + Function GetDefaultSheet(); + Begin + return workbook_.GetDefaultSheet(); + End + + ///设置工作表背景图片 + ///pictrue: 图片对象 + ///返回: [err, info] + Function SetSheetBackground(sheet, pictrue); + Begin + o := getOj(sheet, 'xlsxImage'); + if not ifObj(o) then return array(1, 'The sheet is not exist.'); + return o.SetSheetBackground(sheet); + End; + + ///设置超链接 + ///sheet: string,工作表名称 + ///axis: string,单元格,如"A7" + ///hyplink:THyperLink对象 + ///返回: [err, info] + Function SetCellHyperLink(sheet, axis, hyperlink); + Begin + o := getOj(sheet, 'xlsxHyperLink'); + if not ifObj(o) then return array(1, 'The sheet is not exist.'); + return o.SetCellHyperLink(axis, hyperlink); + End; + + ///获取超链接 + ///sheet: string,工作表名称 + ///axis: string,单元格,如"A7" + ///返回: [err, hyperlink: THyperLink对象] + Function GetCellHyperLink(sheet, axis); + Begin + o := getOj(sheet, 'xlsxHyperLink'); + if not ifObj(o) then return array(1, 'The sheet is not exist.'); + return o.GetCellHyperLink(axis); + End; + + Function WorkBook(); + Begin + return workbook_; + End; + + Function XmlObj(); + Begin + return xml_; + End; + + Function Zip(); + Begin + return zipfile_; + End; + +private + Function getOj(sheetname, objname); + Begin + if not ifarray(objMgr_) then objMgr_:= array(); + k := sheetname + '.' + objname; + o := objMgr_[ k ]; + if not ifnil(o) then return o; + case objname of + 'xlsxMargin': + o := class(xlsxMargin).NewObject(sheetname, self); + 'xlsxComment': + o := class(xlsxComment).NewObject(sheetname, self); + 'xlsxStyles': + o := class(xlsxStyles).NewObject(sheetname, self); + 'xlsxChart': + return class(xlsxChart).NewObject(sheetname, self);//不缓存xlsxChart对象 + 'xlsxHeaderFooter': + o := class(xlsxHeaderFooter).NewObject(sheetname, self); + 'xlsxMargins': + o := class(xlsxMargins).NewObject(sheetname, self); + 'xlsxSheetView': + o := class(xlsxSheetView).NewObject(sheetname, self); + 'xlsxPageLayout': + o := class(xlsxPageLayout).NewObject(sheetname, self); + 'xlsxAppProperty': + return class(xlsxAppProperty).NewObject(self); + 'xlsxImage': + o := class(xlsxImage).NewObject(sheetname, self); + 'xlsxHyperLink': + o := class(xlsxHyperLink).NewObject(sheetname, self); + End; + if ifObj(o) then objMgr_[k] := o; + return o; + End; + + { + TODO// 需要移除,待完成 + ///设置工作表默认行高 + ///sheet: string,工作表 + ///height:double + ///返回: [err, info] + Function SetSheetDefaultRowHeight(sheet, height); + Begin + return workbook_.SetSheetDefaultRowHeight(sheet, height); + End + + ///获取工作表默认行高 + ///sheet: string,工作表 + ///返回: [err, height] + Function GetSheetDefaultRowHeight(sheet); + Begin + return workbook_.GetSheetDefaultRowHeight(sheet); + End + } + + + zipfile_; //压缩文件对象 + workbook_; //WorkBook对象 + xml_; //xlsxXml对象 + objMgr_; //各种对象缓存、管理 +End; diff --git a/funcext/TSOffice/TSUtils/NodeInfo.tsf b/funcext/TSOffice/TSUtils/NodeInfo.tsf new file mode 100644 index 0000000..02b35f1 --- /dev/null +++ b/funcext/TSOffice/TSUtils/NodeInfo.tsf @@ -0,0 +1,136 @@ +Type NodeInfo = class + +public + Function Create(name); + Begin + NodeName := name; + ExtAttr := array(); + ExtNodes := array(); + End + + Function GetAttrs(); virtual; + Begin + return ExtAttr; + End + + Function GetChildren(); virtual; + Begin + return ExtNodes; + End + + Function GetNode(index); // 返回的index的对象 + Begin + return ExtNodes[index]['obj']; + End + + Function GetCount(); // 返回当前节点的个数 + Begin + return length(ExtAttr); + End + + // arr := array('sz': 15, 'style': 'line'); + Function AddAttr(arr); // 添加属性 + Begin + if not istable(arr) then return; + ExtAttr union= arr; + return 1; + End + + Function Marshal(); + Begin + children := getChildrenEx(); + child_arr := array(); + len := 0; + for i:=0 to length(children)-1 do + begin + node_type := children[i]['nodeType']; + obj := children[i]['obj']; + + if ifnil(obj) then continue; + find := select thisrowindex as "rowindex_", * from child_arr where ['name'] = children[i]['name'] end; + if not ifnil(obj) and not ifObj(obj) and istable(find) and ifstring(children[i]['attrEx']) and children[i]['attrEx'] <> '' then + begin + if not ifarray(find[0]['attributes']) then find[0]['attributes'] := array(); + key := children[i]['attrEx']; + find[0]['attributes'] union= array(key : obj); + child_arr[find[0]['rowindex_']]['attributes'] := find[0]['attributes']; + continue; + end + + arr := array('type': 'element', 'name': children[i]['name'], 'attributes': array()); + if node_type = 'empty' then // + begin + // child_arr[len] := arr; + // ++len; + // continue; + end + else if node_type = 'pcdata' then + begin + arr['children'] := array(('type': 'pcdata', 'value': obj)); + end + else if ifObj(obj) then + begin + marshal := obj.Marshal(); + if length(marshal['children'])=0 and length(marshal['attributes'])=0 then continue; + arr['children'] := marshal['children']; + arr['attributes'] union= marshal['attributes']; + end + else + begin + key := children[i]['attrName'] ? children[i]['attrName'] : children[i]['attrEx'] ? children[i]['attrEx'] : 'val'; + arr['attributes'] := array(key : obj); + end + + child_arr[len++] := arr; + end + + name_arr := str2array(NodeName, '/'); + tmp_arr := array('type': 'element', 'name': name_arr[length(name_arr)-1], 'children': child_arr); + for i:=length(name_arr)-2 downto 0 do + begin + tmp_arr := array('type': 'element', 'name': name_arr[i], 'children': array(tmp_arr)); + end + + attrs_arr := GetAttrs(); + valid_arr := array(); + for k, v in attrs_arr do + begin + if not ifnil(v) then valid_arr[k] := v; + end + tmp_arr['attributes'] := valid_arr; + return tmp_arr; + End + + Function NewChildNode(nodeArr); + Begin + if not ifarray(nodeArr) then return 0; + if not ifstring(nodeArr['name']) then return 0; + arr := array( + 'name': nodeArr['name'], + 'obj': nodeArr['obj'], + 'attrEx': nodeArr['attrEx'], + 'nodeType': nodeArr['nodeType'], + ); + ExtNodes union= arr; + return 1; + End +private + Function getChildrenEx(); + Begin + r := GetChildren(); + a := array(); + for i:=0 to length(r)-1 do Begin + if ifarray(r[i]['obj']) then Begin + a union= r[i]['obj']; + End + else + a[ length(a) ] := r[i]; + end; + return a; + End; +public + NodeName; + ExtAttr; + ExtNodes; + +End diff --git a/funcext/TSOffice/TSUtils/TSImage.tsf b/funcext/TSOffice/TSUtils/TSImage.tsf new file mode 100644 index 0000000..0599fc2 --- /dev/null +++ b/funcext/TSOffice/TSUtils/TSImage.tsf @@ -0,0 +1,219 @@ +Type TSImage = Class + Function Create(stream); overload; + Begin + content_ := stream; + imageDef := array(('Png', 0, (0x89, 'P', 'N', 'G', 0x0d, 0x0a, 0x1a, 0x0a)), + ('Jfif',6,'JFIF'), + ('Exif',6,'Exif'), + ('Gif',0,'GIF87a'), + ('Gif',0,'GIF89a'), + ('Tiff',0,('M','M',0x00,'*')), + ('Tiff',0,('I', 'I', '*', 0x00)), + ('Bmp',0,'BM')); + ind := getImageDef(stream, imageDef); + if ind >= 0 then Begin + case imageDef[ind][0] of + 'Gif': + [px_width, px_height, horz_dpi, vert_dpi] := gif_dimensions(stream); + 'Bmp': + [px_width, px_height, horz_dpi, vert_dpi] := bmp_dimensions(stream); + 'Tiff': + [px_width, px_height, horz_dpi, vert_dpi] := tiff_dimensions(stream, imageDef[ind][2]); + End; + End; + println('width={},height={}',px_width, px_height); + end; + + Function Width(); + Begin + return integer((px_width / horz_dpi) * 914400); + End; + + Function Height(); + Begin + return integer((px_height / vert_dpi) * 914400); + End; + (* + Function exif_dimensions(stream, r); + Begin + start := 0; + code := nil; + while code <> 0xd9 do Begin + [code, off] := _exif_next(start); + case code of + 0xe0: + Begin + segment_length := _read_int(stream, off, '', 2); + density_units := _read_int(stream, off + 9, '', 1); + horz_dpi := read_int(stream, off + 10, '', 2); + vert_dpi := read_int(stream, off + 12, '', 2); + End; + End; + start := off + segment_length; + End; + End; + + Function _exif_next(start); + Begin + while 1 do Begin + position := _offset_of_next_ff_byte(start); + [position, byte_] = _next_non_ff_byte(position+1); + start := position + 1; + if byte_ = 0x00 then continue; + marker_code := byte_; + segment_offset := position + 1; + break; + End; + return array(marker_code, segment_offset); + End; + + Function _offset_of_next_ff_byte(start); + Begin + for i:=start to length(content_)-1 do Begin + byte_ := ord(content_[i]); + if byte_ <> 0xff then return array(start - 1, byte_); + return array(start, 0); + End; + + Function _next_non_ff_byte(start); + Begin + for i:=start to length(content_)-1 do Begin + byte_ := ord(content_[i]); + if byte_ = 0xff then return start - 1; + return start; + End; + *) + Function tiff_dimensions(stream, r); + Begin + off := _read_int(stream, 4, r[0], 4); + count := _read_int(stream, off, r[0], 2); + m := array(); + for i:=0 to count-1 do Begin + dir_entry_offset := off + 2 + i*12; + tag_code := _read_int(stream, dir_entry_offset, r[0], 2); + field_type := _read_int(stream, dir_entry_offset + 2, r[0], 2); + value_count := _read_int(stream, dir_entry_offset + 4, r[0], 4); + value_offset := _read_int(stream, dir_entry_offset + 8, r[0], 4); + case field_type of + 2: + val := stream[value_offset:value_offset+value_count-1]; + 3: + if value_count=1 then + val := _read_int(stream, dir_entry_offset + 8, r[0], 2); + 4: + if value_count=1 then + val := _read_int(stream, dir_entry_offset + 8, r[0], 4); + 5: + if value_count=1 then Begin + numerator := _read_int(stream, value_offset, r[0], 4); + denominator := _read_int(stream, value_offset + 4, r[0], 4); + val := numerator / denominator; + End; + End; +println('off={}, tag={},type={},value_count={},value_off={},val={}',off, tag_code,field_type,value_count,value_offset,val); + m[tag_code] := val; + End; + px_width := m[256]; + px_height := m[257]; + horz_dpi := _tiff_dpi(282, m); + vert_dpi := _tiff_dpi(283, m); + return array(px_width, px_height, horz_dpi, vert_dpi); + End; + + Function _read_int(stream, off, t, size); + Begin + stm := new TMemoryStream(); + if t = 'M' then Begin + s := ''; + setlength(s, 8); + for i:=0 to size-1 do Begin + s[i] := stream[off + size - i - 1]; + End; + stm.Write(s, size); + End + else Begin + stm.Write(stream[off:off + 7], size); + End; + stm.Seek(0); + v := 0; + stm.Read(v, size); + return v; + End; + + Function bmp_dimensions(stream); + Begin + s := new TMemoryStream(); + s.Write(stream[0:63], 64); + s.Seek(0x12); + px_width := 0; + s.Read(px_width, 4); + px_height := 0; + s.Read(px_height, 4); + s.Seek(0x26); + horz_px_per_meter := 0; + s.Read(horz_px_per_meter, 4); + vert_px_per_meter := 0; + s.Read(vert_px_per_meter, 4); + horz_dpi := _bmp_dpi(horz_px_per_meter); + vert_dpi := _bmp_dpi(vert_px_per_meter); + return array(px_width, px_height, horz_dpi, vert_dpi); + End; + + Function gif_dimensions(stream); + Begin + s := new TMemoryStream(); + s.Write(stream[6:9], 4); + s.Seek(0); + px_width := 0; + s.Read(px_width, 2); + px_height := 0; + s.Read(px_height, 2); + return array(px_width, px_height, 72, 72); + End; + + Function getImageDef(stream, imageDef); + Begin + for i:=0 to length(imageDef)-1 do Begin + off := imageDef[i][1]; + len := length(imageDef[i][2]); + buf := stream[off:off+len-1]; + if eq(buf, imageDef[i][2]) then Begin + return i; + End; + End; + return -1; + End; + + Function eq(buf, r); + Begin + for i:=0 to length(buf)-1 do Begin + c := ifstring(r) ? r[i + 1] : r[i]; + if ifint(c) then c := chr(c); + if c <> buf[i+1] then return 0; + End; + return 1; + End; + + Function _tiff_dpi(tag, m); + Begin + if not ifint(m[tag]) then return 72; + v := ifint(m[296]) ? m[296] : 2; + if v = 1 then return 72; + units_per_inch := (v=2 ? 2.54 : 1); + dots_per_unit := m[tag]; + return integer(round(dots_per_unit * units_per_inch)); + End; + + Function _bmp_dpi(px_per_meter); + Begin + if px_per_meter = 0 then return 96; + return integer(round(px_per_meter * 0.0254)); + End; + + Name; + content_; + px_width:integer; + px_height:integer; + horz_dpi:integer; + vert_dpi:integer; +End; \ No newline at end of file diff --git a/funcext/TSOffice/TSUtils/xlsxXml.tsf b/funcext/TSOffice/TSUtils/xlsxXml.tsf new file mode 100644 index 0000000..e1906cf --- /dev/null +++ b/funcext/TSOffice/TSUtils/xlsxXml.tsf @@ -0,0 +1,176 @@ +Type xlsxXml = Class + map_; + ///缺省构造函数 + Function Create(); overload; + Begin + map_ := array( + 'Content_Types':('FileName':'[Content_Types].xml','Template':''), + 'rels':('FileName':'_rels/.rels','Template':''), + 'docProps_app':('FileName':'docProps/app.xml','Template':'0TSExcel'), + 'docProps_core':('FileName':'docProps/core.xml','Template':'xuri2006-09-16T00:00:00Z2006-09-16T00:00:00Z'), + 'calcChain':('FileName':'xl/calcChain.xml','Template':''), + 'sharedStrings':('FileName':'xl/sharedStrings.xml','Template':''), + 'styles':('FileName':'xl/styles.xml','Template':''), + 'workbook':('FileName':'xl/workbook.xml','Template':''), + 'sheet1':('FileName':'xl/worksheets/sheet1.xml','Template':''), + 'theme1':('FileName':'xl/theme/theme1.xml','Template':''), + 'workbook_rels':('FileName':'xl/_rels/workbook.xml.rels','Template':''), + 'sheet_rels':('FileName':'','Template':''), + 'SheetContentType':('FileName':'','Template':'application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml'), + 'RelationshipWorkSheet':('FileName':'','Template':'http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet') + ); + End; + + Function XmlHeader(); + Begin + return ' \n'; + End; + + Function GetFileName(key); + Begin + if ifarray(map_[key]) then return map_[key]['FileName']; + return ''; + End; + + Function GetTemplate(key); + Begin + if ifarray(map_[key]) then return map_[key]['Template']; + return ''; + End; + + class Function Dom2Xml(r); + Begin + xml := new XmlFile(); + xml.Data := ''; + xml.IsXml := 1; + node := xml.FirstChild(); + node.Unmarshal(r); + return string(node.Data); + End; + + class Function Xml2Dom(xmlstr, bAllDoc); + Begin + xml := new XmlFile(); + xml.Data := xmlstr; + xml.IsXml := 1; + if bAllDoc then + return string(xml.Marshal()); + return string(xml.FirstChild().Marshal()); + End; + + class Function SetNodeValue(obj, r); + Begin + arr := str2array(r[0], '/'); + for i:=0 to length(arr)-1 do Begin + node := i=0 ? obj.FirstChild(arr[i]) : node.FirstChild(arr[i]); + if not ifObj(node) then return; + End; + if ifNil(r[2]) then return; + if r[1] = 'pcdata' then Begin + node.FirstChild().SetValue(r[2]); + return; + End; + if r[1] = 'Del' and r[2] then Begin + node.DeleteChildren(); + return; + End; + if r[1] = 'val' then Begin + node.SetAttribute('val', r[2]); + return; + End; + if r[1] = 'unmarshal' then Begin + node.DeleteChildren(); + node.Unmarshal(r[2]); + //node.Print; + return; + End; + End; + + class Function UpdateNode(node, attrs, children); + Begin + fields := getstrindexs(attrs); + for i:=0 to length(fields)-1 do Begin + node.SetAttribute(fields[i], attrs[ fields[i] ]); + End; + for i:=0 to length(children)-1 do Begin + if children[i]['type'] = 'pcdata' then + child := node.FirstChild(); + else + child := node.FirstChild(children[i]['name']); + if not ifObj(child) then + child := node.InsertFirstChild(children[i]['type'], children[i]['name']); + + if children[i]['type'] = 'pcdata' then + child.SetValue(children[i]['value']); + else + class(xlsxXml).UpdateNode(child, children[i]['attributes'], children[i]['children']); + End; + End; + + class Function GetNode(obj, r); + Begin + arr := str2array(r, '/'); + for i:=0 to length(arr)-1 do Begin + node := i=0 ? obj.FirstChild(arr[i]) : node.FirstChild(arr[i]); + if not ifObj(node) then return nil; + End; + return node; + End; + + class Function RemoveNode(obj, r); + Begin + arr := str2array(r, '/'); + nodeArr := array(); + for i:=0 to length(arr)-1 do Begin + node := i=0 ? obj.FirstChild(arr[i]) : node.FirstChild(arr[i]); + nodeArr[i] := node; + if not ifObj(node) then return; + End; + cnt := length(arr); + if cnt > 1 and length(arr) = length(nodeArr) and ifObj(nodeArr[cnt - 1]) then + nodeArr[cnt - 2].DeleteChild(nodeArr[cnt - 1]); + End; + + class Function FindRelationshipRid(xmlfile, prefix); + Begin + rId := 0; + findtarget := ''; + node := xmlfile.FirstChildElement('Relationships').FirstChildElement('Relationship'); + while ifObj(node) do Begin + id := node.GetAttribute('Id'); + if ifstring(id) and leftstr(id,3)='rId' then Begin + i := strtoint(rightstr(id, length(id)-3)); + if i > rId then rId := i; + End; + if prefix <> '' then Begin + target := node.GetAttribute("Target"); + if AnsiStartsText(prefix, target) then Begin + findtarget := target; + break; + End; + End; + node := node.NextElement(); + End; + return array(rID, findtarget); + End; + + class Function FindRelationship(xmlfile, rid); + Begin + node := xmlfile.FirstChildElement('Relationships').FirstChildElement('Relationship'); + while ifObj(node) do Begin + id := node.GetAttribute('Id'); + if id = rid then return node; + node := node.NextElement(); + End; + return nil; + End; + + class Function AddRelationshipRid(xmlfile, target, type, rid, targetMode); + Begin + node := xmlfile.FirstChildElement('Relationships').InsertEndChild('element', 'Relationship'); + node.SetAttribute('Id', rid); + node.SetAttribute('Type', type); + node.SetAttribute('Target', target); + if not ifnil(targetMode) then node.SetAttribute('TargetMode', targetMode); + End; +End; diff --git a/funcext/TSOffice/default.xlsx b/funcext/TSOffice/default.xlsx new file mode 100644 index 0000000..2da418d Binary files /dev/null and b/funcext/TSOffice/default.xlsx differ diff --git a/funcext/TSOffice/worksheet/xlsxAppProperty.tsf b/funcext/TSOffice/worksheet/xlsxAppProperty.tsf new file mode 100644 index 0000000..a5268db --- /dev/null +++ b/funcext/TSOffice/worksheet/xlsxAppProperty.tsf @@ -0,0 +1,50 @@ +Type xlsxAppProperty = Class + Function Create(file); overload; + Begin + file_ := file; + End; + + Function SetAppProps(appProps); + Begin + app_xml := file_.WorkBook().GetXmlFileObj('docProps/app.xml'); + node := app_xml.FirstChildElement('Properties'); + if not ifObj(node) then return array(1, "node::Properties can't be found"); + children_arr := appProps.Marshal()['children']; + for i:=0 to length(children_arr)-1 do + Begin + if children_arr[i]['name'] in array('ScaleCrop', 'LinksUpToDate', 'SharedDoc', 'HyperlinksChanged') then + Begin + children_arr[i]['children'][0]['value'] := children_arr[i]['children'][0]['value'] ? "true" : "false"; + End + delete_node := node.FirstChildElement(children_arr[i]['name']); + node.InsertAfterChild(delete_node, children_arr[i]); + node.DeleteChild(delete_node); + End + return array(0, ''); + End; + + Function GetAppProps(); + Begin + app_xml := file_.WorkBook().GetXmlFileObj('docProps/app.xml'); + node := app_xml.FirstChildElement('Properties'); + marshal := node.Marshal()[0]['children']; + reindex(marshal, marshal[:,'name']); + app_props := TOfficeObj('TAppProperty'); + app_props.Application := marshal['Application']['children'][0]['value']; + app_props.DocSecurity := marshal['DocSecurity']['children'][0]['value']; + app_props.ScaleCrop := marshal['DocSecurity']['children'][0]['value'] = "false" ? 0 : 1; + app_props.Company := marshal['Company']['children'][0]['value']; + app_props.LinksUpToDate := marshal['LinksUpToDate']['children'][0]['value'] = "false" ? 0 : 1; + app_props.SharedDoc := marshal['SharedDoc']['children'][0]['value'] = "false" ? 0 : 1; + app_props.AppVersion := marshal['AppVersion']['children'][0]['value']; + return array(0, app_props); + End + + class Function NewObject(file); + Begin + return new xlsxAppProperty(file); + End; + +private + file_; //TSExcelFile对象 +End; diff --git a/funcext/TSOffice/worksheet/xlsxChart.tsf b/funcext/TSOffice/worksheet/xlsxChart.tsf new file mode 100644 index 0000000..ed32160 --- /dev/null +++ b/funcext/TSOffice/worksheet/xlsxChart.tsf @@ -0,0 +1,1034 @@ +Type xlsxChart = Class + ///缺省构造函数 + Function Create(sheet,excel); overload; + Begin + excel_ := excel; + sheetName_ := sheet; + chartId_ := excel_.WorkBook().GetFilesCount('xl/charts/chart') + 1; + [rid, drawingFileName, sheetFileName_, relsfile] := excel_.WorkBook().GetRelationshipRid(sheet, '../drawings/drawing'); + if drawingFileName = '' then Begin + rid++; + drawingRID_ := excel_.WorkBook().GetFilesCount('xl/drawings/drawing') + 1; + drawingFileName := '../drawings/drawing' + inttostr(drawingRID_) + '.xml'; + xlDrawingFileName_ := 'xl/drawings/drawing' + inttostr(drawingRID_) + '.xml'; + excel_.Zip().Add(xlDrawingFileName_, excel_.XmlObj().XmlHeader() + ''); + excel_.WorkBook().AddRelationshipRid(relsfile, drawingFileName, 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing', 'rId' + inttostr(rid)); + excel_.WorkBook().AddContentType('application/vnd.openxmlformats-officedocument.drawing+xml', '/' + xlDrawingFileName_); + // + sheetXmlObj := excel_.WorkBook().GetXmlFileObj(sheetFileName_); + node := sheetXmlObj.FirstChild('worksheet').InsertEndChild('element', 'drawing'); + node.SetAttribute('r:id', 'rId' + inttostr(rid)); + End + else Begin + xlDrawingFileName_ := 'xl/drawings/' + ExtractFileName(drawingFileName); + s := RightStr(xlDrawingFileName_, length(xlDrawingFileName_) - 19); + drawingRID_ := strtoint(leftstr(s, length(s) - 4)); + End; + drawingXmlObj_ := excel_.WorkBook().GetXmlFileObj(xlDrawingFileName_); + drawingRels := 'xl/drawings/_rels/drawing' + inttostr(drawingRID_) + '.xml.rels'; + if not excel_.WorkBook().FileIsExist(drawingRels) then Begin + excel_.Zip().Add(drawingRels, excel_.XmlObj().XmlHeader() + ''); + End + drawingRelsObj := excel_.WorkBook().GetXmlFileObj(drawingRels); + [chartRid_, find] := class(xlsxXml).FindRelationshipRid(drawingRelsObj, ''); + excel_.WorkBook().AddRelationshipRid(drawingRels, '../charts/chart'+inttostr(chartId_)+'.xml', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart', 'rId' + inttostr(chartRid_ + 1)); + xlChartFileName_ := 'xl/charts/chart'+inttostr(chartId_)+'.xml'; + excel_.WorkBook().AddContentType('application/vnd.openxmlformats-officedocument.drawingml.chart+xml', '/' + xlChartFileName_); + End; + + class Function NewObject(sheet, excel); + Begin + excel_ := excel; + o := excel_.WorkBook().GetSheetObj(sheet);//sheet存在 + if not ifObj(o, chart) then return 0; + return new xlsxChart(sheet, excel); + End; + + Function AddChart(range, chart); + Begin + a := str2array(range,':'); + if length(a) <> 2 then return array(1,'Invalid params.'); + [err1, col1,row1] := excel_.CellNameToCoordinates(a[0]); + [err2, col2,row2] := excel_.CellNameToCoordinates(a[1]); + if err1 or err2 then return array(1,'Invalid params.'); + o := TOfficeObj('TtwoCellAnchor'); + o.XFrom.Col := col1 - 1; + o.XFrom.ColOff := chart.BegColOff ? chart.BegColOff : 0; + o.XFrom.Row := row1 - 1; + o.XFrom.RowOff := chart.BegRowOff ? chart.BegRowOff : 0; + + o.XTo.Col := col2; + o.XTo.ColOff := chart.EndColOff ? chart.EndColOff : 0; + o.XTo.Row := row2; + o.XTo.RowOff := chart.EndRowOff ? chart.EndRowOff : 0; + + o.GraphicFrame.GraphicFramePr.Name := chart.Name ? chart.Name : 'Chart' + inttostr(chartId_); + o.GraphicFrame.GraphicFramePr.Id := getcNvPrID(drawingXmlObj_); + + o.GraphicFrame.XFrm.Off.X := 0; + o.GraphicFrame.XFrm.Off.Y := 0; + o.GraphicFrame.XFrm.Ext.Cx := 0; + o.GraphicFrame.XFrm.Ext.Cy := 0; + + o.GraphicFrame.Graphic.GraphicData.uri := 'http://schemas.openxmlformats.org/drawingml/2006/chart'; + o.GraphicFrame.Graphic.GraphicData.Rid := 'rId' + inttostr(chartRid_ + 1); + o.GraphicFrame.Graphic.GraphicData.R := 'http://schemas.openxmlformats.org/officeDocument/2006/relationships'; + o.GraphicFrame.Graphic.GraphicData.C := 'http://schemas.openxmlformats.org/drawingml/2006/chart'; + node := drawingXmlObj_.FirstChild('xdr:wsDr').InsertEndChild(o.Marshal()); + + plotArea := getPlotArea(chart);//设置图形 + chartXml := ' + + + + + + + <tx> + <rich> + <a:bodyPr anchorCtr="false" rot="0" spcFirstLastPara="false"></a:bodyPr> + <a:p> + <a:pPr> + <a:defRPr b="false" baseline="0" i="false" kern="1200" spc="0" strike="noStrike" sz="1400" u="none"> + <a:solidFill> + <a:schemeClr val="tx1"> + <a:lumMod val="65000"></a:lumMod> + <a:lumOff val="35000"></a:lumOff> + </a:schemeClr> + </a:solidFill> + <a:latin typeface="+mn-lt"></a:latin> + <a:ea typeface="+mn-ea"></a:ea> + <a:cs typeface="+mn-cs"></a:cs> + </a:defRPr> + </a:pPr> + <a:r> + <a:rPr altLang="en-US" b="false" baseline="0" i="false" kern="0" lang="en-US" spc="0"></a:rPr> + <a:t>Fruit 2D Column Chart</a:t> + </a:r> + </a:p> + </rich> + </tx> + <overlay val="0"></overlay> + <spPr></spPr> + <txPr> + <a:bodyPr anchorCtr="false" rot="0" spcFirstLastPara="false"></a:bodyPr> + <a:p> + <a:pPr> + <a:defRPr b="false" baseline="0" i="false" kern="1200" spc="0" strike="noStrike" sz="14000" u="none"></a:defRPr> + </a:pPr> + <a:endParaRPr lang="en-US"></a:endParaRPr> + </a:p> + </txPr> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +'; + excel_.Zip().Add(xlChartFileName_, chartXml); + obj := excel_.WorkBook().GetXmlFileObj(xlChartFileName_); + task := array(('chartSpace/chart/title/tx/rich/a:p/a:r/a:t', 'pcdata', chart.Title), + ('chartSpace/chart/legend/legendPos', 'val', getLegendPosition(chart.Legend.Position)), + ('chartSpace/chart/dispBlanksAs', 'val', chart.ShowBlanksAs), + ('chartSpace/chart/legend', 'Del', chart.Legend.None), + ('chartSpace/chart/plotArea', 'unmarshal', plotArea.Marshal()), + ('chartSpace/chart/view3D', 'unmarshal', getview3D(chart).Marshal()) + ); + for i:=0 to length(task)-1 do Begin + class(xlsxXml).SetNodeValue(obj, task[i]); + End; + End; +private + Function getview3D(chart); + Begin + view3D := TOfficeObj('TView3D'); + chartView3DRotX := array( + 'area': 0, + 'areastacked': 0, + 'areapercentstacked': 0, + 'area3d': 15, + 'area3dstacked': 15, + 'area3dpercentstacked': 15, + 'bar': 0, + 'barstacked': 0, + 'barpercentstacked': 0, + 'bar3dclustered': 15, + 'bar3dstacked': 15, + 'bar3dpercentstacked': 15, + 'bar3dconeclustered': 15, + 'bar3dconestacked': 15, + 'bar3dconepercentstacked': 15, + 'bar3dpyramidclustered': 15, + 'bar3dpyramidstacked': 15, + 'bar3dpyramidpercentstacked': 15, + 'bar3dcylinderclustered': 15, + 'bar3dcylinderstacked': 15, + 'bar3dcylinderpercentstacked': 15, + 'col': 0, + 'colstacked': 0, + 'colpercentstacked': 0, + 'col3d': 15, + 'col3dclustered': 15, + 'col3dstacked': 15, + 'col3dpercentstacked': 15, + 'col3dcone': 15, + 'col3dconeclustered': 15, + 'col3dconestacked': 15, + 'col3dconepercentstacked': 15, + 'col3dpyramid': 15, + 'col3dpyramidclustered': 15, + 'col3dpyramidstacked': 15, + 'col3dpyramidpercentstacked': 15, + 'col3dcylinder': 15, + 'col3dcylinderclustered': 15, + 'col3dcylinderstacked': 15, + 'col3dcylinderpercentstacked': 15, + 'doughnut': 0, + 'line': 0, + 'pie': 0, + 'pie3d': 30, + 'pieofpiechart': 0, + 'barofpiechart': 0, + 'radar': 0, + 'scatter': 0, + 'surface3d': 15, + 'wireframesurface3d': 15, + 'contour': 90, + 'wireframecontour': 90); + chartView3DRotY := array( + 'area': 0, + 'areastacked': 0, + 'areapercentstacked': 0, + 'area3d': 20, + 'area3dstacked': 20, + 'area3dpercentstacked': 20, + 'bar': 0, + 'barstacked': 0, + 'barpercentstacked': 0, + 'bar3dclustered': 20, + 'bar3dstacked': 20, + 'bar3dpercentstacked': 20, + 'bar3dconeclustered': 20, + 'bar3dconestacked': 20, + 'bar3dconepercentstacked': 20, + 'bar3dpyramidclustered': 20, + 'bar3dpyramidstacked': 20, + 'bar3dpyramidpercentstacked': 20, + 'bar3dcylinderclustered': 20, + 'bar3dcylinderstacked': 20, + 'bar3dcylinderpercentstacked': 20, + 'col': 0, + 'colstacked': 0, + 'colpercentstacked': 0, + 'col3d': 20, + 'col3dclustered': 20, + 'col3dstacked': 20, + 'col3dpercentstacked': 20, + 'col3dcone': 20, + 'col3dconeclustered': 20, + 'col3dconestacked': 20, + 'col3dconepercentstacked': 20, + 'col3dpyramid': 20, + 'col3dpyramidclustered': 20, + 'col3dpyramidstacked': 20, + 'col3dpyramidpercentstacked': 20, + 'col3dcylinder': 20, + 'col3dcylinderclustered': 20, + 'col3dcylinderstacked': 20, + 'col3dcylinderpercentstacked': 20, + 'doughnut': 0, + 'line': 0, + 'pie': 0, + 'pie3d': 0, + 'pieofpiechart': 0, + 'barofpiechart': 0, + 'radar': 0, + 'scatter': 0, + 'surface3d': 20, + 'wireframesurface3d': 20, + 'contour': 0, + 'wireframecontour': 0); + chartView3DPerspective := array( + 'contour': 0, + 'wireframecontour': 0); + chartView3DRAngAx := array( + 'area': 0, + 'areastacked': 0, + 'areapercentstacked': 0, + 'area3d': 1, + 'area3dstacked': 1, + 'area3dpercentstacked': 1, + 'bar': 0, + 'barstacked': 0, + 'barpercentstacked': 0, + 'bar3dclustered': 1, + 'bar3dstacked': 1, + 'bar3dpercentstacked': 1, + 'bar3dconeclustered': 1, + 'bar3dconestacked': 1, + 'bar3dconepercentstacked': 1, + 'bar3dpyramidclustered': 1, + 'bar3dpyramidstacked': 1, + 'bar3dpyramidpercentstacked': 1, + 'bar3dcylinderclustered': 1, + 'bar3dcylinderstacked': 1, + 'bar3dcylinderpercentstacked': 1, + 'col': 0, + 'colstacked': 0, + 'colpercentstacked': 0, + 'col3d': 1, + 'col3dclustered': 1, + 'col3dstacked': 1, + 'col3dpercentstacked': 1, + 'col3dcone': 1, + 'col3dconeclustered': 1, + 'col3dconestacked': 1, + 'col3dconepercentstacked': 1, + 'col3dpyramid': 1, + 'col3dpyramidclustered': 1, + 'col3dpyramidstacked': 1, + 'col3dpyramidpercentstacked': 1, + 'col3dcylinder': 1, + 'col3dcylinderclustered': 1, + 'col3dcylinderstacked': 1, + 'col3dcylinderpercentstacked': 1, + 'doughnut': 0, + 'line': 0, + 'pie': 0, + 'pie3d': 0, + 'pieofpiechart': 0, + 'barofpiechart': 0, + 'radar': 0, + 'scatter': 0, + 'surface3d': 0, + 'wireframesurface3d': 0, + 'contour': 0, + 'bubble': 0, + 'bubble3d': 0); + view3D.RotX := chartView3DRotX[chart.Type]; + view3D.RotY := chartView3DRotY[chart.Type]; + view3D.Perspective := chartView3DPerspective[chart.Type]; + view3D.RAngAx := chartView3DRAngAx[chart.Type]; + return view3D; + End; + + Function getLegendPosition(t); + Begin + m := array("bottom": "b", + "left": "l", + "right": "r", + "top": "t", + "top_right": "tr"); + return m[t]; + End; + + Function getcNvPrID(obj); + Begin + cnt := 2; + node := obj.FirstChild('xdr:wsDr'); + if ifObj(node) then Begin + node := node.FirstChild(); + while ifObj(node) do Begin + if node.GetName() in array('xdr:oneCellAnchor', 'xdr:twoCellAnchor') then + cnt++; + node := node.NextElement(); + End; + End; + return cnt; + End; + + Function getPlotArea(chart); + Begin + o := TOfficeObj('TplotArea'); + chart.Type := lowercase(chart.Type); + case chart.Type of + 'area','areastacked','areapercentstacked','area3d','area3dstacked','area3dpercentstacked','bar','barstacked','barpercentstacked', + 'bar3dclustered','bar3dstacked','bar3dpercentstacked','bar3dconeclustered','bar3dconestacked','bar3dconepercentstacked', + 'bar3dpyramidclustered','bar3dpyramidstacked','bar3dpyramidpercentstacked','bar3dcylinderclustered','bar3dcylinderstacked', + 'bar3dcylinderpercentstacked','col','colstacked','colpercentstacked','col3d','col3dclustered','col3dstacked','col3dpercentstacked', + 'col3dcone','col3dconeclustered','col3dconestacked','col3dconepercentstacked','col3dpyramid','col3dpyramidclustered', + 'col3dpyramidstacked','col3dpyramidpercentstacked','col3dcylinder','col3dcylinderclustered','col3dcylinderstacked', + 'col3dcylinderpercentstacked','bubble','bubble3d': + drawBaseChart(o, chart); + 'doughnut': + Begin + drawExtChart(o, chart, 'doughnutChart'); + o.Chart.HoleSize := 75; + End + 'line': + drawLineChart(o, chart); + 'pie3d': + drawExtChart(o, chart, 'pie3DChart'); + 'pie': + drawExtChart(o, chart, 'pieChart'); + 'pieofpiechart': + Begin + drawExtChart(o, chart, 'ofPieChart'); + o.Chart.OfPieType := 'pie'; + End + 'barofpiechart': + Begin + drawExtChart(o, chart, 'ofPieChart'); + o.Chart.OfPieType := 'bar'; + End + 'radar': + drawRadarChart(o, chart); + 'scatter': + drawScatterChart(o, chart); + 'surface3d','wireframesurface3d': + drawSurface3DChart(o, chart, 'surface3DChart'); + 'contour','wireframecontour': + drawSurface3DChart(o, chart, 'surfaceChart'); + End; + return o; + End; + + Function drawSurface3DChart(o, chart, name); + Begin + o.Chart.NodeName := name; + setChartSer(o, chart); + o.Chart.Axid := 754001152; + o.Chart.Axid2 := 753999904; + o.Chart.Axid3 := 832256642; + setCatAx(o.CatAx, chart); + setValAx(o.ValAx, chart); + setSerAx(o.SerAx, chart); + if chart.Type in array( 'wireframesurface3d', 'wireframecontour' ) then + o.Chart.Wireframe := true; + End; + + Function drawScatterChart(o, chart); + Begin + o.Chart.NodeName := 'scatterChart'; + o.Chart.ScatterStyle := 'smoothMarker'; + o.Chart.VaryColors := false; + setChartSer(o, chart); + setDLbls(o.Chart.DLbls, chart); + o.Chart.Axid := 754001152; + o.Chart.Axid2 := 753999904; + setCatAx(o.CatAx, chart); + setValAx(o.ValAx, chart); + End; + + Function drawRadarChart(o, chart); + Begin + o.Chart.NodeName := 'radarChart'; + o.Chart.RadarStyle := 'marker'; + o.Chart.VaryColors := false; + setChartSer(o, chart); + setDLbls(o.Chart.DLbls, chart); + o.Chart.Axid := 754001152; + o.Chart.Axid2 := 753999904; + setCatAx(o.CatAx, chart); + setValAx(o.ValAx, chart); + End; + + Function drawExtChart(o, chart, name); + Begin + o.Chart.NodeName := name; + o.Chart.VaryColors := chart.VaryColors; + setChartSer(o, chart); + End; + + Function drawLineChart(o, chart); + Begin + o.Chart.NodeName := 'lineChart'; + o.Chart.Grouping := getGrouping(chart.Type); + o.Chart.VaryColors := false; + setChartSer(o, chart); + setDLbls(o.Chart.DLbls, chart); + o.Chart.Smooth := false; + o.Chart.Axid := 754001152; + o.Chart.Axid2 := 753999904; + setCatAx(o.CatAx, chart); + setValAx(o.ValAx, chart); + End; + + Function drawBaseChart(o, chart); + Begin + o.Chart.BarDir := getBarDir(chart.Type); + o.Chart.Grouping := getGrouping(chart.Type); + o.Chart.VaryColors := chart.VaryColors; + o.Chart.Overlap := getVaryColors(chart.Type); + o.Chart.Axid := 754001152; + o.Chart.Axid2 := 753999904; + o.Chart.NodeName := getChartName(chart.Type); + setChartSer(o, chart); + o.Chart.Shape := getSharp(chart.Type); + setDLbls(o.Chart.DLbls, chart); + setCatAx(o.CatAx, chart); + setValAx(o.ValAx, chart); + End; + + Function setSerAx(SerAx, chart); + Begin + SerAx.AxID := 832256642; + SerAx.Scaling.Max := chart.YAxis.Max; + SerAx.Scaling.Min := chart.YAxis.Min; + CatAx.Scaling.Orientation := chart.YAxis.ReverseOrder ? 'maxMin' : 'minMax'; + SerAx.Del := chart.YAxis.None; + SerAx.AxPos := chart.XAxis.ReverseOrder ? 't' : 'b'; + SerAx.TickLblPos := 'nextTo'; + drawPlotAreaSpPr(SerAx.SpPr); + drawPlotAreaTxPr(SerAx.TxPr); + SerAx.CrossAx := 753999904; + End; + + Function setCatAx(CatAx, chart); + Begin + CatAx.AxID := 754001152; + CatAx.Scaling.Max := chart.XAxis.Max; + CatAx.Scaling.Min := chart.XAxis.Min; + CatAx.Scaling.Orientation := chart.XAxis.ReverseOrder ? 'maxMin' : 'minMax'; + CatAx.Del := chart.XAxis.None; + CatAx.AxPos := chart.XAxis.ReverseOrder ? 't' : 'b'; + CatAx.NumFmt.FormatCode := 'General'; + CatAx.NumFmt.SourceLinked := true; + CatAx.MajorTickMark := 'none'; + CatAx.MinorTickMark := 'none'; + CatAx.TickLblPos := 'nextTo'; + drawPlotAreaSpPr(CatAx.SpPr); + drawPlotAreaTxPr(CatAx.TxPr); + CatAx.CrossAx := 753999904; + CatAx.Crosses := 'autoZero'; + CatAx.Auto := true; + CatAx.LblAlgn := 'ctr'; + CatAx.LblOffset := 100; + CatAx.NoMultiLvlLbl := false; + if chart.XAxis.MajorGridlines then + drawPlotAreaSpPr(CatAx.MajorGridlines.SpPr); + if chart.XAxis.MinorGridlines then + drawPlotAreaSpPr(CatAx.MinorGridlines.SpPr); + if chart.XAxis.TickLabelSkip then + CatAx.TickLabelSkip := chart.XAxis.TickLabelSkip; + End; + + Function setValAx(ValAx, chart); + Begin + ValAx.AxID := 753999904; + ValAx.Scaling.Max := chart.YAxis.Max; + ValAx.Scaling.Min := chart.YAxis.Min; + if ifint(chart.YAxis.LogBase) and chart.YAxis.LogBase >= 2 and chart.YAxis.LogBase <= 1000 then + ValAx.Scaling.LogBase := chart.YAxis.LogBase; + ValAx.Scaling.Orientation := chart.YAxis.ReverseOrder ? 'maxMin' : 'minMax'; + ValAx.Del := chart.YAxis.None; + ValAx.AxPos := chart.YAxis.ReverseOrder ? 'r' : 'l'; + ValAx.NumFmt.FormatCode := chartValAxNumFmtFormatCode(chart.Type); + ValAx.NumFmt.SourceLinked := true; + ValAx.MajorTickMark := 'none'; + ValAx.MinorTickMark := 'none'; + ValAx.TickLblPos := 'nextTo'; + drawPlotAreaSpPr(ValAx.SpPr); + drawPlotAreaTxPr(ValAx.TxPr); + ValAx.CrossAx := 754001152; + ValAx.Crosses := 'autoZero'; + ValAx.CrossBetween := chartValAxCrossBetween(chart.Type); + if chart.XAxis.MajorGridlines then + drawPlotAreaSpPr(ValAx.MajorGridlines.SpPr); + if chart.XAxis.MinorGridlines then + drawPlotAreaSpPr(ValAx.MinorGridlines.SpPr); + ValAx.MajorUnit := chart.YAxis.MajorUnit; + if chart.Type in array('contour', 'wireframecontour') then + ValAx.TickLblPos := 'none'; + End; + + Function chartValAxCrossBetween(t); + Begin + m := array( + 'area': ’midCat’, + 'areastacked': ’midCat’, + 'areapercentstacked': ’midCat’, + 'area3d': ’midCat’, + 'area3dstacked': ’midCat’, + 'area3dpercentstacked': ’midCat’, + 'bar': ’between’, + 'barstacked': ’between’, + 'barpercentstacked': ’between’, + 'bar3dclustered': ’between’, + 'bar3dstacked': ’between’, + 'bar3dpercentstacked': ’between’, + 'bar3dconeclustered': ’between’, + 'bar3dconestacked': ’between’, + 'bar3dconepercentstacked': ’between’, + 'bar3dpyramidclustered': ’between’, + 'bar3dpyramidstacked': ’between’, + 'bar3dpyramidpercentstacked': ’between’, + 'bar3dcylinderclustered': ’between’, + 'bar3dcylinderstacked': ’between’, + 'bar3dcylinderpercentstacked': ’between’, + 'col': ’between’, + 'colstacked': ’between’, + 'colpercentstacked': ’between’, + 'col3d': ’between’, + 'col3dclustered': ’between’, + 'col3dstacked': ’between’, + 'col3dpercentstacked': ’between’, + 'col3dcone': ’between’, + 'col3dconeclustered': ’between’, + 'col3dconestacked': ’between’, + 'col3dconepercentstacked': ’between’, + 'col3dpyramid': ’between’, + 'col3dpyramidclustered': ’between’, + 'col3dpyramidstacked': ’between’, + 'col3dpyramidpercentstacked': ’between’, + 'col3dcylinder': ’between’, + 'col3dcylinderclustered': ’between’, + 'col3dcylinderstacked': ’between’, + 'col3dcylinderpercentstacked': ’between’, + 'doughnut': ’between’, + 'line': ’between’, + 'pie': ’between’, + 'pie3d': ’between’, + 'pieofpiechart': ’between’, + 'barofpiechart': ’between’, + 'radar': ’between’, + 'scatter': ’between’, + 'surface3d': ’midCat’, + 'wireframesurface3d': ’midCat’, + 'contour': ’midCat’, + 'wireframecontour': ’midCat’, + 'bubble': ’midCat’, + 'bubble3d': ’midCat’); + return m[t]; + End; + + Function chartValAxNumFmtFormatCode(t); + Begin + m := array( + 'area': 'General', + 'areastacked': 'General', + 'areapercentstacked': '0%', + 'area3d': 'General', + 'area3dstacked': 'General', + 'area3dpercentstacked': '0%', + 'bar': 'General', + 'barstacked': 'General', + 'barpercentstacked': '0%', + 'bar3dclustered': 'General', + 'bar3dstacked': 'General', + 'bar3dpercentstacked': '0%', + 'bar3dconeclustered': 'General', + 'bar3dconestacked': 'General', + 'bar3dconepercentstacked': '0%', + 'bar3dpyramidclustered': 'General', + 'bar3dpyramidstacked': 'General', + 'bar3dpyramidpercentstacked': '0%', + 'bar3dcylinderclustered': 'General', + 'bar3dcylinderstacked': 'General', + 'bar3dcylinderpercentstacked': '0%', + 'col': 'General', + 'colstacked': 'General', + 'colpercentstacked': '0%', + 'col3d': 'General', + 'col3dclustered': 'General', + 'col3dstacked': 'General', + 'col3dpercentstacked': '0%', + 'col3dcone': 'General', + 'col3dconeclustered': 'General', + 'col3dconestacked': 'General', + 'col3dconepercentstacked': '0%', + 'col3dpyramid': 'General', + 'col3dpyramidclustered': 'General', + 'col3dpyramidstacked': 'General', + 'col3dpyramidpercentstacked': '0%', + 'col3dcylinder': 'General', + 'col3dcylinderclustered': 'General', + 'col3dcylinderstacked': 'General', + 'col3dcylinderpercentstacked': '0%', + 'doughnut': 'General', + 'line': 'General', + 'pie': 'General', + 'pie3d': 'General', + 'pieofpiechart': 'General', + 'barofpiechart': 'General', + 'radar': 'General', + 'scatter': 'General', + 'surface3d': 'General', + 'wireframesurface3d': 'General', + 'contour': 'General', + 'wireframecontour': 'General', + 'bubble': 'General', + 'bubble3d': 'General'); + return m[t]; + End; + + Function drawPlotAreaTxPr(TxPr); + Begin + TxPr.BodyPr.Rot := -60000000; + TxPr.BodyPr.SpcFirstLastPara := true; + TxPr.BodyPr.VertOverflow := 'ellipsis'; + TxPr.BodyPr.Vert := 'horz'; + TxPr.BodyPr.Wrap := 'square'; + TxPr.BodyPr.Anchor := 'ctr'; + TxPr.BodyPr.AnchorCtr := true; + TxPr.P.PPr.DefRPr.Sz := 900; + TxPr.P.PPr.DefRPr.B := false; + TxPr.P.PPr.DefRPr.I := false; + TxPr.P.PPr.DefRPr.U := 'none'; + TxPr.P.PPr.DefRPr.Strike := 'noStrike'; + TxPr.P.PPr.DefRPr.Kern := 1200; + TxPr.P.PPr.DefRPr.Baseline := 0; + TxPr.P.PPr.DefRPr.SolidFill.SchemeClr.Val := 'tx1'; + TxPr.P.PPr.DefRPr.SolidFill.SchemeClr.LumMod := 15000; + TxPr.P.PPr.DefRPr.SolidFill.SchemeClr.LumOff := 85000; + TxPr.P.PPr.DefRPr.Latin.Typeface := '+mn-lt'; + TxPr.P.PPr.DefRPr.Ea.Typeface := '+mn-ea'; + TxPr.P.PPr.DefRPr.Cs.Typeface := '+mn-cs'; + TxPr.P.EndParaRPr.Lang := 'en-US'; + End; + + Function drawPlotAreaSpPr(SpPr); + Begin + SpPr.Ln.W := 9525; + SpPr.Ln.Cap := 'flat'; + SpPr.Ln.Cmpd := 'sng'; + SpPr.Ln.Algn := 'ctr'; + SpPr.Ln.SolidFill.SchemeClr.Val := 'tx1'; + SpPr.Ln.SolidFill.SchemeClr.LumMod := 15000; + SpPr.Ln.SolidFill.SchemeClr.LumOff := 85000; + End; + + Function setChartSer(o, chart); + Begin + SerArr := array(); + for i:=0 to length(chart.Series)-1 do Begin + ser := TOfficeObj('TSer'); + SerArr union= array(('name':'ser','obj':ser,'attrEx':'','nodeType':'','attrName':'')); + ser.NodeName := 'ser'; + ser.IDx := i + chart.Ord; + ser.Ord := i + chart.Ord; + ser.Tx.StrRef.F := chart.Series[i]['Name']; + setSpPr(ser.SpPr, chart, i); + setMarker(ser.Marker, chart, i); + setDpt(ser.Dpt, chart, i); + setDLbls(ser.DLbls, chart); + ser.InvertIfNegative := false; + setCat(ser.Cat, chart, i); + setVal(ser.Val, chart, i); + setXVal(ser.XVal, chart, i); + setYVal(ser.YVal, chart, i); + setBubbleSize(ser.BubbleSize, chart, i); + setBubble3D(ser.Bubble3D, chart, i); + End; + o.Chart.Ser := SerArr; + End; + + Function setBubble3D(Bubble3D, chart, i); + Begin + if chart.Type <> 'bubble3d' then return; + Bubble3D := true; + End; + + Function setBubbleSize(BubbleSize, chart, i); + Begin + if not (chart.Type in array('bubble', 'bubble3d')) then return; + BubbleSize.NumRef.F := chart.Series[i]['Values']; + End; + + Function setYVal(Val, chart, i); + Begin + if not (chart.Type in array('scatter', 'bubble', 'bubble3d')) then return; + Val.NumRef.F := chart.Series[i]['Values']; + End; + + Function setXVal(xVal, chart, i); + Begin + if not (chart.Type in array('scatter')) then return; + xVal.StrRef.F := chart.Series[i]['Categories']; + End; + + Function setVal(Val, chart, i); + Begin + if chart.Type in array('scatter', 'bubble', 'bubble3d') then return; + Val.NumRef.F := chart.Series[i]['Values']; + End; + + Function setCat(Cat, chart, i); + Begin + if chart.Type in array('scatter', 'bubble', 'bubble3d') then return; + cat.StrRef.F := chart.Series[i]['Categories']; + End; + + Function setDLbls(DLbls, chart); + Begin + if chart.Type in array('scatter','surface3d', 'wireframesurface3d', 'contour', 'wireframecontour', 'bubble', 'bubble3d') then + return; + DLbls.ShowLegendKey := chart.Legend.ShowLegendKey; + DLbls.ShowVal := chart.Plotarea.ShowVal; + DLbls.ShowCatName := chart.Plotarea.ShowCatName; + DLbls.ShowSerName := chart.Plotarea.ShowSerName; + DLbls.ShowBubbleSize := chart.Plotarea.ShowBubbleSize; + DLbls.ShowPercent := chart.Plotarea.ShowPercent; + DLbls.ShowLeaderLines := chart.Plotarea.ShowLeaderLines; + End; + + Function setDpt(Dpt, chart, i); + Begin + if chart.Type in array('pie','pie3d') then Begin + Dpt.IDx := i; + Dpt.Bubble3D := false; + Dpt.SpPr.SolidFill.SchemeClr.Val := 'accent' $ (i + 1); + Dpt.SpPr.Ln.W := 25400; + Dpt.SpPr.Ln.Cap := 'rnd'; + Dpt.SpPr.Ln.SolidFill.SchemeClr.Val := 'lt' $ (i + 1); + Dpt.SpPr.Sp3D.ContourW := 25400; + Dpt.SpPr.Sp3D.ContourClr.SchemeClr.Val := 'lt' $ (i + 1); + End; + End; + + Function setMarker(Marker, chart, i); + Begin + if not (chart.Type in array('scatter', 'line')) then return; + if chart.Type = 'scatter' then + Marker.Symbol := 'circle'; + Marker.Size := 5; + if ifstring(chart.Series[i]['Symbol']) then + Marker.Symbol := chart.Series[i]['Symbol']; + if ifint(chart.Series[i]['Size']) then + Marker.Size := chart.Series[i]['Size']; + + if i < 6 then Begin + marker.SpPr.SolidFill.SchemeClr.Val := 'accent' $ (i + 1); + Marker.SpPr.Ln.W := 9252; + Marker.SpPr.Ln.SolidFill.SchemeClr.Val := 'accent' $ (i + 1); + End; + End; + + Function setSppr(SpPr, chart, i); + Begin + if chart.Type = 'line' then Begin + SpPr.Ln.W := 25400; + SpPr.Ln.NoFill := ' '; + return; + End; + if chart.Type = 'scatter' then Begin + w := chart.Series[i]['LineWidth']; + SpPr.Ln.W := 0.25 > w || w > 999 ? 25400 : 12700 * w; + SpPr.Ln.Cap := 'rnd'; + SpPr.Ln.SolidFill.SchemeClr.Val := 'accent' $ ((chart.Ord+i)%6+1); + return; + End; + End; + + Function getSharp(t); + Begin + m := array( + 'bar3dconeclustered': 'cone', + 'bar3dconestacked': 'cone', + 'bar3dconepercentstacked': 'cone', + 'bar3dpyramidclustered': 'pyramid', + 'bar3dpyramidstacked': 'pyramid', + 'bar3dpyramidpercentstacked': 'pyramid', + 'bar3dcylinderclustered': 'cylinder', + 'bar3dcylinderstacked': 'cylinder', + 'bar3dcylinderpercentstacked': 'cylinder', + 'col3dcone': 'cone', + 'col3dconeclustered': 'cone', + 'col3dconestacked': 'cone', + 'col3dconepercentstacked': 'cone', + 'col3dpyramid': 'pyramid', + 'col3dpyramidclustered': 'pyramid', + 'col3dpyramidstacked': 'pyramid', + 'col3dpyramidpercentstacked': 'pyramid', + 'col3dcylinder': 'cylinder', + 'col3dcylinderclustered': 'cylinder', + 'col3dcylinderstacked': 'cylinder', + 'col3dcylinderpercentstacked': 'cylinder'); + return m[t]; + End; + + Function getChartName(t); + Begin + m := array( + 'area': 'areaChart', + 'areastacked': 'areaChart', + 'areapercentstacked': 'areaChart', + 'area3d': 'area3DChart', + 'area3dstacked': 'area3DChart', + 'area3dpercentstacked': 'area3DChart', + 'bar': 'barChart', + 'barstacked': 'barChart', + 'barpercentstacked': 'barChart', + 'bar3dclustered': 'bar3DChart', + 'bar3dstacked': 'bar3DChart', + 'bar3dpercentstacked': 'bar3DChart', + 'bar3dconeclustered': 'bar3DChart', + 'bar3dconestacked': 'bar3DChart', + 'bar3dconepercentstacked': 'bar3DChart', + 'bar3dpyramidclustered': 'bar3DChart', + 'bar3dpyramidstacked': 'bar3DChart', + 'bar3dpyramidpercentstacked': 'bar3DChart', + 'bar3dcylinderclustered': 'bar3DChart', + 'bar3dcylinderstacked': 'bar3DChart', + 'bar3dcylinderpercentstacked': 'bar3DChart', + 'col': 'barChart', + 'colstacked': 'barChart', + 'colpercentstacked': 'barChart', + 'col3d': 'bar3DChart', + 'col3dclustered': 'bar3DChart', + 'col3dstacked': 'bar3DChart', + 'col3dpercentstacked': 'bar3DChart', + 'col3dcone': 'bar3DChart', + 'col3dconeclustered': 'bar3DChart', + 'col3dconestacked': 'bar3DChart', + 'col3dconepercentstacked': 'bar3DChart', + 'col3dpyramid': 'bar3DChart', + 'col3dpyramidclustered': 'bar3DChart', + 'col3dpyramidstacked': 'bar3DChart', + 'col3dpyramidpercentstacked': 'bar3DChart', + 'col3dcylinder': 'bar3DChart', + 'col3dcylinderclustered': 'bar3DChart', + 'col3dcylinderstacked': 'bar3DChart', + 'col3dcylinderpercentstacked': 'bar3DChart', + 'bubble': 'bubbleChart', + 'bubble3D': 'bubbleChart'); + return m[t]; + End; + + Function getVaryColors(t); + Begin + m := array( + 'barstacked': 100, + 'barpercentstacked': 100, + 'colstacked': 100, + 'colpercentstacked': 100 + ); + return m[t]; + End; + + Function getGrouping(t); + Begin + m := array( + 'area': 'standard', + 'areastacked': 'stacked', + 'areapercentstacked': 'percentstacked', + 'area3d': 'standard', + 'area3dstacked': 'stacked', + 'area3dpercentstacked': 'percentstacked', + 'bar': 'clustered', + 'barstacked': 'stacked', + 'barpercentstacked': 'percentstacked', + 'bar3dclustered': 'clustered', + 'bar3dstacked': 'stacked', + 'bar3dpercentstacked': 'percentstacked', + 'bar3dconeclustered': 'clustered', + 'bar3dconestacked': 'stacked', + 'bar3dconepercentstacked': 'percentstacked', + 'bar3dpyramidclustered': 'clustered', + 'bar3dpyramidstacked': 'stacked', + 'bar3dpyramidpercentstacked': 'percentstacked', + 'bar3dcylinderclustered': 'clustered', + 'bar3dcylinderstacked': 'stacked', + 'bar3dcylinderpercentstacked': 'percentstacked', + 'col': 'clustered', + 'colstacked': 'stacked', + 'colpercentstacked': 'percentstacked', + 'col3d': 'standard', + 'col3dclustered': 'clustered', + 'col3dstacked': 'stacked', + 'col3dpercentstacked': 'percentstacked', + 'col3dcone': 'standard', + 'col3dconeclustered': 'clustered', + 'col3dconestacked': 'stacked', + 'col3dconepercentstacked': 'percentstacked', + 'col3dpyramid': 'standard', + 'col3dpyramidclustered': 'clustered', + 'col3dpyramidstacked': 'stacked', + 'col3dpyramidpercentstacked': 'percentstacked', + 'col3dcylinder': 'standard', + 'col3dcylinderclustered': 'clustered', + 'col3dcylinderstacked': 'stacked', + 'col3dcylinderpercentstacked': 'percentstacked', + 'line': 'standard'); + return m[t]; + End; + + Function getBarDir(t); + Begin + m := array( + 'bar': 'bar', + 'barstacked': 'bar', + 'barpercentstacked': 'bar', + 'bar3dclustered': 'bar', + 'bar3dstacked': 'bar', + 'bar3dpercentstacked': 'bar', + 'bar3dconeclustered': 'bar', + 'bar3dconestacked': 'bar', + 'bar3dconepercentstacked': 'bar', + 'bar3dpyramidclustered': 'bar', + 'bar3dpyramidstacked': 'bar', + 'bar3dpyramidpercentstacked': 'bar', + 'bar3dcylinderclustered': 'bar', + 'bar3dcylinderstacked': 'bar', + 'bar3dcylinderpercentstacked': 'bar', + 'col': 'col', + 'colstacked': 'col', + 'colpercentstacked': 'col', + 'col3d': 'col', + 'col3dclustered': 'col', + 'col3dstacked': 'col', + 'col3dpercentstacked': 'col', + 'col3dcone': 'col', + 'col3dconestacked': 'col', + 'col3dconeclustered': 'col', + 'col3dconepercentstacked': 'col', + 'col3dpyramid': 'col', + 'col3dpyramidclustered': 'col', + 'col3dpyramidstacked': 'col', + 'col3dpyramidpercentstacked': 'col', + 'col3dcylinder': 'col', + 'col3dcylinderclustered': 'col', + 'col3dcylinderstacked': 'col', + 'col3dcylinderpercentstacked': 'col', + 'line': 'standard'); + return m[t]; + End; + + sheetName_:string; //sheet名称 + sheetFileName_; //xl/worksheets/sheetN.xml + xlChartFileName_:string; + xlDrawingFileName_:string; //'xl/drawings/drawingN.xml'; + drawingXmlObj_; + drawingRID_:integer; + chartId_; + chartRid_; + excel_;//TSExcelFile对象 +End; \ No newline at end of file diff --git a/funcext/TSOffice/worksheet/xlsxComment.tsf b/funcext/TSOffice/worksheet/xlsxComment.tsf new file mode 100644 index 0000000..65404a8 --- /dev/null +++ b/funcext/TSOffice/worksheet/xlsxComment.tsf @@ -0,0 +1,170 @@ +Type xlsxComment = Class + ///缺省构造函数 + Function Create(sheet,excel); overload; + Begin + authors_ := array(); + excel_ := excel; + sheetName_ := sheet; + [rid, commentFileName_, sheetFileName_, relsfile] := excel_.WorkBook().GetRelationshipRid(sheet, '../comments'); + if commentFileName_ = '' then Begin + rid++; + rId_ := 'rId' + inttostr(rid); + commentId_ := excel_.WorkBook().GetFilesCount('xl/comments') + 1; + commentFileName_ := '../comments' + inttostr(commentId_) + '.xml'; + xlCommentFileName := 'xl/comments' + inttostr(commentId_) + '.xml'; + excel_.Zip().Add(xlCommentFileName, excel_.XmlObj().XmlHeader() + ''); + excel_.WorkBook().AddRelationshipRid(relsfile, commentFileName_, 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments', rId_); + rid ++; + drawingVML_ := '../drawings/vmlDrawing' + inttostr(commentId_) + '.vml'; + drawingVMLFile := 'xl/drawings/vmlDrawing' + inttostr(commentId_) + '.vml'; + excel_.Zip().Remove(drawingVMLFile); + excel_.Zip().Add(drawingVMLFile, ' + + + + + + + + '); + excel_.WorkBook().AddRelationshipRid(relsfile, drawingVML_, 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing', 'rId' + inttostr(rid)); + excel_.WorkBook().AddContentType('application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml', '/' + xlCommentFileName); + excel_.WorkBook().AddContentVml(); + + sheetXml := excel_.WorkBook().GetSheetXmlfile(sheetName_).FirstChildElement('worksheet'); + legacy := sheetXml.FirstChildElement('legacyDrawing'); + if not ifObj(legacy) then legacy := sheetXml.InsertEndChild('element', 'legacyDrawing'); + legacy.SetAttribute('r:id', 'rId' + inttostr(rid)); + End + else Begin + rId_ := 'rId' + inttostr(rid); + xlCommentFileName := 'xl/' + ExtractFileName(commentFileName_); + s := RightStr(xlCommentFileName, length(xlCommentFileName) - 11); + commentId_ := strtoint(leftstr(s, length(s) - 4)); + drawingVML_ := './drawings/vmlDrawing' + inttostr(commentId_) + '.vml'; + End; + commentXmlFile_ := excel_.WorkBook().GetXmlFileObj(xlCommentFileName); + authors := commentXmlFile_.FirstChildElement('comments').FirstChildElement('authors'); + if not ifObj(authors) then + authors := commentXmlFile_.FirstChildElement('comments').InsertEndChild('element', 'authors'); + node := authors.FirstChildElement(); + i := 0; + while ifObj(node) do Begin + author := node.GetText(); + authors_[ author ] := i ++; + node := node.NextElement(); + End; + //println('sheet={},commentfile={},vmlfile={}',sheet, commentXmlFile_, drawingVML_); + End; + + class Function NewObject(sheet, excel); + Begin + excel_ := excel; + o := excel_.WorkBook().GetSheetObj(sheet);//sheet存在 + if not ifObj(o) then return 0; + return new xlsxComment(sheet, excel); + End; + + Function AddComment(cell, author, comment); + Begin + authorId := authors_[author]; + if not ifint(authorId) then Begin + authorId := length(authors_); + commentXmlFile_.FirstChildElement('comments').FirstChildElement('authors').InsertEndChild('element', 'author', author);//添加作者 + authors_[author] := authorId; + End; + if not ifstring(comment) then return array(1, 'comment is not a string'); + comments := TOfficeObj('TComments'); + comments.Ref := cell; + comments.AuthorId := authorId; + authorObj := comments.AddComment(author + ':'); + arr := str2array(comment, '\n'); + colCount := length(author)+1; + for i:=0 to length(arr)-1 do Begin + line := TrimRight(arr[i]); + if length(line) > colCount then colCount := length(line); + End; + lineCount := length(arr); + commentObj := comments.AddComment('\n' + comment); + commentObj.Font.Bold := nil; + commentObj.Space := 'preserve'; + domData := comments.Marshal(); + node := getComment(cell); + if ifObj(node) then + node.DeleteChildren(); + else + node := commentXmlFile_.FirstChildElement('comments').FirstChildElement('commentList').InsertEndChild('element', 'comment'); + node.UnMarshal(domData); + //commentXmlFile_.print; + innerxml := '