TSOffice/funcext/TSOffice/worksheet/xlsxChart.tsf

75 lines
3.1 KiB
Plaintext

Type xlsxChart = Class(TSChart)
///缺省构造函数
Function Create(sheet,excel); overload;
Begin
excel_ := excel;
class(TSChart).Create(chartData);
chartId_ := excel.WorkBook().GetFilesCount('xl/charts/chart') + 1;
drawingRID_ := excel_.WorkBook().GetSheetDrawing(sheet);
drawingXmlObj_ := excel_.WorkBook().GetXmlFileObj('xl/drawings/drawing' $ drawingRID_ $ '.xml');
drawingRelsObj := excel_.WorkBook().GetDrawingRelsFile(drawingRID_);
[chartRid_, find] := class(TSXml).FindRelationshipRid(drawingRelsObj, '');
chartRid_ ++;
class(TSXml).AddRelationshipRid(drawingRelsObj, '../charts/chart'+inttostr(chartId_)+'.xml', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart', 'rId' + inttostr(chartRid_));
xlChartFileName_ := 'xl/charts/chart'+inttostr(chartId_)+'.xml';
content_xml := excel_.WorkBook().GetXmlFileObj(class(TSXml).GetFileName('Content_Types'));
class(TSXml).AddOverrideContentType(content_xml, '/' + xlChartFileName_, 'application/vnd.openxmlformats-officedocument.drawingml.chart+xml');
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, chartData);
Begin
chartData_ := chartData;
excel_.Zip().Add(xlChartFileName_, GetDefaultXml());
xmlObj := excel_.Zip().Get(xlChartFileName_);
Apply(xmlObj);
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 := chartData.BegColOff ? chartData.BegColOff : 0;
o.XFrom.Row := row1 - 1;
o.XFrom.RowOff := chartData.BegRowOff ? chartData.BegRowOff : 0;
o.XTo.Col := col2;
o.XTo.ColOff := chartData.EndColOff ? chartData.EndColOff : 0;
o.XTo.Row := row2;
o.XTo.RowOff := chartData.EndRowOff ? chartData.EndRowOff : 0;
//o.GraphicFrame.macro := '';
o.GraphicFrame.GraphicFramePr.Name := chartData.Name ? chartData.Name : 'Chart' + inttostr(chartId_);
o.GraphicFrame.GraphicFramePr.Id := class(TSXml).GetcNvPrID(drawingXmlObj_);
o.GraphicFrame.GraphicFramePr.cNvGraphicFramePr := true;
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_);
o.GraphicFrame.Graphic.GraphicData.R := 'http://schemas.openxmlformats.org/officeDocument/2006/relationships';
o.GraphicFrame.Graphic.GraphicData.C := 'http://schemas.openxmlformats.org/drawingml/2006/chart';
o.ClientData.ObjectType := true;
node := drawingXmlObj_.FirstChild('xdr:wsDr').InsertEndChild(o.Marshal());
End;
private
[weakref]excel_;
drawingRID_:integer;
chartId_;
chartRid_;
xlChartFileName_;
drawingXmlObj_;
End;