summaryrefslogtreecommitdiff
path: root/drawing.go
diff options
context:
space:
mode:
authorxuri <xuri.me@gmail.com>2020-03-28 23:47:26 +0800
committerxuri <xuri.me@gmail.com>2020-03-28 23:47:26 +0800
commit6afc468a025984aa1b265b0228f032c5ed881a3b (patch)
tree6b51e97cbf9c5fc151bb14766c720731ec3bc2ad /drawing.go
parenta75c6f63bea6c8e438482cb79e1725f23d7f7f9c (diff)
Resolve #451, support create chart sheet
Diffstat (limited to 'drawing.go')
-rw-r--r--drawing.go63
1 files changed, 63 insertions, 0 deletions
diff --git a/drawing.go b/drawing.go
index e51b6af..8ca1f49 100644
--- a/drawing.go
+++ b/drawing.go
@@ -38,6 +38,26 @@ func (f *File) prepareDrawing(xlsx *xlsxWorksheet, drawingID int, sheet, drawing
return drawingID, drawingXML
}
+// prepareChartSheetDrawing provides a function to prepare drawing ID and XML
+// by given drawingID, worksheet name and default drawingXML.
+func (f *File) prepareChartSheetDrawing(xlsx *xlsxChartsheet, drawingID int, sheet, drawingXML string) (int, string) {
+ sheetRelationshipsDrawingXML := "../drawings/drawing" + strconv.Itoa(drawingID) + ".xml"
+ if xlsx.Drawing != nil {
+ // The worksheet already has a picture or chart relationships, use the relationships drawing ../drawings/drawing%d.xml.
+ sheetRelationshipsDrawingXML = f.getSheetRelationshipsTargetByID(sheet, xlsx.Drawing.RID)
+ drawingID, _ = strconv.Atoi(strings.TrimSuffix(strings.TrimPrefix(sheetRelationshipsDrawingXML, "../drawings/drawing"), ".xml"))
+ drawingXML = strings.Replace(sheetRelationshipsDrawingXML, "..", "xl", -1)
+ } else {
+ // Add first picture for given sheet.
+ sheetRels := "xl/chartsheets/_rels/" + strings.TrimPrefix(f.sheetMap[trimSheetName(sheet)], "xl/chartsheets/") + ".rels"
+ rID := f.addRels(sheetRels, SourceRelationshipDrawingML, sheetRelationshipsDrawingXML, "")
+ xlsx.Drawing = &xlsxDrawing{
+ RID: "rId" + strconv.Itoa(rID),
+ }
+ }
+ return drawingID, drawingXML
+}
+
// addChart provides a function to create chart as xl/charts/chart%d.xml by
// given format sets.
func (f *File) addChart(formatSet *formatChart, comboCharts []*formatChart) {
@@ -1209,6 +1229,49 @@ func (f *File) addDrawingChart(sheet, drawingXML, cell string, width, height, rI
return err
}
+// addSheetDrawingChart provides a function to add chart graphic frame for
+// chartsheet by given sheet, drawingXML, width, height, relationship index
+// and format sets.
+func (f *File) addSheetDrawingChart(sheet, drawingXML string, width, height, rID int, formatSet *formatPicture) (err error) {
+ width = int(float64(width) * formatSet.XScale)
+ height = int(float64(height) * formatSet.YScale)
+
+ content, cNvPrID := f.drawingParser(drawingXML)
+ absoluteAnchor := xdrCellAnchor{
+ EditAs: formatSet.Positioning,
+ Pos: &xlsxPoint2D{},
+ Ext: &xlsxExt{},
+ }
+
+ graphicFrame := xlsxGraphicFrame{
+ NvGraphicFramePr: xlsxNvGraphicFramePr{
+ CNvPr: &xlsxCNvPr{
+ ID: cNvPrID,
+ Name: "Chart " + strconv.Itoa(cNvPrID),
+ },
+ },
+ Graphic: &xlsxGraphic{
+ GraphicData: &xlsxGraphicData{
+ URI: NameSpaceDrawingMLChart,
+ Chart: &xlsxChart{
+ C: NameSpaceDrawingMLChart,
+ R: SourceRelationship,
+ RID: "rId" + strconv.Itoa(rID),
+ },
+ },
+ },
+ }
+ graphic, _ := xml.Marshal(graphicFrame)
+ absoluteAnchor.GraphicFrame = string(graphic)
+ absoluteAnchor.ClientData = &xdrClientData{
+ FLocksWithSheet: formatSet.FLocksWithSheet,
+ FPrintsWithSheet: formatSet.FPrintsWithSheet,
+ }
+ content.AbsoluteAnchor = append(content.AbsoluteAnchor, &absoluteAnchor)
+ f.Drawings[drawingXML] = content
+ return err
+}
+
// deleteDrawing provides a function to delete chart graphic frame by given by
// given coordinates and graphic type.
func (f *File) deleteDrawing(col, row int, drawingXML, drawingType string) (err error) {