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 := '
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Fruit 2D Column Chart
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+';
+ 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 := '
+
+
+
+
+
+
+
+
+
+';
+ drawingVMLFile := 'xl/drawings/vmlDrawing' + inttostr(commentId_) + '.vml';
+ xmlObj := excel_.WorkBook().GetXmlFileObj(drawingVMLFile);
+ if ifObj(xmlObj) then Begin
+ node := xmlObj.LastChildElement('xml').InsertEndChild('element','v:shape');
+ node.UnMarshal(innerxml);
+ node := node.FirstChildElement('x:ClientData');
+ if ifObj(node) then Begin
+ [err, col, row] := excel_.CellNameToCoordinates(cell);
+ clientData := TOfficeObj('TClientData');
+ clientData.Anchor := fmt('{},23,{},0,{},{},{},5',col, row, 1+col+lineCount, colCount+col-1, 1+row+lineCount);
+ clientData.Row := row - 1;
+ ClientData.Column := col - 1;
+ node.UnMarshal(clientData.Marshal());
+ commentObjs_[ length(commentObjs_) ] := array(cell, node);
+ //xmlObj.Print;
+ End;
+ End;
+ return array(0, 'ok');
+ End;
+
+ Function getComment(cell);
+ Begin
+ if not ifarray(commentObjs_) then Begin
+ commentObjs_ := array();
+ node := commentXmlFile_.FirstChildElement('comments').FirstChildElement('commentList');
+ if not ifObj(node) then
+ node := commentXmlFile_.FirstChildElement('comments').InsertEndChild('element','commentList');
+ node := node.FirstChildElement('comment');
+ while ifObj(node) do Begin
+ ref := node.GetAttribute('ref');
+ commentObjs_[index++] := array(ref, node);
+ node := node.NextElement();
+ End;
+ End;
+ return vselect [1] from commentObjs_ where [0] = cell end;
+ End;
+
+ Function RemoveComment(cell);
+ Begin
+ node := getComment(cell);
+ if ifObj(node) then
+ commentXmlFile_.FirstChildElement('comments').DeleteChild(node);
+ return array(0, 'ok');
+ End;
+private
+ authors_;
+ commentId_;
+ commentFileName_:string;//'../comments/comment1.xml'
+ drawingVML_:string;//'../drawings/vmlDrawing1.xml'
+ rId_:string;
+ sheetName_:string;//sheet名称
+ sheetFileName_;//xl/worksheets/sheetN.xml
+ excel_;//TSExcelFile对象
+ commentXmlFile_;//XmlFile对象
+ commentObjs_;
+End;
diff --git a/funcext/TSOffice/worksheet/xlsxHeaderFooter.tsf b/funcext/TSOffice/worksheet/xlsxHeaderFooter.tsf
new file mode 100644
index 0000000..9b2ed64
--- /dev/null
+++ b/funcext/TSOffice/worksheet/xlsxHeaderFooter.tsf
@@ -0,0 +1,32 @@
+Type xlsxHeaderFooter = Class
+
+ Function Create(sheetobj, file, xml);
+ Begin
+ sheet_ := sheetobj;
+ file_ := file;
+ xmlFile_ := xml;
+ End
+
+ class Function NewObject(sheetname, file);
+ Begin
+ o := file.WorkBook().GetSheetObj(sheetname);
+ xml := file.WorkBook().GetSheetXmlfile(sheetname);
+ if not ifObj(o) then return 0;
+ return new xlsxHeaderFooter(o, file, xml);
+ End;
+
+ // 设置sheet的页面页脚
+ Function SetHeaderFooter(headerFooter);
+ Begin
+ node := xmlFile_.FirstChildElement('worksheet');
+ header_node := node.FirstChildElement('headerFooter');
+ if ifObj(header_node) then
+ node.DeleteChild(header_node);
+ node.InsertEndChild(headerFooter.Marshal());
+ End
+
+private
+ sheet_; //XmlSheet对象
+ file_; //TSExcelFile对象
+ xmlFile_; //sheet对应的xml对象
+End;
\ No newline at end of file
diff --git a/funcext/TSOffice/worksheet/xlsxHyperLink.tsf b/funcext/TSOffice/worksheet/xlsxHyperLink.tsf
new file mode 100644
index 0000000..8fc3afa
--- /dev/null
+++ b/funcext/TSOffice/worksheet/xlsxHyperLink.tsf
@@ -0,0 +1,90 @@
+Type xlsxHyperLink = Class
+ Function Create(sheetName, file, xmlFile); overload;
+ Begin
+ sheetName_ := sheetName;
+ file_ := file;
+ xmlFile_ := xmlFile;
+ End;
+
+ class Function NewObject(sheetname, file);
+ Begin
+ xmlFile := file.WorkBook().GetSheetXmlfile(sheetname);
+ return new xlsxHyperLink(sheetname, file, xmlFile);
+ End;
+
+ Function SetCellHyperLink(axis, hyperlink);
+ Begin
+ work_node := xmlFile_.FirstChildElement('worksheet');
+ hyperlinks := work_node.FirstChildElement('hyperlinks');
+ if not ifObj(hyperlinks) then begin
+ phone_node := work_node.FirstChildElement('phoneticPr');
+ hyperlinks := work_node.InsertAfterChild(phone_node, 'element', 'hyperlinks');
+ end;
+ node := hyperlinks.FirstChildElement('hyperlink');
+ while ifObj(node) do begin
+ ref := node.GetAttribute('ref');
+ if ref = axis then begin
+ node := hyperlinks.DeleteChild(node);
+ break;
+ end;
+ node := node.NextElement();
+ end;
+ hyperlink.Axis := axis;
+ marshal := hyperlink.Marshal();
+ attrs := marshal['attributes'];
+ if attrs['linkType'] = "Location" then reindex(attrs, array('linkType': nil, 'linkUrl': 'location'));
+ else if attrs['linkType'] = "External" then
+ Begin
+ [rid, commentFileName, sheetFileName, relsfile] := file_.WorkBook().GetRelationshipRid(sheetName_, hyperlink.LinkUrl);
+ if commentFileName = "" then
+ Begin
+ rid++;
+ ridstr := 'rId' + inttostr(rid);
+ xmlfile := file_.WorkBook().GetXmlFileObj(relsfile);
+ class(xlsxXml).AddRelationshipRid(xmlfile, hyperlink.LinkUrl, "http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink", ridstr, "External");
+ End
+ reindex(attrs, array('linkType': nil, 'linkUrl': nil));
+ attrs['r:id'] := 'rId' + inttostr(rid);
+ End
+ marshal['attributes'] := attrs;
+ hyperlinks.InsertEndChild(marshal);
+ return array(0,'ok');
+ End;
+
+ Function GetCellHyperLink(axis);
+ Begin
+ data := array();
+ hyperlinks := xmlFile_.FirstChildElement('worksheet').FirstChildElement('hyperlinks');
+ if not ifObj(hyperlinks) then return array(-1, 'Node::hyperlinks is not exist.');
+ node := hyperlinks.FirstChildElement('hyperlink');
+ while ifObj(node) do begin
+ marshal := node.marshal()[0];
+ attrs := marshal['attributes'];
+ if attrs['ref'] = axis then
+ begin
+ link := TOfficeObj('THyperLink');
+ link.LinkType := ifnil(attrs['location']) ? "External" : "Location";
+ if not ifnil(attrs['location']) then
+ link.LinkUrl := attrs['location'];
+ else Begin
+ rid := attrs['r:id'];
+ file := 'xl/worksheets/_rels/' + ExtractFileName(LowerCase(sheetName_)) + '.xml.rels';
+ xmlfile := file_.WorkBook().GetXmlFileObj(file);
+ relnode := class(xlsxXml).FindRelationship(xmlfile, rid);
+ if ifObj(relnode) then link.LinkUrl := relnode.GetAttribute('Target');
+ End
+ link.Display := attrs['display'];
+ link.Tooltip := attrs['tooltip'];
+ return array(0, link);
+ end;
+ node := node.NextElement();
+ end;
+ return array(-2, "The cell has no hyperlink.");
+ End;
+
+private
+ file_; //TSExcelFile对象
+ xmlFile_;//XmlFile对象
+ sheetName_;
+
+End;
diff --git a/funcext/TSOffice/worksheet/xlsxImage.tsf b/funcext/TSOffice/worksheet/xlsxImage.tsf
new file mode 100644
index 0000000..1045441
--- /dev/null
+++ b/funcext/TSOffice/worksheet/xlsxImage.tsf
@@ -0,0 +1,48 @@
+Type xlsxImage = Class
+ ///缺省构造函数
+ Function Create(sheet,excel); overload;
+ Begin
+ excel_ := excel;
+ sheetName_ := sheet;
+ [rid_, imageFileName_, sheetFileName_, xmlRelsFile_] := excel_.WorkBook().GetRelationshipRid(sheet, '../media/image');
+ End;
+
+ class Function NewObject(sheet, excel);
+ Begin
+ excel_ := excel;
+ o := excel_.WorkBook().GetSheetObj(sheet);//sheet存在
+ if not ifObj(o) then return 0;
+ return new xlsxImage(sheet, excel);
+ End;
+
+ Function SetSheetBackground(pictrue);
+ Begin
+ //if not ifBinary(picture.Image) or length(picture.Image) = 0 then
+ // raise "Invalid Image Data.";
+ if imageFileName_ = '' then
+ Begin
+ rid_++;
+ imageId := excel_.WorkBook().GetFilesCount('xl/media/') + 1;
+ imageName := "../media/image" + inttostr(imageId);
+ type := 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/image';
+ excel_.WorkBook().AddRelationshipRid(xmlRelsFile_, imageName, type, 'rId' + inttostr(rid_));
+ End
+ sheet_xml := excel_.WorkBook().GetSheetXmlfile(sheetName_);
+ node := sheet_xml.FirstChildElement('worksheet');
+ picture_node := node.FirstChildElement('picture');
+ if ifObj(picture_node) then
+ Begin
+ node.DeleteChild(picture_node);
+ End
+ node := node.InsertEndChild('element', 'picture');
+ node.SetAttribute('r:id', 'rId' + inttostr(rId_));
+ End
+
+private
+ sheetName_:string; //sheet名称
+ sheetFileName_; //xl/worksheets/sheetN.xml
+ excel_;//TSExcelFile对象
+ xmlRelsFile_;
+ imageFileName_;
+ rid_;
+End;
diff --git a/funcext/TSOffice/worksheet/xlsxMargins.tsf b/funcext/TSOffice/worksheet/xlsxMargins.tsf
new file mode 100644
index 0000000..2bae207
--- /dev/null
+++ b/funcext/TSOffice/worksheet/xlsxMargins.tsf
@@ -0,0 +1,45 @@
+Type xlsxMargins = Class
+ Function Create(sheetobj, file, xml); overload;
+ Begin
+ sheet_ := sheetobj;
+ file_ := file;
+ xmlFile_ := xml;
+ End;
+
+ Function SetPageMargins(margins);
+ Begin
+ marshal := margins.Marshal();
+ work_node := xmlFile_.FirstChild('worksheet');
+ node := work_node.FirstChild('pageMargins');
+ work_node.DeleteChild(node);
+ prev_node := work_node.FirstChild('phoneticPr');
+ work_node.InsertAfterChild(prev_node, marshal);
+ End;
+
+ Function GetPageMargins();
+ Begin
+ node := xmlFile_.FirstChild('worksheet').FirstChild('pageMargins');
+ marshal := node.Marshal()[0];
+ margins := TOfficeObj('tmargins');
+ margins.Bottom := marshal['attributes']['bottom'];
+ margins.Footer := marshal['attributes']['footer'];
+ margins.Header := marshal['attributes']['header'];
+ margins.Left := marshal['attributes']['left'];
+ margins.Right := marshal['attributes']['right'];
+ margins.Top := marshal['attributes']['top'];
+ return margins;
+ End
+
+ class Function NewObject(sheetname, file);
+ Begin
+ o := file.WorkBook().GetSheetObj(sheetname);
+ xml := file.WorkBook().GetSheetXmlfile(sheetname);
+ if not ifObj(o) then return 0;
+ return new xlsxMargins(o, file, xml);
+ End;
+
+private
+ file_; //TSExcelFile对象
+ sheet_;//XmlSheet对象
+ xmlFile_; //sheet对应的xml对象
+End;
diff --git a/funcext/TSOffice/worksheet/xlsxPageLayout.tsf b/funcext/TSOffice/worksheet/xlsxPageLayout.tsf
new file mode 100644
index 0000000..cf68dc4
--- /dev/null
+++ b/funcext/TSOffice/worksheet/xlsxPageLayout.tsf
@@ -0,0 +1,65 @@
+Type xlsxPageLayout = Class
+ Function Create(sheetobj, file, xml); overload;
+ Begin
+ sheet_ := sheetobj;
+ file_ := file;
+ xmlFile_ := xml;
+ End;
+
+ Function SetPageLayout(sheet, pageLayout);
+ Begin
+ marshal := pageLayout.Marshal();
+ work_node := xmlFile_.FirstChild('worksheet');
+ node := work_node.FirstChild('pageSetUp');
+ if ifObj(node) then work_node.DeleteChild(node);
+ workbook_xml := file_.WorkBook().GetXmlFileObj('xl/workbook.xml');
+ workbook := workbook_xml.FirstChildElement('workbook').FirstChildElement('sheets').FirstChildElement('sheet');
+ if not ifObj(workbook) then return array(1, 'workbook error!');
+ while ifObj(workbook) do
+ Begin
+ sheet_name := workbook.GetAttribute('name');
+ if sheet_name = sheet then
+ Begin
+ rid := workbook.GetAttribute('r:id');
+ break;
+ End
+ workbook := workbook.NextElement();
+ End
+ if not ifnil(marshal['attributes']['firstPageNumber']) then marshal['attributes']['useFirstPageNumber'] := 1;
+ marshal['attributes']['r:id'] := rid;
+ work_node.InsertEndChild(marshal);
+ return array(0, '');
+ End;
+
+ Function GetPageLayout();
+ Begin
+ node := xmlFile_.FirstChild('worksheet').FirstChild('pageSetUp');
+ if not ifObj(node) then return array(1, ': pageSetUp not found');
+ marshal := node.Marshal()[0];
+ page_layout := TOfficeObj('TPageLayout');
+ page_layout.Scale := marshal['attributes']['scale'];
+ page_layout.FitToWidth := marshal['attributes']['fitToWidth'];
+ page_layout.FitToHeight := marshal['attributes']['fitToHeight'];
+ page_layout.PaperSize := marshal['attributes']['paperSize'];
+ page_layout.Orientation := marshal['attributes']['orientation'];
+ page_layout.BlackAndWhite := marshal['attributes']['blackAndWhite'];
+ page_layout.FirstPageNumber := marshal['attributes']['firstPageNumber'];
+ page_layout.CellError := marshal['attributes']['errors'];
+ page_layout.CellComments := marshal['attributes']['cellComments'];
+ page_layout.Draft := marshal['attributes']['draft'];
+ return page_layout;
+ End
+
+ class Function NewObject(sheetname, file);
+ Begin
+ o := file.WorkBook().GetSheetObj(sheetname);
+ xml := file.WorkBook().GetSheetXmlfile(sheetname);
+ if not ifObj(o) then return 0;
+ return new xlsxPageLayout(o, file, xml);
+ End;
+
+private
+ file_; //TSExcelFile对象
+ sheet_;//XmlSheet对象
+ xmlFile_; //sheet对应的xml对象
+End;
diff --git a/funcext/TSOffice/worksheet/xlsxRichText.tsf b/funcext/TSOffice/worksheet/xlsxRichText.tsf
new file mode 100644
index 0000000..6c65225
--- /dev/null
+++ b/funcext/TSOffice/worksheet/xlsxRichText.tsf
@@ -0,0 +1,18 @@
+Type xlsxRichText = Class
+ file_; //TSExcelFile对象
+ sheet_;//XmlSheet对象
+ Function Create(); overload;
+ Begin
+ End;
+
+ class Function NewObject(sheetname, self);
+ Begin
+ file_ := file;
+ o = file_.WorkBook().GetSheetObj(sheetname);
+ if not ifObj(o) then return 0;
+ richTxt := new xlsxRichText();
+ richTxt.sheet_ = o;
+ richTxt.file_ := file;
+ return richTxt;
+ End;
+End;
\ No newline at end of file
diff --git a/funcext/TSOffice/worksheet/xlsxSheetView.tsf b/funcext/TSOffice/worksheet/xlsxSheetView.tsf
new file mode 100644
index 0000000..1b74f6b
--- /dev/null
+++ b/funcext/TSOffice/worksheet/xlsxSheetView.tsf
@@ -0,0 +1,60 @@
+Type xlsxSheetView = Class
+ Function Create(sheetobj, file, xml); overload;
+ Begin
+ sheet_ := sheetobj;
+ file_ := file;
+ xmlFile_ := xml;
+ End;
+
+ Function SetSheetViewOptions(viewIndex, sheetView);
+ Begin
+ node := xmlFile_.FirstChild('worksheet').FirstChild('sheetViews');
+ sheet_view_node := node.FirstChild('sheetView');
+ while ifObj(sheet_view_node) do
+ Begin
+ id := sheet_view_node.GetAttribute('workbookViewId');
+ if trystrtoint(id, r) and r = viewIndex then
+ Begin
+ marshal := SheetView.Marshal();
+ class(xlsxXml).UpdateNode(sheet_view_node, marshal['attributes'], array());
+ return array(0, '');
+ End
+ sheet_view_node := sheet_view_node.NextElement();
+ End
+ return array(1, 'viewIndex not found : ' $ viewIndex);
+ End;
+
+ Function GetSheetViewOptions(viewIndex, sheetView);
+ Begin
+ node := xmlFile_.FirstChild('worksheet').FirstChild('sheetViews');
+ sheet_view_node := node.FirstChild('sheetView');
+ while ifObj(sheet_view_node) do
+ Begin
+ id := sheet_view_node.GetAttribute('workbookViewId');
+ if trystrtoint(id, r) and r = viewIndex then
+ Begin
+ marshal := sheet_view_node.Marshal()[0];
+ sheetview := TOfficeObj('TSheetView');
+ sheetview.ShowGridLines := marshal['attributes']['showGridLines'];
+ sheetview.ShowRowColHeaders := marshal['attributes']['showRowColHeaders'];
+ sheetview.ZoomScale := marshal['attributes']['zoomScale'];
+ sheetview.ZoomScaleNormal := marshal['attributes']['zoomScaleNormal'];
+ return array(0, sheetView);
+ End
+ End
+ return array(1, 'viewIndex not found : ' $ viewIndex);
+ End
+
+ class Function NewObject(sheetname, file);
+ Begin
+ o := file.WorkBook().GetSheetObj(sheetname);
+ xml := file.WorkBook().GetSheetXmlfile(sheetname);
+ if not ifObj(o) then return 0;
+ return new xlsxSheetView(o, file, xml);
+ End;
+
+private
+ file_; //TSExcelFile对象
+ sheet_;//XmlSheet对象
+ xmlFile_; //sheet对应的xml对象
+End;
diff --git a/funcext/TSOffice/worksheet/xlsxStyles.tsf b/funcext/TSOffice/worksheet/xlsxStyles.tsf
new file mode 100644
index 0000000..8c99652
--- /dev/null
+++ b/funcext/TSOffice/worksheet/xlsxStyles.tsf
@@ -0,0 +1,107 @@
+Type xlsxStyles = Class
+
+ Function Create(sheetobj, file);
+ Begin
+ sheet_ := sheetobj;
+ file_ := file;
+ styleXmlFile_ := file_.WorkBook().GetXmlFileObj('xl/styles.xml');
+ End
+
+ Function GetStyleId(style);
+ Begin
+ node := styleXmlFile_.FirstChildElement('styleSheet');
+ font_id := insertNode(node, 'fonts', style.Font);
+ border_id := insertNode(node, 'borders', style.Border);
+ fill_id := insertNode(node, 'fills', style.Fill);
+
+ processNumFmtId(node, 'numFmts', style.NumberFormat);
+ numfmt_id := insertNode(node, 'numFmts', style.NumberFormat);
+
+ // 整理插入节点内容
+ child_arr := array();
+ alignment_marshal := style.Alignment.Marshal();
+ if istable(alignment_marshal['children']) or istable(alignment_marshal['attributes']) then
+ begin
+ alignment_flag := 1;
+ child_arr union= array(alignment_marshal);
+ end
+ protection_marshal := style.Protection.Marshal();
+ if istable(protection_marshal['children']) or istable(protection_marshal['attributes']) then
+ begin
+ protection_flag := 1;
+ child_arr union= array(protection_marshal);
+ end
+
+ attr_arr := array(
+ 'numFmtId': style.NumberFormat.NumFmtId ? : "0",
+ 'fontId': font_id,
+ 'fillId': fill_id,
+ 'borderId': border_id,
+ 'xfId': 0,
+ );
+ if font_id <> '0' then attr_arr['applyFont'] := '1';
+ if border_id <> '0' then attr_arr['applyBorder'] := '1';
+ if numfmt_id <> '0' then attr_arr['applyNumberFormat'] := '1';
+ if fill_id <> '0' then attr_arr['applyFill'] := '1';
+ if alignment_flag then attr_arr['applyAlignment'] := '1';
+ if protection_flag then attr_arr['applyProtection'] := '1';
+
+ arr := array('name': 'xf', 'type': 'element',
+ 'attributes': attr_arr,
+ 'children': child_arr,
+ );
+ node := node.FirstChildElement('cellXfs');
+ count := node.GetAttribute('count');
+ node.InsertEndChild(arr);
+ node.SetAttribute('count', strtoint(count) + 1);
+ //node.print;
+ return count;
+ End
+
+ class Function NewObject(sheetname, file);
+ Begin
+ o := file.WorkBook().GetSheetObj(sheetname);
+ if not ifObj(o) then return 0;
+ styles := new xlsxStyles(o, file);
+ return styles;
+ End;
+
+private
+ Function insertNode(rootNode, childName, obj);
+ Begin
+ marshal := obj.Marshal();
+ if not istable(marshal['children']) and not istable(marshal['attributes']) then return '0';
+ node := rootNode.FirstChildElement(childName);
+ if not ifObj(node) then
+ begin
+ info := array('name': childName, 'type': 'element', 'attributes': ('count': '0'));
+ rootNode.InsertFirstChild(info);
+ node := rootNode.FirstChildElement(childName);
+ end
+ count := node.GetAttribute('count');
+ node.InsertEndChild(marshal);
+ node.SetAttribute('count', strtoint(count) + 1);
+ //node.Print;
+ return count;
+ End
+
+ Function processNumFmtId(rootNode, childName, obj);
+ Begin
+ if ifnil(obj.FormatCode) or not ifnil(obj.numFmtId) then return;
+ node := rootNode.FirstChildElement(childName);
+ if not ifObj(node) then obj.numFmtId := '1';
+ else begin
+ node := node.LastChildElement('numFmt');
+ if not ifObj(node) then obj.numFmtId := '1';
+ else begin
+ id := node.GetAttribute('numFmtId');
+ obj.numFmtId := strtoint(id) + 1;
+ end
+ end
+ End
+
+private
+ sheet_; //XmlSheet对象
+ file_; //TSExcelFile对象
+ styleXmlFile_; //xmlFile对象
+End;
diff --git a/funcext/TSOffice/worksheet/xlsxWorkBook.tsf b/funcext/TSOffice/worksheet/xlsxWorkBook.tsf
new file mode 100644
index 0000000..86ab7f9
--- /dev/null
+++ b/funcext/TSOffice/worksheet/xlsxWorkBook.tsf
@@ -0,0 +1,1229 @@
+Type xlsxWorkBook = Class
+ ///WorkBook文件操作接口
+ ///规范1:类首字母小写,表示该类只在模块内部使用,不作为接口提供;
+ ///规范2:成员变量首字母大写:成员可以被访问;
+ ///规范3:成员变量首字母小写:不建议外部访问;
+ ///规范4:成员函数首字母大写:成员函数可以被调用;
+ ///规范5:成员函数首字母小写:不建议外部调用;
+ ///规范6:成员变量以_结尾;
+ ///规范7:字符串用单引号;
+ ///规范8:模块tsf文件编码格式为UTF8
+
+ ///缺省构造函数
+ Function Create(z,xml); overload;
+ Begin
+ rId_ := -1;
+ zipfile_ := z;
+ xml_ := xml;
+ xmlFileObjMap_ := array();
+ sheetObjMap_ := array();
+ sheetPrefix_ := 'xl/worksheets/sheet';
+ End;
+
+ Function Load();
+ Begin
+ sheetsCount_ := 0;
+ sheetNames_ := array();
+ sheetIndexMap_ := array();
+
+ //workbook.xml.rels中加载(rid -> sheet-filename)
+ rids := array();
+ workbook_rels := GetXmlFileObj(xml_.GetFileName('workbook_rels'));
+ rels := workbook_rels.FirstChildElement('Relationships').FirstChildElement('Relationship');
+ while ifObj(rels) do Begin
+ id := rels.GetAttribute('Id');
+ target := rels.GetAttribute('Target');
+ rids[ id ] := target;
+ rels := rels.NextElement();
+ End;
+ //workbook_rels.Print();
+
+ workbook := GetXmlFileObj('xl/workbook.xml');
+ //workbook.Print();
+ //workbook.Dump();
+ //echo tostn(workbook.dom());
+ node := workbook.FirstChildElement('workbook').FirstChildElement('sheets').FirstChildElement();
+ while ifObj(node) do Begin
+ name := node.GetAttribute("name");
+ sheetNames_[sheetsCount_]['name'] := name;
+ sheetNames_[sheetsCount_]['sheetId'] := strtoint(node.GetAttribute("sheetId"));
+ rid := node.GetAttribute("r:id");
+ sheetNames_[sheetsCount_]['rid'] := rid;
+ sheetNames_[sheetsCount_]['file'] := 'xl/' + rids[ rid ];
+ sheetIndexMap_[ LowerCase(name) ] := sheetsCount_;
+ sheetsCount_ ++;
+ node := node.NextElement();
+ End;
+
+ //echo tostn(sheetNames_);
+ End;
+
+ ///获取工作表列表
+ ///返回: arry()
+ Function GetSheets();
+ Begin
+ return sselect ['name'] from sheetNames_ end;
+ End;
+
+ ///创建新sheet
+ ///sheet: string,工作表名称
+ ///返回: [err, info]
+ Function NewSheet(sheet);
+ Begin
+ lname := LowerCase(sheet);
+ if ifint(sheetIndexMap_[ lname ]) then return array(1, 'Sheet is already exist.');
+ rid := getWorkbookRelsRid();
+
+ //添加文件xl/worksheets/sheetN.xml
+ sheetId := vselect maxof(['sheetId']) from sheetNames_ end;
+ sheetId := integer(sheetId) + 1;
+ fname := sheetPrefix_ $ inttostr(sheetsCount_ + 1) $ '.xml';
+ zipfile_.Add(fname, xml_.XmlHeader() + xml_.GetTemplate('sheet1'));
+
+ //设置 workbook.xml.rels
+ workbook_rels := GetXmlFileObj(xml_.GetFileName('workbook_rels'));
+ rels := workbook_rels.FirstChildElement('Relationships').InsertEndChild('element', 'Relationship');
+ rels.SetAttribute('Target', getTarget( sheetsCount_ + 1));
+ rels.SetAttribute('Type', xml_.GetTemplate('RelationshipWorkSheet'));
+ rels.SetAttribute('Id', rid);
+ //workbook_rels.Print;
+
+ //设置 xl/workbook.xml
+ workbook := GetXmlFileObj('xl/workbook.xml');
+ node := workbook.FirstChildElement('workbook').FirstChildElement('sheets').InsertEndChild('element','sheet');
+ node.SetAttribute('r:id', rid);
+ node.SetAttribute('sheetId', sheetId);
+ node.SetAttribute('name', sheet);
+ //workbook.Print();
+
+ //设置docProps/app.xml
+ app := GetXmlFileObj(xml_.GetFileName('docProps_app'));
+ //app.Print();
+ node := app.FirstChildElement('Properties').FirstChildElement('TitlesOfParts');
+ if not ifObj(node) then Begin
+ node := app.FirstChildElement('Properties').InsertEndChild('element','TitlesOfParts');
+ End;
+ vector := node.FirstChildElement('vt:vector');
+ if not ifObj(vector) then Begin
+ vector := node.InsertEndChild('element', 'vt:vector');
+ vector.SetAttribute('baseType', 'lpstr');
+ vector.SetAttribute('size', length(sheetNames_) + 1);
+ for i:=0 to length(sheetNames_)-1 do Begin
+ vector.InsertEndChild('element', 'vt:lpstr', sheetNames_[i]['name']);
+ End;
+ End
+ else
+ vector.SetAttribute('size', length(sheetNames_) + 1);
+ vector.InsertEndChild('element', 'vt:lpstr', sheet);
+ //app.Print();
+
+ //设置[Content_Types].xml
+ AddContentType(xml_.GetTemplate('SheetContentType'), '/' + fname);
+
+ sheetNames_[sheetsCount_]['name'] := sheet;
+ sheetNames_[sheetsCount_]['sheetId'] := sheetId;
+ sheetNames_[sheetsCount_]['rid'] := rid;
+ sheetNames_[sheetsCount_]['file'] := fname;
+ sheetIndexMap_[ LowerCase(sheet) ] := sheetsCount_;
+ sheetsCount_ ++;
+
+ SetDefaultSheet(sheet);
+ return array(0, '');
+ End;
+
+ ///删除sheet
+ ///sheet: string,工作表名称
+ ///返回: [err, info]
+ Function DeleteSheet(sheet);
+ Begin
+ if sheetsCount_ <= 1 then return array(-1, 'Can not delete the last sheet.');
+ ind := sheetIndexMap_[ LowerCase(sheet) ];
+ if not ifint(ind) then return array(-2, 'the sheet is not exist.');
+
+ del := sheetNames_[ind];
+ defaultSheet := GetDefaultSheet();
+ sheetsCount_--;
+ sheetNames_ := select * from sheetNames_ where thisrowindex <> ind end;
+
+ //删除文件xl/worksheets/sheetN.xml
+ zipfile_.Remove(del['file']);
+
+ //设置 workbook.xml.rels
+ files := zipfile_.Files();
+ for i:=0 to length(sheetNames_)-1 do Begin
+ sheetNames_[i]['rid'] := 'rId' + inttostr(i + 1); //重置rId
+ oldname := sheetNames_[i]['file'];
+ newname := sheetPrefix_ + inttostr(i + 1) + '.xml';
+ sheetNames_[i]['file'] := newname;
+ if oldname <> newname then Begin
+ //echo 'old=',oldname,',new=',newname,'\n';
+ n := vselect thisrowindex from files where ['FileName'] = oldname end;
+ if ifint(n) then Begin
+ files[n]['New-FileName'] := newname; //重置文件名
+ End;
+ End;
+ End;
+ for i:=0 to length(files)-1 do Begin
+ if ifstring(files[i]['New-FileName']) then Begin
+ f := zipfile_.Get(i);
+ //echo '-------------------',f.FileName(),'\n';
+ f.FileName := files[i]['New-FileName'];
+ End;
+ End;
+ workbook_rels := GetXmlFileObj(xml_.GetFileName('workbook_rels'));
+ parent := workbook_rels.FirstChildElement('Relationships');
+ rels := parent.FirstChildElement('Relationship');
+ while ifObj(rels) do Begin
+ target := rels.GetAttribute('Target');
+ if AnsiStartsText('worksheets/sheet', target) then Begin
+ parent.DeleteChild(rels);
+ break;
+ End;
+ rels := rels.NextElement();//删除节点
+ End;
+ //workbook_rels.Print();
+ i := 0;
+ maxRid := sheetsCount_ + 1;
+ node := workbook_rels.FirstChildElement('Relationships').FirstChildElement('Relationship');
+ while ifObj(node) do Begin
+ target := node.GetAttribute('Target');
+ if AnsiStartsText('worksheets/sheet', target) then Begin
+ node.SetAttribute('Target', getTarget( i + 1));//重置文件名
+ node.SetAttribute('Id', sheetNames_[i]['rid']);//重置rId
+ i++;
+ End
+ Else Begin
+ node.SetAttribute('Id', 'rId' $ maxRid);//重置rId
+ maxRid ++;
+ End;
+ node := node.NextElement();
+ End;
+ //workbook_rels.Print();
+
+ //设置 xl/workbook.xml
+ workbook := GetXmlFileObj('xl/workbook.xml');
+ workbook.FirstChildElement('workbook').FirstChildElement('sheets').DeleteChildren();
+ for i:=0 to length(sheetNames_)-1 do Begin
+ node := workbook.FirstChildElement('workbook').FirstChildElement('sheets').InsertEndChild('element','sheet');
+ node.SetAttribute('name', sheetNames_[i]['name']);
+ node.SetAttribute('sheetId', sheetNames_[i]['sheetId']);
+ node.SetAttribute('r:id', sheetNames_[i]['rid']);
+ End;
+ //workbook.Print();
+
+ //设置docProps/app.xml
+ app := GetXmlFileObj(xml_.GetFileName('docProps_app'));
+ node := app.FirstChildElement('Properties').FirstChildElement('TitlesOfParts');
+ if ifObj(node) then Begin
+ vector := node.FirstChildElement('vt:vector');
+ if ifObj(vector) then Begin
+ vector.SetAttribute('size', sheetsCount_);
+ n := vector.FirstChildElement('vt:lpstr');
+ while ifObj(n) do Begin
+ if n.GetText() = del['name'] then Begin
+ vector.DeleteChild(n);
+ break;
+ End;
+ n := n.NextElement();
+ End;
+ End;
+ End;
+ //app.Print();
+
+ //设置[Content_Types].xml
+ del_partname := '/' + sheetPrefix_ + inttostr(sheetsCount_ + 1) + '.xml';
+ DeleteContentType(del_partname);
+
+ xmlFileObjMap_ := array();
+
+ //设置默认工作表
+ ind := sheetIndexMap_[sheet];
+ for k, v in sheetIndexMap_ do
+ Begin
+ if v > ind then sheetIndexMap_[k] := v - 1;
+ End
+ reindex(sheetIndexMap_, array(sheet: nil));
+ ind--;
+ if ind < 0 then SetDefaultSheet(sheetNames_[0]['name']);
+ else if ind = length(sheetIndexMap_) then SetDefaultSheet(sheetNames_[length(sheetIndexMap_)]['name']);
+ else SetDefaultSheet(sheetNames_[ind]['name']);
+ return array(0, '');
+ End;
+
+ Function SetSheetName(sourceName, destName);
+ Begin
+ ind := sheetIndexMap_[ LowerCase(destName) ];
+ if ifint(ind) then return array(-3, sheet2 + ' is already exist.');
+
+ ind := sheetIndexMap_[ LowerCase(sourceName) ];
+ if not ifint(ind) then return array(-4, sheet1 + ' is not exist.');
+
+ //设置 xl/workbook.xml
+ workbook := GetXmlFileObj('xl/workbook.xml');
+ node := workbook.FirstChildElement('workbook').FirstChildElement('sheets').FirstChildElement('Sheet');
+ while ifObj(node) do
+ Begin
+ name := node.GetAttribute('name');
+ if name = sourceName then
+ Begin
+ node.SetAttribute('name', destName);
+ break;
+ End
+ node := node.NextElement();
+ End
+
+ //设置docProps/app.xml
+ app := GetXmlFileObj(xml_.GetFileName('docProps_app'));
+ node := app.FirstChildElement('Properties').FirstChildElement('TitlesOfParts');
+ lpstr := node.FirstChildElement('vt:vector').FirstChildElement('vt:lpstr');
+ while ifObj(lpstr) do
+ Begin
+ if lpstr.GetText() = sourceName then lpstr.SetValue(destName);
+ lpstr := lpstr.NextElement();
+ End
+
+ sheetNames_[ind]['name'] := destName;
+ reindex(sheetIndexMap_, array(LowerCase(sourceName) : LowerCase(destName)));
+ return array(0, '');
+ End;
+
+ Function AddContentType(type, name);overload;
+ Begin
+ content := GetXmlFileObj(xml_.GetFileName('Content_Types'));
+ element := content.FirstChildElement('Types').InsertEndChild('element', 'Override');
+ element.SetAttribute('PartName', name);
+ element.SetAttribute('ContentType', type);
+ //content.Print();
+ End;
+
+ Function AddContentVml();overload;
+ Begin
+ content := GetXmlFileObj(xml_.GetFileName('Content_Types'));
+ content := content.FirstChildElement('Types');
+ element := content.FirstChildElement('Default');
+ prev := element;
+ while ifObj(element) do
+ Begin
+ attr := element.GetAttribute('Extension');
+ if attr = 'vml' then return;
+ prev := element;
+ element := element.NextElement('Default');
+ End
+ ContentType := 'application/vnd.openxmlformats-officedocument.vmlDrawing';
+ element := content.InsertAfterChild(prev, 'element', 'Default');
+ element.SetAttribute('Extension', 'vml');
+ element.SetAttribute('ContentType', contentType);
+ End
+
+ Function DeleteContentType(del_partname);
+ Begin
+ content := GetXmlFileObj(xml_.GetFileName('Content_Types'));
+ types := content.FirstChildElement('Types');
+ element := types.FirstChildElement('Override');
+ while ifObj(element) do Begin
+ partname := element.GetAttribute('PartName');
+ if partname = del_partname then Begin
+ types.DeleteChild(element);
+ break;
+ End;
+ element := element.NextElement();
+ End;
+ //content.Print();
+ End;
+
+ Function GetRelationshipRid(sheet, prefix);
+ Begin
+ ind := sheetIndexMap_[ LowerCase(sheet) ];
+ file := 'xl/worksheets/_rels/' + ExtractFileName(sheetNames_[ind]['file']) + '.rels';
+ files := zipfile_.Files();
+ isexist := vselect thisrowindex from files where ['FileName']=file end;
+ if ifnil(isexist) then Begin
+ zipfile_.Add(file, xml_.XmlHeader() + xml_.GetTemplate('sheet_rels'));
+ end
+ xmlfile := GetXmlFileObj(file);
+ r := class(xlsxXml).FindRelationshipRid(xmlfile, prefix);
+ r[2] := sheetNames_[ind]['file'];
+ r[3] := file;
+ return r;
+ End;
+
+ Function AddRelationshipRid(relsfile, target, type, rid);
+ Begin
+ xmlfile := GetXmlFileObj(relsfile);
+ class(xlsxXml).AddRelationshipRid(xmlfile, target, type, rid);
+ End;
+
+ Function GetFilesCount(prefix);
+ Begin
+ files := zipfile_.Files();
+ return vselect countof( ['FileName'] ) from files where AnsiStartsText(prefix, ['FileName']) end;
+ End;
+
+ Function FileIsExist(fname);
+ Begin
+ files := zipfile_.Files();
+ return vselect countof( ['FileName'] ) from files where ['FileName']=fname end;
+ End;
+
+ Function GetSheetXmlfile(sheet);
+ Begin
+ ind := sheetIndexMap_[ LowerCase(sheet) ];
+ if not ifint(ind) then return 0;
+ return GetXmlFileObj(sheetNames_[ind]['file']);
+ End;
+
+ Function GetSheetObj(sheet);
+ Begin
+ o := sheetObjMap_[sheet];
+ if not ifnil(o) then return o;
+
+ ind := sheetIndexMap_[ LowerCase(sheet) ];
+ if not ifint(ind) then return 0;
+ f := GetXmlFileObj(sheetNames_[ind]['file']);
+ if not ifObj(f) then return 0;
+ o := f.Sheet();
+ sheetObjMap_[ sheet ] := o;
+ return o;
+ End;
+
+ ///插入列,在指定列前插入空白列
+ ///sheet: string,工作表名称
+ ///col: string 列名,如: "D"
+ ///返回: [err, info]
+ Function InsertCol(sheet, col);
+ Begin
+ sObj := GetSheetObj(sheet);
+ if not ifObj(sObj) then return array(-1, 'Can not get sheet object');
+ sObj.InsertCol(col);
+ return array(0, 'ok');
+ End;
+
+ ///插入行,在指定列前插入空白行
+ ///sheet: string,工作表名称
+ ///row: int
+ ///返回: [err, info]
+ Function InsertRow(sheet, row);
+ Begin
+ sObj := GetSheetObj(sheet);
+ if not ifObj(sObj) then return array(-1, 'Can not get sheet object');
+ sObj.InsertRow(row);
+ return array(0, 'ok');
+ End;
+
+ ///删除列
+ ///sheet: string,工作表名称
+ ///col: string,如: "D"
+ ///返回: [err, info]
+ Function RemoveCol(sheet, col);
+ Begin
+ sObj := GetSheetObj(sheet);
+ if not ifObj(sObj) then return array(-1, 'Can not get sheet object');
+ sObj.RemoveCol(col);
+ End;
+
+ ///删除行
+ ///sheet: string,工作表名称
+ ///row: int
+ ///返回: [err, info]
+ Function RemoveRow(sheet, row);
+ Begin
+ sObj := GetSheetObj(sheet);
+ if not ifObj(sObj) then return array(-1, 'Can not get sheet object');
+ sObj.RemoveRow(row);
+ //t := sObj.Import(); echo tostn(t);
+ End;
+
+ ///获取图表列表
+ ///sheet: string,工作表名称
+ ///返回: [err, ChartList]
+ Function GetCharts(sheet);
+ Begin
+ ind := sheetIndexMap_[ LowerCase(sheet) ];
+ if not ifint(ind) then return array(-1, 'The sheet is not exist.');
+ //rid -> xl/worksheets/_rels/sheetN.xml.rels -> ="../drawings/drawingX.xml -> xl/drawings/_rels/drawingX.xml.rels -> charts
+ rid := sheetNames_[ind]['rid'];
+ id := rightstr(rid, length(rid)-3);
+ rels := 'xl/worksheets/_rels/sheet' + id + '.xml.rels';
+ if not FileIsExist(rels) then return array(0, array());
+ xmlfile := GetXmlFileObj(rels);
+ [rid2, target] := class(xlsxXml).FindRelationshipRid(xmlfile, '../drawings/drawing');
+ if target = '' then return array(0, array());
+ drawingFile := ReplaceStr(target, '..', 'xl');
+ drawingRels := 'xl/drawings/_rels/' + ExtractFileName(target) + '.rels';
+ if not FileIsExist(drawingRels) then return array(0, array());
+ xml := GetXmlFileObj(drawingRels);
+ charts := array();
+ node := xml.FirstChildElement('Relationships').FirstChildElement('Relationship');
+
+ while ifObj(node) do Begin
+ target := node.GetAttribute('Target');
+ if AnsiStartsText('../charts/chart', target) then Begin
+ id := node.GetAttribute('Id');
+ chartFile := ReplaceStr(target, '..', 'xl');
+ chart := TOfficeObj('TChart');
+ setChartInfo(chartFile, chart);
+ charts[i] := new TChartOp(chart);
+ charts[i].ChartFile := chartFile;
+ charts[i].DrawingFile := drawingFile;
+ charts[i].Rid := id;
+ i++;
+ End;
+ node := node.NextElement();
+ End;
+ if length(charts) = 0 then return array(0, array());
+ chartNameMap := array();
+ xml := GetXmlFileObj(drawingFile);
+ node := xml.FirstChildElement('xdr:wsDr').FirstChildElement('xdr:twoCellAnchor');
+ while ifObj(node) do Begin
+ name := getNodeValue(node, 'xdr:graphicFrame/xdr:nvGraphicFramePr/xdr:cNvPr', 'name');
+ rid := getNodeValue(node, 'xdr:graphicFrame/a:graphic/a:graphicData/c:chart', 'r:id');
+ if rid <> '' and name <> '' then
+ chartNameMap[rid] := name;
+ node := node.NextElement('xdr:twoCellAnchor');
+ End;
+ for i:=0 to length(charts)-1 do Begin
+ charts[i].Chart.Name := chartNameMap[charts[i].Rid];
+ End;
+ return array(0, charts);
+ End;
+
+ Function GetSheetsCount();
+ Begin
+ return array(0, sheetsCount_);
+ End;
+
+ Function GetXmlFileObj(n);
+ Begin
+ o := xmlFileObjMap_[ n ];
+ if not ifnil(o) then return o;
+ o := zipfile_.Get(n);
+ xmlFileObjMap_[ n ] := o;
+ return o;
+ End;
+
+ Function SetSheetVisible(sheet, visible);
+ Begin
+ workbook := GetXmlFileObj('xl/workbook.xml');
+ node := workbook.FirstChildElement('workbook').FirstChildElement('sheets').FirstChildElement('sheet');
+ hidden := visible = 1 ? 0 : 1;
+ while ifObj(node) do
+ Begin
+ name := node.GetAttribute('name');
+ if name = sheet then
+ Begin
+ if hidden then node.SetAttribute('state', 'hidden');
+ else node.DeleteAttribute('state');
+ return array(0, '');
+ End
+ node := node.NextElement();
+ End
+ return array(1, 'Can\'t not find sheet ' $ sheet);
+ End
+
+ Function GetSheetVisible(sheet);
+ Begin
+ sheet_file := GetSheetXmlfile(sheet);
+ if not ifObj(sheet_file) then return array(1, 'The Sheet is not exist!');
+ workbook := GetXmlFileObj('xl/workbook.xml');
+ node := workbook.FirstChildElement('workbook').FirstChildElement('sheets').FirstChildElement('sheet');
+ while ifObj(node) do
+ Begin
+ name := node.GetAttribute('name');
+ if name = sheet then
+ Begin
+ val := node.GetAttribute('state');
+ if val = 'hidden' then return array(0, 0);
+ else return array(0, 1);
+ End
+ node := node.NextElement();
+ End
+ return array(1, 'The Sheet is not exist!');
+ End
+
+ Function SetRowVisible(sheet, row, visible)
+ Begin
+ hidden := visible = 1 ? 0 : 1;
+ sheet_xml_file := GetSheetXmlfile(sheet);
+ if not ifObj(sheet_xml_file) then return array(1, 'The Sheet is not exist!');
+ sheet_node := sheet_xml_file.FirstChildElement('worksheet').FirstChildElement('sheetData');
+ node := sheet_node.FirstChildElement('row');
+ flag := 1;
+ prev_node := 0;
+ while ifObj(node) do
+ Begin
+ r := strtoint(node.GetAttribute('r'));
+ if r = row then
+ Begin
+ if hidden then node.SetAttribute('hidden', '1');
+ else sheet_node.DeleteChild(node);
+ return array(0, '');
+ End
+ if r > row and flag then
+ Begin
+ flag := 0;
+ position_node := prev_node;
+ End
+ prev_node := node;
+ node := node.NextElement();
+ End
+ if hidden then
+ Begin
+ arr := array('type': 'element', 'name': 'row', 'attributes': array('r': row, 'hidden': 1, 'x14ac:dyDescent': 0.25));
+ if flag or position_node = 0 then sheet_node.InsertFirstChild(arr);
+ else sheet_node.InsertAfterChild(position_node, arr);
+ End
+ return array(0, '');
+ End
+
+ Function GetRowVisble(sheet, row)
+ Begin
+ sheet_xml_file := GetSheetXmlfile(sheet);
+ if not ifObj(sheet_xml_file) then return array(1, 'The Sheet is not exist!');
+ row := inttostr(row);
+ sheet_node := sheet_xml_file.FirstChildElement('worksheet').FirstChildElement('sheetData');
+ node := sheet_node.FirstChildElement('row');
+ while ifObj(node) do
+ Begin
+ r := node.GetAttribute('r');
+ if r = row then
+ Begin
+ val := node.GetAttribute('hidden');
+ if val = '1' then return array(0, 0);
+ break;
+ End
+ node := node.NextElement();
+ End
+ return array(0, 1);
+ End
+
+ Function SetColVisible(sheet, col, visible)
+ Begin
+ hidden := visible = 1 ? 0 : 1;
+ sheet_xml_file := GetSheetXmlfile(sheet);
+ if not ifObj(sheet_xml_file) then return array(1, 'The Sheet is not exist!');
+ work_node := sheet_xml_file.FirstChildElement('worksheet');
+ col_node := work_node.FirstChildElement('cols');
+ if not ifObj(col_node) and hidden then col_node := work_node.InsertAfterChild(work_node.FirstChildElement('sheetFormatPr'),'element', 'cols');
+ node := col_node.FirstChildElement('col');
+ while ifObj(node) do
+ Begin
+ min := strtoint(node.GetAttribute('min'));
+ max := strtoint(node.GetAttribute('max'));
+ val := trystrtoint(node.GetAttribute('hidden'), r) ? '' : r;
+ if col >= min and col <= max then
+ Begin
+ if hidden = val then return array(0, '');
+ else Begin
+ if col = min and col = max then
+ node.SetAttribute('hidden', hidden);
+ else if col = min then node.SetAttribute('min', col + 1);
+ else if col = max then node.SetAttribute('max', col - 1);
+ else Begin
+ node2 := col_node.InsertAfterChild(node, node.Marshal()[0]);
+ node.SetAttribute('max', col - 1);
+ node2.SetAttribute('min', col + 1);
+ End
+ return array(0, '');
+ End
+ End
+ node := node.NextElement();
+ End
+ if hidden then
+ Begin
+ arr := array('type': 'element', 'name': 'col', 'attributes': ('min': col, 'max': col, 'width': 0, 'hidden': 1,
+ 'customWidth': 1));
+ col_node.InsertEndChild(arr);
+ End
+ return array(0, '');
+ End
+
+ Function GetColVisble(sheet, col);
+ Begin
+ sheet_xml_file := GetSheetXmlfile(sheet);
+ if not ifObj(sheet_xml_file) then return array(1, 'The Sheet is not exist!');
+ work_node := sheet_xml_file.FirstChildElement('worksheet');
+ col_node := work_node.FirstChildElement('cols');
+ if not ifObj(col_node) then return array(0, 1);
+ node := col_node.FirstChildElement('col');
+ while ifObj(node) do
+ Begin
+ min := strtoint(node.GetAttribute('min'));
+ max := strtoint(node.GetAttribute('max'));
+ val := node.GetAttribute('hidden');
+ if col >= min and col <= max then
+ Begin
+ if val = '1' then return array(0, 0);
+ break;
+ End
+ node := node.NextElement();
+ End
+ return array(0, 1);
+ End
+
+ Function SetRowHeight(sheet, row, height);
+ Begin
+ if not (height >= 0 and height < 409) then return array(1, "行高必须在0-409之间");
+ sheet_xml_file := GetSheetXmlfile(sheet);
+ if not ifObj(sheet_xml_file) then return array(1, 'The Sheet is not exist!');
+ sheet_node := sheet_xml_file.FirstChildElement('worksheet').FirstChildElement('sheetData');
+ node := sheet_node.FirstChildElement('row');
+ flag := 1;
+ prev_node := 0;
+ while ifObj(node) do
+ Begin
+ r := strtofloat(node.GetAttribute('r'));
+ if r = row then
+ Begin
+ node.SetAttribute('customHeight', 1);
+ node.SetAttribute('ht', height);
+ if height = 0 then node.SetAttribute('hidden', 1);
+ else node.SetAttribute('hidden', 0);
+ return array(0, '');
+ End
+ if r > row and flag then
+ Begin
+ flag := 0;
+ position_node := prev_node;
+ End
+ prev_node := node;
+ node := node.NextElement();
+ End
+ arr := array('r': row, 'customHeight': 1, 'ht': height, 'x14ac:dyDescent': 0.25);
+ if height = 0 then arr union= array('hidden': 1);
+ node_arr := array('type': 'element', 'name': 'row', 'attributes': arr);
+ if flag or position_node = 0 then sheet_node.InsertFirstChild(node_arr);
+ else sheet_node.InsertAfterChild(position_node, node_arr);
+ return array(0, '');
+ End
+
+ Function GetRowHeight(sheet, row)
+ Begin
+ sheet_xml_file := GetSheetXmlfile(sheet);
+ if not ifObj(sheet_xml_file) then return array(1, 'The Sheet is not exist!');
+ work_node := sheet_xml_file.FirstChildElement('worksheet');
+ sheet_node := work_node.FirstChildElement('sheetData');
+ node := sheet_node.FirstChildElement('row');
+ while ifObj(node) do
+ Begin
+ r := strtofloat(node.GetAttribute('r'));
+ if r = row then
+ Begin
+ ht := strtofloat(node.GetAttribute('ht'));
+ hidden := node.GetAttribute('hidden');
+ if hidden = 0 then return array(0, 0);
+ return array(0, ht);
+ End
+ node := node.NextElement();
+ End
+ default_ht := work_node.FirstChildElement('sheetFormatPr').GetAttribute('defaultRowHeight');
+ return array(0, strtofloat(default_ht));
+ End
+
+ Function SetColWidth(sheet, startCol, endCol, width);
+ Begin
+ if not (width >= 0 and width < 255) then return array(-1, "Column width must be between 0 and 255.");
+ startCol := xlsx_call('ColumnNameToNumber', startCol)[1];
+ endCol := xlsx_call('ColumnNameToNumber', endCol)[1];
+ if startCol > endCol then return array(-1, "First Colunm must be bigger than Last Column.");
+ sheet_xml_file := GetSheetXmlfile(sheet);
+ if not ifObj(sheet_xml_file) then return array(1, 'The Sheet is not exist!');
+ work_node := sheet_xml_file.FirstChildElement('worksheet');
+ col_node := work_node.FirstChildElement('cols');
+ if not ifObj(col_node) then
+ col_node := work_node.InsertAfterChild(work_node.FirstChildElement('sheetFormatPr'), 'element', 'cols');
+ node := col_node.FirstChildElement('col');
+ while ifObj(node) do
+ Begin
+ min := strtoint(node.GetAttribute('min'));
+ max := strtoint(node.GetAttribute('max'));
+ val := trystrtofloat(node.GetAttribute('width'), r) ? r : '';
+ if startCol >= min and endCol <= max then
+ Begin
+ if width = val then return array(0, '');
+ if min = max then
+ Begin
+ node.SetAttribute('width', width);
+ node.SetAttribute('customWidth', 1);
+ return array(0, '');
+ End
+ else Begin
+ insert_flag := 1;
+ node_new := col_node.InsertAfterChild(node, node.Marshal()[0]);
+ node.SetAttribute('max', startCol - 1);
+ node_new.SetAttribute('min', endCol + 1);
+ End
+ break;
+ End
+ node := node.NextElement();
+ End
+ arr := array('type': 'element', 'name': 'col', 'attributes': ('min': startCol, 'max': endCol, 'width': width,
+ 'customWidth': 1));
+ if insert_flag then col_node.InsertAfterChild(node, arr);
+ else col_node.InsertEndChild(arr);
+ return array(0, '');
+ End;
+
+ Function GetColWidth(sheet, col);
+ Begin
+ sheet_xml_file := GetSheetXmlfile(sheet);
+ if not ifObj(sheet_xml_file) then return array(1, 'The Sheet is not exist!');
+ work_node := sheet_xml_file.FirstChildElement('worksheet');
+ col_node := work_node.FirstChildElement('cols');
+ default_width := work_node.FirstChildElement('sheetFormatPr').GetAttribute('defaultColWidth');
+ default_width := trystrtofloat(default_width, r) ? r: -1;
+ if not ifObj(col_node) then return array(0, default_width);
+
+ col := xlsx_call('ColumnNameToNumber', col)[1];
+ node := col_node.FirstChildElement('col');
+ while ifObj(node) do
+ Begin
+ min := strtoint(node.GetAttribute('min'));
+ max := strtoint(node.GetAttribute('max'));
+ if col >= min and col <= max then
+ Begin
+ width := trystrtofloat(node.GetAttribute('width'), r) ? r : -1;
+ if width = -1 then break;
+ return array(0, width);
+ End
+ node := node.NextElement();
+ End
+ return array(0, default_width);
+ End;
+
+ Function MergeCell(sheet, hcell, vcell);
+ Begin
+ sheet_xml_file := GetSheetXmlfile(sheet);
+ if not ifObj(sheet_xml_file) then return array(1, 'The Sheet is not exist.');
+ if hcell = vcell then return array(1, 'Duplicate cell.');
+ work_node := sheet_xml_file.FirstChildElement('worksheet');
+ merge_node := work_node.FirstChildElement('mergeCells');
+ if not ifObj(merge_node) then
+ Begin
+ merge_node := work_node.InsertAfterChild(work_node.FirstChildElement('sheetData'), 'element', 'mergeCells');
+ count := 0;
+ merge_node.SetAttribute('count', count);
+ End
+ node := merge_node.FirstChildElement('mergeCell');
+ count := count = 0 ? count : trystrtoint(merge_node.GetAttribute('count'), r) ? r : 0;
+ hcell_ := xlsx_call('SplitCellName', hcell);
+ vcell_ := xlsx_call('SplitCellName', vcell);
+ hcell_int := xlsx_call('ColumnNameToNumber', hcell_[1])[1];
+ vcell_int := xlsx_call('ColumnNameToNumber', vcell_[1])[1];
+ while ifObj(node) do
+ Begin
+ ref := node.GetAttribute('ref');
+ position := pos(':', ref);
+ cell1 := xlsx_call('SplitCellName', ref[1:position-1]);
+ cell2 := xlsx_call('SplitCellName', ref[position+1:]);
+ cell1_int := xlsx_call('ColumnNameToNumber', cell1[1])[1];
+ cell2_int := xlsx_call('ColumnNameToNumber', cell2[1])[1];
+ if (hcell_[2] >= cell1[2] and hcell_[2] <= cell2[2] and hcell_int >= cell1_int and hcell_int <= cell2_int)
+ or (vcell_[2] >= cell1[2] and vcell_[2] <= cell2[2] and vcell_int >= cell1_int and vcell_int <= cell2_int)
+ then Begin
+ merge_node.DeleteChild(node);
+ break;
+ End
+ node := node.NextElement();
+ End
+ ref := hcell $ ":" $ vcell;
+ node := merge_node.InsertEndChild('element', 'mergeCell');
+ node.SetAttribute('ref', ref);
+ merge_node.SetAttribute('count', count + 1);
+
+ sheet_obj := GetSheetObj(sheet);
+ r := sheet_obj.SetCellStyle(hcell, vcell, "0");
+ return array(0, '');
+ End
+
+ Function MergeCell1(sheet, hcell, vcell);
+ Begin
+ sheet_xml_file := GetSheetXmlfile(sheet);
+ if not ifObj(sheet_xml_file) then return array(1, 'The Sheet is not exist.');
+ work_node := sheet_xml_file.FirstChildElement('worksheet');
+ // mergeCells节点
+ merge_node := work_node.FirstChildElement('mergeCells');
+ // SheetData节点
+ sheet_node := work_node.FirstChildElement('sheetData');
+ row_node := sheet_node.FirstChildElement('row');
+ if not ifObj(merge_node) then
+ Begin
+ merge_node := work_node.InsertAfterChild(sheet_node, 'element', 'mergeCells');
+ count := 0;
+ merge_node.SetAttribute('count', count);
+ End
+ node := merge_node.FirstChildElement('mergeCell');
+ count := count = 0 ? count : trystrtoint(merge_node.GetAttribute('count'), r) ? r : 0;
+ hcell_ := xlsx_call('SplitCellName', hcell);
+ vcell_ := xlsx_call('SplitCellName', vcell);
+ hcell_int := xlsx_call('ColumnNameToNumber', hcell_[1])[1];
+ vcell_int := xlsx_call('ColumnNameToNumber', vcell_[1])[1];
+ spans1 := hcell_int;
+ spans2 := vcell_int;
+ while ifObj(node) do
+ Begin
+ ref := node.GetAttribute('ref');
+ position := pos(':', ref);
+ cell1 := xlsx_call('SplitCellName', ref[1:position-1]);
+ cell2 := xlsx_call('SplitCellName', ref[position+1:]);
+ cell1_int := xlsx_call('ColumnNameToNumber', cell1[1])[1];
+ cell2_int := xlsx_call('ColumnNameToNumber', cell2[1])[1];
+ if (hcell_[2] >= cell1[2] and hcell_[2] <= cell2[2] and hcell_int >= cell1_int and hcell_int <= cell2_int)
+ or (vcell_[2] >= cell1[2] and vcell_[2] <= cell2[2] and vcell_int >= cell1_int and vcell_int <= cell2_int)
+ then Begin
+ while ifObj(row_node) do
+ Begin
+ r := strtoint(row_node.GetAttribute('r'));
+ if r >= cell1[2] and r <= cell2[2] then
+ Begin
+ prev_node := row_node;
+ row_node := row_node.NextElement();
+ sheet_node.DeleteChild(prev_node);
+ End
+ End
+ spans1 := hcell_int >= cell1_int ? hcell_int : cell1_int;
+ spans2 := vcell_int >= cell2_int ? vcell_int : cell2_int;
+ merge_node.DeleteChild(node);
+ break;
+ End
+ node := node.NextElement();
+ End
+ ref := hcell $ ":" $ vcell;
+ node := merge_node.InsertEndChild('element', 'mergeCell');
+ node.SetAttribute('ref', ref);
+ merge_node.SetAttribute('count', count + 1);
+
+ row_node := sheet_node.FirstChildElement('row');
+ pr_node := work_node.FirstChildElement('sheetFormatPr');
+ x14ac := pr_node.GetAttribute('a14ac:dyDescent') ? : '0.25';
+ prev_node := 0;
+ r2 := 0;
+ while ifObj(row_node) do
+ Begin
+ r := strtoint(row_node.GetAttribute('r'));
+ if r < hcell_[2] and prev_node = 0 then
+ end_node := 0; // InsertFirstChild
+ else if hcell_[2] > r2 and hcell_[2] < r then
+ end_node := 1; // InsertAfterChild
+
+ if ifObj(end_node) then break;
+ r2 := r;
+ prev_node := row_node;
+ row_node := row_node.NextElement();
+ End
+
+ spans := spans1 $ ":" $ spans2;
+ for i:=hcell_[2] to vcell_[2] do
+ Begin
+ arr := array('type': 'element', 'name': 'row', 'attributes': ('c': i, 'spans': spans, 'x14ac:dyDescent': x14ac));
+ arr['children'] := generateRow(hcell_int, vcell_int, i);
+ if ifObj(end_node) then end_node := sheet_node.InsertAfterChild(end_node, arr);
+ else if end_node = 0 then end_node := sheet_node.InsertFirstChild(arr);
+ else if end_node = 1 then end_node := sheet_node.InsertAfterChild(prev_node, arr);
+ else sheet_node.InsertEndChild(arr);
+ End
+
+ r1 := xlsx_call('ColumnNumberToName', spans1)[1];
+ r2 := xlsx_call('ColumnNumberToName', spans2)[1];
+ dimension_node := work_node.FirstChildElement('dimension');
+ dimension_node.SetAttribute('ref', r1 $ ":" $ r2);
+ return array(0, '');
+ End
+
+ Function UnMergeCell(sheet, hcell, vcell);
+ Begin
+ sheet_xml_file := GetSheetXmlfile(sheet);
+ if not ifObj(sheet_xml_file) then return array(1, 'The Sheet is not exist!');
+ work_node := sheet_xml_file.FirstChildElement('worksheet');
+ // mergeCells节点
+ merge_node := work_node.FirstChildElement('mergeCells');
+ // SheetData节点
+ sheet_node := work_node.FirstChildElement('sheetData');
+ row_node := sheet_node.FirstChildElement('row');
+ if not ifObj(merge_node) then array(0, '');
+ node := merge_node.FirstChildElement('mergeCell');
+ if not ifObj(node) then return array(0, '');
+ count := trystrtoint(merge_node.GetAttribute('count'), r) ? r : 0;
+ hcell_ := xlsx_call('SplitCellName', hcell);
+ vcell_ := xlsx_call('SplitCellName', vcell);
+ while ifObj(node) do
+ Begin
+ ref := node.GetAttribute('ref');
+ position := pos(':', ref);
+ cell1 := xlsx_call('SplitCellName', ref[1:position-1]);
+ cell2 := xlsx_call('SplitCellName', ref[position+1:]);
+ if ref[1:position-1] = hcell and ref[position+1:] = vcell
+ then Begin
+ while ifObj(row_node) do
+ Begin
+ r := strtoint(row_node.GetAttribute('r'));
+ if r >= cell1[2] and r <= cell2[2] then
+ Begin
+ prev_node := row_node;
+ row_node := row_node.NextElement();
+ sheet_node.DeleteChild(prev_node);
+ End
+ End
+ merge_node.DeleteChild(node);
+ flag := 1;
+ break;
+ End
+ node := node.NextElement();
+ End
+ if not flag then return array(0, '');
+ if count - 1 <> 0 then
+ merge_node.SetAttribute('count', count - 1);
+ else
+ work_node.DeleteChild(merge_node);
+ return array(0, '');
+ End;
+
+ Function SetSheetDefaultRowHeight(sheet, height);
+ Begin
+ sheet_xml_file := GetSheetXmlfile(sheet);
+ if not ifObj(sheet_xml_file) then return array(1, 'The Sheet is not exist!');
+ work_node := sheet_xml_file.FirstChildElement('worksheet');
+ node := work_node.FirstChildElement('sheetFormatPr');
+ node.SetAttribute('defaultRowHeight', height);
+ return array(0, '');
+ End
+
+ Function GetSheetDefaultRowHeight(sheet);
+ Begin
+ sheet_xml_file := GetSheetXmlfile(sheet);
+ if not ifObj(sheet_xml_file) then return array(1, 'The Sheet is not exist!');
+ work_node := sheet_xml_file.FirstChildElement('worksheet');
+ node := work_node.FirstChildElement('sheetFormatPr');
+ flag := trystrtofloat(node.GetAttribute('defaultRowHeight'), height);
+ if flag then return array(0, height);
+ return array(1, "Can't find attribute : defaultRowHeight!");
+ End
+
+ Function SetSheetDefaultColWidth(sheet, width);
+ Begin
+ sheet_xml_file := GetSheetXmlfile(sheet);
+ if not ifObj(sheet_xml_file) then return array(1, 'The Sheet is not exist!');
+ work_node := sheet_xml_file.FirstChildElement('worksheet');
+ node := work_node.FirstChildElement('sheetFormatPr');
+ node.SetAttribute('defaultColWidth', width);
+ return array(0, '');
+ End
+
+ Function GetSheetDefaultColWidth(sheet);
+ Begin
+ sheet_xml_file := GetSheetXmlfile(sheet);
+ if not ifObj(sheet_xml_file) then return array(1, 'The Sheet is not exist!');
+ work_node := sheet_xml_file.FirstChildElement('worksheet');
+ node := work_node.FirstChildElement('sheetFormatPr');
+ flag := trystrtofloat(node.GetAttribute('defaultColWidth'), width);
+ if flag then return array(0, width);
+ return array(1, "Can't find attribute : defaultColWidth!");
+ End
+
+ Function SetDefaultSheet(sheet);
+ Begin
+ ind := sheetIndexMap_[ LowerCase(sheet) ];
+ if not ifint(ind) then return array('Can\'t not find sheet: ' $ sheet);
+ for i:=0 to length(sheetnames_)-1 do
+ begin
+ name := sheetNames_[i]['name'];
+ xml_file := GetXmlFileObj(sheetNames_[i]['file']);
+ sheet_node := xml_file.FirstChildElement('worksheet').FirstChildElement('sheetViews').FirstChildElement('sheetView');
+ if name = sheet then
+ Begin
+ sheet_node.SetAttribute('tabselected', 1);
+ workbook := GetXmlFileObj('xl/workbook.xml');
+ book_view_node := workbook.FirstChildElement('workbook').FirstChildElement('bookViews').FirstChildElement('workbookView');
+ book_view_node.SetAttribute('activeTab', ind);
+ End
+ else sheet_node.SetAttribute('tabselected', 0);
+ end
+ return array(0, '');
+ End
+
+ Function GetDefaultSheet();
+ Begin
+ for i:=0 to length(sheetnames_)-1 do
+ begin
+ name := sheetnames_[i]['name'];
+ xml_file := getxmlfileobj(sheetnames_[i]['file']);
+ sheet_node := xml_file.FirstChildElement('worksheet').FirstChildElement('sheetviews').FirstChildElement('sheetview');
+ if sheet_node.GetAttribute('tabSelected') = '1' then return array(0, name);
+ end
+ return array(1, 'Not found defaultSheet');
+ End
+
+private
+ Function generateRow(c1, c2, r);
+ Begin
+ arr := array();
+ sr := inttostr(r);
+ for i:=c1 to c2 do
+ Begin
+ name := xlsx_call('ColumnNumberToName', i);
+ if not name[0] then name := name[1];
+ name += sr;
+ arr union= array(('type': 'element', 'name': 'r', 'attributes': ('r': name, 's': '1')));
+ End
+ return arr;
+ End
+
+ Function getWorkbookRelsRid();
+ Begin
+ if rId_ >= 0 then Begin
+ rId_ ++;
+ return 'rId' $ rId_;
+ End;
+ workbook_rels := GetXmlFileObj(xml_.GetFileName('workbook_rels'));
+ [rId_, find] := class(xlsxXml).FindRelationshipRid(workbook_rels, '');
+ rId_ ++;
+ return 'rId' $ rId_;
+ End;
+
+ Function getTarget(i);
+ Begin
+ return 'worksheets/sheet' + inttostr(i) + '.xml';
+ End;
+
+ Function getNodeValue(nd, uri, key);
+ Begin
+ node := nd;
+ arr := str2array(uri, '/');
+ for i:=0 to length(arr)-1 do Begin
+ node := node.FirstChildElement(arr[i]);
+ if not ifObj(node) then return '';
+ End;
+ if key = '' then
+ return node.FirstChildElement().GetValue();
+ return node.GetAttribute(key);
+ End;
+
+ Function getC(chart);
+ Begin
+ return chart.C ? 'c:' : '';
+ End;
+
+ Function setChartInfo(chartFile, chart);
+ Begin
+ xml := GetXmlFileObj(chartFile);
+ chart.xmlObj := xml;
+ c := xml.FirstChildElement('c:chartSpace');
+ chart.C := ifObj(c) ? true : false;
+ if not ifObj(xml) then return;
+ chart.Title := getNodeValue(xml, chart.C ? 'c:chartSpace/c:chart/c:title/c:tx/c:rich/a:p/a:r/a:t' : 'chartSpace/chart/title/tx/rich/a:p/a:r/a:t', '');
+ node := xml.FirstChildElement(getC(chart) + 'chartSpace').FirstChildElement(getC(chart) + 'chart').FirstChildElement(getC(chart) + 'plotArea');
+ if ifObj(node) then Begin
+ node := node.FirstChildElement();
+ while ifObj(node) do Begin
+ if ifObj(node.FirstChildElement(getC(chart) + 'ser')) then
+ break;
+ node := node.NextElement();
+ End;
+ if ifObj(node) then Begin
+ chart.ChartNode := node;
+ chart.Type := node.GetName();
+ ser := node.FirstChildElement(getC(chart) + 'ser');
+ Series := array();
+ while ifObj(ser) do Begin
+ name := getNodeValue(ser, chart.C ? 'c:tx/c:strRef/c:f' : 'tx/strRef/f', '');
+ categories := getNodeValue(ser, chart.C ? 'c:cat/c:strRef/c:f' : 'cat/strRef/f', '');
+ val := getNodeValue(ser, chart.C ? 'c:val/c:numRef/c:f' : 'val/numRef/f', '');
+ Series union= array(("Name":name,"Categories":categories,"Values":val,"Node":ser));
+ ser := ser.NextElement(getC(chart) + 'ser');
+ End;
+ chart.Series := Series;
+ End;
+ End;
+ //println('title={},Series={},DefaultSer={}', chart.Title,chart.Series,DefaultSer);
+ End;
+
+ sheetsCount_:integer;
+ rId_:integer;
+ sheetNames_;
+ sheetIndexMap_;
+ sheetPrefix_:string;
+ zipfile_;
+ xml_;
+ xmlFileObjMap_; //XmlFile对象存储
+ sheetObjMap_; //XmlSheet对象存储
+End;
+
+type TChartOp = Class
+ Function Create(c);
+ Begin
+ Chart := c;
+ End;
+
+ Function RemoveSeries(i);
+ Begin
+ cnt := length(Chart.Series);
+ if i < 0 or i >= cnt then return array(-1, 'Out of range.');
+ println('ChartFile={}',ChartFile);
+ r := Chart.Series;
+ Chart.ChartNode.DeleteChild(r[i]['Node']);
+ for k:=i+1 to length(r)-1 do Begin
+ setVal(r[k]['Node'], Chart.C ? 'c:idx' : 'idx', -1);
+ setVal(r[k]['Node'], Chart.C ? 'c:order' : 'order', -1);
+ End;
+
+ tmp := r[:i-1,:];
+ tmp union= r[i+1:,:];
+ Chart.Series := tmp;
+ return array(0, '');
+ End;
+
+ Function AddSeries(Name, Categories, Val);
+ Begin
+ if length(Chart.Series) = 0 then return array(-1, 'Chart has no Series.');
+ r := Chart.Series;
+ i := length(r);
+ r[i]['Name'] := Name;
+ r[i]['Categories'] := Categories;
+ r[i]['Values'] := Val;
+ DefaultSer := r[ length(r)-1]['Node'].Marshal();
+ node := Chart.ChartNode.InsertEndChild(DefaultSer);
+ r[i]['Node'] := node;
+ Chart.Series := r;
+ setVal(node, Chart.C ? 'c:idx' : 'idx', 1);
+ setVal(node, Chart.C ? 'c:order' : 'order', 1);
+ class(xlsxXml).RemoveNode(node, Chart.C ? 'c:tx/c:strCache' : 'tx/strCache');
+ class(xlsxXml).RemoveNode(node, Chart.C ? 'c:cat/c:strCache' : 'cat/strCahce');
+ class(xlsxXml).RemoveNode(node, Chart.C ? 'c:val/c:numCache' : 'val/numCache');
+ return UpdateSeries(i, Name, Categories, Val);
+ End;
+
+ Function UpdateSeries(i, Name, Categories, Val);
+ Begin
+ r := Chart.Series;
+ r[i]['Name'] := Name;
+ r[i]['Categories'] := Categories;
+ r[i]['Values'] := Val;
+ Chart.Series := r;
+ task := array((Chart.C ? 'c:tx/c:strRef/c:f/' : 'tx/strRef/f/', 'pcdata', Name),
+ (Chart.C ? 'c:cat/c:strRef/c:f/' : 'cat/strRef/f/', 'pcdata', Categories),
+ (Chart.C ? 'c:val/c:numRef/c:f/' : 'val/numRef/f/', 'pcdata', Val),
+ );
+ for k:=0 to length(task)-1 do Begin
+ class(xlsxXml).SetNodeValue(r[i]['Node'], task[k]);
+ End;
+ return array(0, '');
+ End;
+
+ Function UpdateTitle(i, title);
+ Begin
+ task := array(Chart.C ? 'c:chartSpace/c:chart/c:title/c:tx/c:rich/a:p/a:r/a:t' : 'chartSpace/chart/title/tx/rich/a:p/a:r/a:t', 'pcdata', title);
+ class(xlsxXml).SetNodeValue(Chart.xmlObj, task);
+ return array(0, '');
+ End;
+
+ Function setVal(node, k, deta);
+ Begin
+ val := node.FirstChildElement(k).GetAttribute('val');
+ val := strtoint(val) + deta;
+ node.FirstChildElement(k).SetAttribute('val', val);
+ End;
+
+ Chart;
+ ChartFile;
+ DrawingFile;
+ Rid;
+End;