From a99f0227b085d8f417f77864941650ef0e6273e4 Mon Sep 17 00:00:00 2001 From: Ri Xu Date: Tue, 17 Jan 2017 19:06:42 +0800 Subject: [PATCH] - New function `AddPicture()` added, support to add picture into excel cell; - go test updated; - fix typo and `gofmt -s` formatted --- LICENSE | 5 +- README.md | 22 ++++ excelize.go | 53 ++++---- excelize_test.go | 47 ++++++- picture.go | 286 ++++++++++++++++++++++++++++++++++++++++++ test/images/excel.bmp | Bin 0 -> 32824 bytes test/images/excel.gif | Bin 0 -> 4669 bytes test/images/excel.ico | Bin 0 -> 67646 bytes test/images/excel.jpg | Bin 0 -> 3883 bytes test/images/excel.png | Bin 0 -> 8792 bytes test/images/excel.tif | Bin 0 -> 31408 bytes xmlContentTypes.go | 2 - xmlDecodeDrawing.go | 21 ++++ xmlDrawing.go | 180 ++++++++++++++++++++++++++ xmlSharedStrings.go | 2 - 15 files changed, 581 insertions(+), 37 deletions(-) create mode 100644 picture.go create mode 100644 test/images/excel.bmp create mode 100644 test/images/excel.gif create mode 100644 test/images/excel.ico create mode 100644 test/images/excel.jpg create mode 100644 test/images/excel.png create mode 100644 test/images/excel.tif create mode 100644 xmlDecodeDrawing.go create mode 100644 xmlDrawing.go diff --git a/LICENSE b/LICENSE index 3ee1723..b765fe6 100644 --- a/LICENSE +++ b/LICENSE @@ -1,5 +1,6 @@ -Copyright (c) 2016, Ri Xu -All rights reserved. +BSD 3-Clause License + +Copyright (c) 2016 - 2017 Ri Xu All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: diff --git a/README.md b/README.md index 3d0d24c..1c77058 100644 --- a/README.md +++ b/README.md @@ -106,6 +106,28 @@ func main() { } ``` +### Add pictures to XLSX files + +```go +package main + +import ( + "fmt" + "os" + + "github.com/Luxurioust/excelize" +) + +func main() { + xlsx := excelize.CreateFile() + err := xlsx.AddPicture("Sheet1", "A2", "H9", "/tmp/image.jpg") + if err != nil { + fmt.Println(err) + os.Exit(1) + } +} +``` + ## Contributing Contributions are welcome! Open a pull request to fix a bug, or open an issue to discuss a new feature or change. diff --git a/excelize.go b/excelize.go index ca76c09..d7e08d5 100644 --- a/excelize.go +++ b/excelize.go @@ -34,7 +34,7 @@ func OpenFile(filename string) (*File, error) { }, nil } -// SetCellValue provide function to set int or string type value of a cell. +// SetCellValue provides function to set int or string type value of a cell. func (f *File) SetCellValue(sheet string, axis string, value interface{}) { switch t := value.(type) { case int: @@ -60,7 +60,7 @@ func (f *File) SetCellValue(sheet string, axis string, value interface{}) { } } -// SetCellInt provide function to set int type value of a cell. +// SetCellInt provides function to set int type value of a cell. func (f *File) SetCellInt(sheet string, axis string, value int) { axis = strings.ToUpper(axis) var xlsx xlsxWorksheet @@ -69,7 +69,7 @@ func (f *File) SetCellInt(sheet string, axis string, value int) { xAxis := row - 1 yAxis := titleToNumber(col) - name := `xl/worksheets/` + strings.ToLower(sheet) + `.xml` + name := "xl/worksheets/" + strings.ToLower(sheet) + ".xml" xml.Unmarshal([]byte(f.readXML(name)), &xlsx) rows := xAxis + 1 @@ -85,7 +85,7 @@ func (f *File) SetCellInt(sheet string, axis string, value int) { f.saveFileList(name, replaceWorkSheetsRelationshipsNameSpace(string(output))) } -// SetCellStr provide function to set string type value of a cell. +// SetCellStr provides function to set string type value of a cell. func (f *File) SetCellStr(sheet string, axis string, value string) { axis = strings.ToUpper(axis) var xlsx xlsxWorksheet @@ -94,7 +94,7 @@ func (f *File) SetCellStr(sheet string, axis string, value string) { xAxis := row - 1 yAxis := titleToNumber(col) - name := `xl/worksheets/` + strings.ToLower(sheet) + `.xml` + name := "xl/worksheets/" + strings.ToLower(sheet) + ".xml" xml.Unmarshal([]byte(f.readXML(name)), &xlsx) rows := xAxis + 1 @@ -103,36 +103,36 @@ func (f *File) SetCellStr(sheet string, axis string, value string) { xlsx = completeRow(xlsx, rows, cell) xlsx = completeCol(xlsx, rows, cell) - xlsx.SheetData.Row[xAxis].C[yAxis].T = `str` + xlsx.SheetData.Row[xAxis].C[yAxis].T = "str" xlsx.SheetData.Row[xAxis].C[yAxis].V = value output, _ := xml.Marshal(xlsx) f.saveFileList(name, replaceWorkSheetsRelationshipsNameSpace(string(output))) } -// SetCellDefault provides function to set string type value of a cell as default format without escaping the cell +// SetCellDefault provides function to set string type value of a cell as default format without escaping the cell. func (f *File) SetCellDefault(sheet string, axis string, value string) { - axis = strings.ToUpper(axis) - var xlsx xlsxWorksheet - col := string(strings.Map(letterOnlyMapF, axis)) - row, _ := strconv.Atoi(strings.Map(intOnlyMapF, axis)) - xAxis := row - 1 - yAxis := titleToNumber(col) + axis = strings.ToUpper(axis) + var xlsx xlsxWorksheet + col := string(strings.Map(letterOnlyMapF, axis)) + row, _ := strconv.Atoi(strings.Map(intOnlyMapF, axis)) + xAxis := row - 1 + yAxis := titleToNumber(col) - name := `xl/worksheets/` + strings.ToLower(sheet) + `.xml` - xml.Unmarshal([]byte(f.readXML(name)), &xlsx) + name := "xl/worksheets/" + strings.ToLower(sheet) + ".xml" + xml.Unmarshal([]byte(f.readXML(name)), &xlsx) - rows := xAxis + 1 - cell := yAxis + 1 + rows := xAxis + 1 + cell := yAxis + 1 - xlsx = completeRow(xlsx, rows, cell) - xlsx = completeCol(xlsx, rows, cell) + xlsx = completeRow(xlsx, rows, cell) + xlsx = completeCol(xlsx, rows, cell) - xlsx.SheetData.Row[xAxis].C[yAxis].T = "" - xlsx.SheetData.Row[xAxis].C[yAxis].V = value + xlsx.SheetData.Row[xAxis].C[yAxis].T = "" + xlsx.SheetData.Row[xAxis].C[yAxis].V = value - output, _ := xml.Marshal(xlsx) - f.saveFileList(name, replaceWorkSheetsRelationshipsNameSpace(string(output))) + output, _ := xml.Marshal(xlsx) + f.saveFileList(name, replaceWorkSheetsRelationshipsNameSpace(string(output))) } // Completion column element tags of XML in a sheet. @@ -288,16 +288,17 @@ func checkRow(xlsx xlsxWorksheet) xlsxWorksheet { // SUM(Sheet2!D2,Sheet2!D11) // // +// func (f *File) UpdateLinkedValue() { for i := 1; i <= f.SheetCount; i++ { var xlsx xlsxWorksheet - name := `xl/worksheets/sheet` + strconv.Itoa(i) + `.xml` + name := "xl/worksheets/sheet" + strconv.Itoa(i) + ".xml" xml.Unmarshal([]byte(f.readXML(name)), &xlsx) for indexR, row := range xlsx.SheetData.Row { for indexC, col := range row.C { if col.F != nil && col.V != `` { - xlsx.SheetData.Row[indexR].C[indexC].V = `` - xlsx.SheetData.Row[indexR].C[indexC].T = `` + xlsx.SheetData.Row[indexR].C[indexC].V = "" + xlsx.SheetData.Row[indexR].C[indexC].T = "" } } } diff --git a/excelize_test.go b/excelize_test.go index cd03cff..e1bd4c7 100644 --- a/excelize_test.go +++ b/excelize_test.go @@ -21,9 +21,9 @@ func TestExcelize(t *testing.T) { } t.Log("\r\n") } - f1.UpdateLinkedValue() - f1.SetCellDefault("SHEET2", "A1", strconv.FormatFloat(float64(100.1588), 'f', -1, 32)) - f1.SetCellDefault("SHEET2", "A1", strconv.FormatFloat(float64(-100.1588), 'f', -1, 64)) + f1.UpdateLinkedValue() + f1.SetCellDefault("SHEET2", "A1", strconv.FormatFloat(float64(100.1588), 'f', -1, 32)) + f1.SetCellDefault("SHEET2", "A1", strconv.FormatFloat(float64(-100.1588), 'f', -1, 64)) f1.SetCellInt("SHEET2", "A1", 100) f1.SetCellStr("SHEET2", "C11", "Knowns") f1.NewSheet(3, "Maximum 31 characters allowed in sheet title.") @@ -49,8 +49,8 @@ func TestExcelize(t *testing.T) { f1.SetCellValue("Sheet2", "F2", int16(42)) f1.SetCellValue("Sheet2", "F2", int32(42)) f1.SetCellValue("Sheet2", "F2", int64(42)) - f1.SetCellValue("Sheet2", "F2", float32(42.65418)) - f1.SetCellValue("Sheet2", "F2", float64(-42.65418)) + f1.SetCellValue("Sheet2", "F2", float32(42.65418)) + f1.SetCellValue("Sheet2", "F2", float64(-42.65418)) f1.SetCellValue("Sheet2", "F2", float32(42)) f1.SetCellValue("Sheet2", "F2", float64(42)) f1.SetCellValue("Sheet2", "G2", nil) @@ -72,6 +72,34 @@ func TestExcelize(t *testing.T) { if err != nil { t.Log(err) } + // Test add picture to sheet. + err = f1.AddPicture("Sheet2", "I1", "L10", "./test/images/excel.jpg") + if err != nil { + t.Log(err) + } + err = f1.AddPicture("Sheet1", "F21", "G25", "./test/images/excel.png") + if err != nil { + t.Log(err) + } + err = f1.AddPicture("Sheet2", "L1", "O10", "./test/images/excel.bmp") + if err != nil { + t.Log(err) + } + err = f1.AddPicture("Sheet1", "G21", "H25", "./test/images/excel.ico") + if err != nil { + t.Log(err) + } + // Test add picture to sheet with unsupport file type. + err = f1.AddPicture("Sheet1", "G21", "H25", "./test/images/excel.icon") + if err != nil { + t.Log(err) + } + // Test add picture to sheet with invalid file path. + err = f1.AddPicture("Sheet1", "G21", "H25", "./test/Workbook1.xlsx") + if err != nil { + t.Log(err) + } + // Test write file to given path. err = f1.WriteTo("./test/Workbook_2.xlsx") if err != nil { @@ -102,6 +130,15 @@ func TestExcelize(t *testing.T) { f3.SetCellInt("Sheet2", "A23", 56) f3.SetCellStr("SHEET1", "B20", "42") f3.SetActiveSheet(0) + // Test add picture to sheet. + err = f3.AddPicture("Sheet1", "H2", "K12", "./test/images/excel.gif") + if err != nil { + t.Log(err) + } + err = f3.AddPicture("Sheet1", "C2", "F12", "./test/images/excel.tif") + if err != nil { + t.Log(err) + } err = f3.WriteTo("./test/Workbook_3.xlsx") if err != nil { t.Log(err) diff --git a/picture.go b/picture.go new file mode 100644 index 0000000..62054fc --- /dev/null +++ b/picture.go @@ -0,0 +1,286 @@ +package excelize + +import ( + "bytes" + "encoding/xml" + "errors" + "fmt" + "io/ioutil" + "os" + "path" + "path/filepath" + "strconv" + "strings" +) + +// AddPicture provide the method to add picture in a sheet by given xAxis, yAxis and file path. +// For example: +// +// xlsx := excelize.CreateFile() +// err := xlsx.AddPicture("Sheet1", "A2", "H9", "./image.jpg") +// if err != nil { +// fmt.Println(err) +// os.Exit(1) +// } +// +func (f *File) AddPicture(sheet string, xAxis string, yAxis string, picture string) error { + var supportTypes = map[string]string{".bmp": ".jpeg", ".gif": ".gif", ".ico": ".png", ".tif": ".tiff", ".tiff": ".tiff", ".jpg": ".jpeg", ".jpeg": ".jpeg", ".png": ".png"} + var err error + // Check picture exists first. + if _, err = os.Stat(picture); os.IsNotExist(err) { + return err + } + ext, ok := supportTypes[path.Ext(picture)] + if !ok { + return errors.New("Unsupported image extension") + } + _, file := filepath.Split(picture) + // Read sheet data. + var xlsx xlsxWorksheet + name := "xl/worksheets/" + strings.ToLower(sheet) + ".xml" + xml.Unmarshal([]byte(f.readXML(name)), &xlsx) + // Add first picture for given sheet, create xl/drawings/ and xl/drawings/_rels/ folder. + drawingID := f.countDrawings() + 1 + pictureID := f.countMedia() + 1 + drawingXML := "xl/drawings/drawing" + strconv.Itoa(drawingID) + ".xml" + sheetRelationshipsDrawingXML := "../drawings/drawing" + strconv.Itoa(drawingID) + ".xml" + + var drawingRID int + 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. + rID := f.addSheetRelationships(sheet, SourceRelationshipDrawingML, sheetRelationshipsDrawingXML) + f.addSheetDrawing(sheet, rID) + } + drawingRID = f.addDrawingRelationships(drawingID, SourceRelationshipImage, "../media/image"+strconv.Itoa(pictureID)+ext) + f.addDrawing(drawingXML, xAxis, yAxis, file, drawingRID) + f.addMedia(picture, ext) + f.addDrawingContentTypePart(drawingID) + return err +} + +// addSheetRelationships provides function to add xl/worksheets/_rels/sheet%d.xml.rels by given +// sheet name, relationship type and target. +func (f *File) addSheetRelationships(sheet string, relType string, target string) int { + var rels = "xl/worksheets/_rels/" + strings.ToLower(sheet) + ".xml.rels" + var sheetRels xlsxWorkbookRels + var rID = 1 + var ID bytes.Buffer + ID.WriteString("rId") + ID.WriteString(strconv.Itoa(rID)) + _, ok := f.XLSX[rels] + if ok { + ID.Reset() + xml.Unmarshal([]byte(f.readXML(rels)), &sheetRels) + rID = len(sheetRels.Relationships) + 1 + ID.WriteString("rId") + ID.WriteString(strconv.Itoa(rID)) + } + sheetRels.Relationships = append(sheetRels.Relationships, xlsxWorkbookRelation{ + ID: ID.String(), + Type: relType, + Target: target, + }) + output, err := xml.Marshal(sheetRels) + if err != nil { + fmt.Println(err) + } + f.saveFileList(rels, string(output)) + return rID +} + +// addSheetDrawing provides function to add drawing element to xl/worksheets/sheet%d.xml by +// given sheet name and relationship index. +func (f *File) addSheetDrawing(sheet string, rID int) { + var xlsx xlsxWorksheet + name := "xl/worksheets/" + strings.ToLower(sheet) + ".xml" + xml.Unmarshal([]byte(f.readXML(name)), &xlsx) + xlsx.Drawing = &xlsxDrawing{ + RID: "rId" + strconv.Itoa(rID), + } + output, err := xml.Marshal(xlsx) + if err != nil { + fmt.Println(err) + } + f.saveFileList(name, string(output)) +} + +// countDrawings provides function to get drawing files count storage in the folder xl/drawings. +func (f *File) countDrawings() int { + count := 0 + for k := range f.XLSX { + if strings.Contains(k, "xl/drawings/drawing") { + count++ + } + } + return count +} + +// addDrawing provides function to add picture by given drawingXML, xAxis, yAxis, file name +// and relationship index. In order to solve the problem that the label structure is changed +// after serialization and deserialization, two different structures: decodeWsDr and encodeWsDr +// are defined. +func (f *File) addDrawing(drawingXML string, xAxis string, yAxis string, file string, rID int) { + xAxis = strings.ToUpper(xAxis) + fromCol := string(strings.Map(letterOnlyMapF, xAxis)) + fromRow, _ := strconv.Atoi(strings.Map(intOnlyMapF, xAxis)) + fromXAxis := fromRow - 1 + fromYAxis := titleToNumber(fromCol) + yAxis = strings.ToUpper(yAxis) + ToCol := string(strings.Map(letterOnlyMapF, yAxis)) + ToRow, _ := strconv.Atoi(strings.Map(intOnlyMapF, yAxis)) + ToXAxis := ToRow - 1 + ToYAxis := titleToNumber(ToCol) + content := encodeWsDr{} + content.WsDr.A = NameSpaceDrawingML + content.WsDr.Xdr = NameSpaceSpreadSheetDrawing + cNvPrID := 1 + _, ok := f.XLSX[drawingXML] + if ok { // Append Model + decodeWsDr := decodeWsDr{} + xml.Unmarshal([]byte(f.readXML(drawingXML)), &decodeWsDr) + cNvPrID = len(decodeWsDr.TwoCellAnchor) + 1 + for _, v := range decodeWsDr.TwoCellAnchor { + content.WsDr.TwoCellAnchor = append(content.WsDr.TwoCellAnchor, &xlsxTwoCellAnchor{ + EditAs: v.EditAs, + GraphicFrame: v.Content, + }) + } + } + twoCellAnchor := xlsxTwoCellAnchor{} + twoCellAnchor.EditAs = "oneCell" + from := xlsxFrom{} + from.Col = fromYAxis + from.Row = fromXAxis + to := xlsxTo{} + to.Col = ToYAxis + to.Row = ToXAxis + twoCellAnchor.From = &from + twoCellAnchor.To = &to + pic := xlsxPic{} + pic.NvPicPr.CNvPicPr.PicLocks.NoChangeAspect = false + pic.NvPicPr.CNvPr.ID = cNvPrID + pic.NvPicPr.CNvPr.Descr = file + pic.NvPicPr.CNvPr.Name = "Picture " + strconv.Itoa(cNvPrID) + pic.BlipFill.Blip.R = SourceRelationship + pic.BlipFill.Blip.Embed = "rId" + strconv.Itoa(rID) + pic.SpPr.PrstGeom.Prst = "rect" + + twoCellAnchor.Pic = &pic + twoCellAnchor.ClientData = &xlsxClientData{ + FLocksWithSheet: false, + FPrintsWithSheet: false, + } + content.WsDr.TwoCellAnchor = append(content.WsDr.TwoCellAnchor, &twoCellAnchor) + output, err := xml.Marshal(content) + if err != nil { + fmt.Println(err) + } + // Create replacer with pairs as arguments and replace all pairs. + r := strings.NewReplacer("", "", "", "") + result := r.Replace(string(output)) + f.saveFileList(drawingXML, result) +} + +// addDrawingRelationships provides function to add image part relationships in the file +// xl/drawings/_rels/drawing%d.xml.rels by given drawing index, relationship type and target. +func (f *File) addDrawingRelationships(index int, relType string, target string) int { + var rels = "xl/drawings/_rels/drawing" + strconv.Itoa(index) + ".xml.rels" + var drawingRels xlsxWorkbookRels + var rID = 1 + var ID bytes.Buffer + ID.WriteString("rId") + ID.WriteString(strconv.Itoa(rID)) + _, ok := f.XLSX[rels] + if ok { + ID.Reset() + xml.Unmarshal([]byte(f.readXML(rels)), &drawingRels) + rID = len(drawingRels.Relationships) + 1 + ID.WriteString("rId") + ID.WriteString(strconv.Itoa(rID)) + } + drawingRels.Relationships = append(drawingRels.Relationships, xlsxWorkbookRelation{ + ID: ID.String(), + Type: relType, + Target: target, + }) + output, err := xml.Marshal(drawingRels) + if err != nil { + fmt.Println(err) + } + f.saveFileList(rels, string(output)) + return rID +} + +// countMedia provides function to get media files count storage in the folder xl/media/image. +func (f *File) countMedia() int { + count := 0 + for k := range f.XLSX { + if strings.Contains(k, "xl/media/image") { + count++ + } + } + return count +} + +// addMedia provides function to add picture into folder xl/media/image by given file +// name and extension name. +func (f *File) addMedia(file string, ext string) { + count := f.countMedia() + dat, _ := ioutil.ReadFile(file) + media := "xl/media/image" + strconv.Itoa(count+1) + ext + f.XLSX[media] = string(dat) +} + +// addDrawingContentTypePart provides function to add image part relationships in +// http://purl.oclc.org/ooxml/officeDocument/relationships/image and appropriate content type. +func (f *File) addDrawingContentTypePart(index int) { + var imageTypes = map[string]bool{"jpeg": false, "png": false, "gif": false, "tiff": false} + var content xlsxTypes + xml.Unmarshal([]byte(f.readXML(`[Content_Types].xml`)), &content) + for _, v := range content.Defaults { + _, ok := imageTypes[v.Extension] + if ok { + imageTypes[v.Extension] = true + } + } + for k, v := range imageTypes { + if !v { + content.Defaults = append(content.Defaults, xlsxDefault{ + Extension: k, + ContentType: "image/" + k, + }) + } + } + for _, v := range content.Overrides { + if v.PartName == "/xl/drawings/drawing"+strconv.Itoa(index)+".xml" { + output, _ := xml.Marshal(content) + f.saveFileList(`[Content_Types].xml`, string(output)) + return + } + } + content.Overrides = append(content.Overrides, xlsxOverride{ + PartName: "/xl/drawings/drawing" + strconv.Itoa(index) + ".xml", + ContentType: "application/vnd.openxmlformats-officedocument.drawing+xml", + }) + output, _ := xml.Marshal(content) + f.saveFileList(`[Content_Types].xml`, string(output)) +} + +// getSheetRelationshipsTargetByID provides function to get Target attribute value +// in xl/worksheets/_rels/sheet%d.xml.rels by given sheet name and relationship index. +func (f *File) getSheetRelationshipsTargetByID(sheet string, rID string) string { + var rels = "xl/worksheets/_rels/" + strings.ToLower(sheet) + ".xml.rels" + var sheetRels xlsxWorkbookRels + xml.Unmarshal([]byte(f.readXML(rels)), &sheetRels) + for _, v := range sheetRels.Relationships { + if v.ID == rID { + return v.Target + } + } + return "" +} diff --git a/test/images/excel.bmp b/test/images/excel.bmp new file mode 100644 index 0000000000000000000000000000000000000000..424619c5c0959c1dd5c9def7f9f1e8eba2dda748 GIT binary patch literal 32824 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
$&v^G;&>v*@l@K3PYd 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 QVbGpvvC;A4y3E}F0ypiKV*mgE literal 0 HcmV?d00001 diff --git a/test/images/excel.jpg b/test/images/excel.jpg new file mode 100644 index 0000000000000000000000000000000000000000..67c84f3589ca3d706d6a3362c89b70539f1812a1 GIT binary patch literal 3883 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 z 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 ifG7