Skip to content

Commit 3f89c6e

Browse files
committed
remove ineffectual variable assignments and simplify code
1 parent 6afc468 commit 3f89c6e

File tree

8 files changed

+75
-71
lines changed

8 files changed

+75
-71
lines changed

LICENSE

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
BSD 3-Clause License
22

3-
Copyright (c) 2016-2020, 360 Enterprise Security Group, Endpoint Security, Inc.
3+
Copyright (c) 2016-2020 The excelize Authors.
44
All rights reserved.
55

66
Redistribution and use in source and binary forms, with or without

chart.go

+33-39
Original file line numberDiff line numberDiff line change
@@ -730,28 +730,14 @@ func parseFormatChartSet(formatSet string) (*formatChart, error) {
730730
// }
731731
//
732732
func (f *File) AddChart(sheet, cell, format string, combo ...string) error {
733-
formatSet, err := parseFormatChartSet(format)
734-
if err != nil {
735-
return err
736-
}
737-
comboCharts := []*formatChart{}
738-
for _, comboFormat := range combo {
739-
comboChart, err := parseFormatChartSet(comboFormat)
740-
if err != nil {
741-
return err
742-
}
743-
if _, ok := chartValAxNumFmtFormatCode[comboChart.Type]; !ok {
744-
return errors.New("unsupported chart type " + comboChart.Type)
745-
}
746-
comboCharts = append(comboCharts, comboChart)
747-
}
748733
// Read sheet data.
749734
xlsx, err := f.workSheetReader(sheet)
750735
if err != nil {
751736
return err
752737
}
753-
if _, ok := chartValAxNumFmtFormatCode[formatSet.Type]; !ok {
754-
return errors.New("unsupported chart type " + formatSet.Type)
738+
formatSet, comboCharts, err := f.getFormatChart(format, combo)
739+
if err != nil {
740+
return err
755741
}
756742
// Add first picture for given sheet, create xl/drawings/ and xl/drawings/_rels/ folder.
757743
drawingID := f.countDrawings() + 1
@@ -777,31 +763,18 @@ func (f *File) AddChart(sheet, cell, format string, combo ...string) error {
777763
func (f *File) AddChartSheet(sheet, format string, combo ...string) error {
778764
// Check if the worksheet already exists
779765
if f.GetSheetIndex(sheet) != 0 {
780-
return errors.New("already existing name worksheet")
766+
return errors.New("the same name worksheet already exists")
781767
}
782-
formatSet, err := parseFormatChartSet(format)
768+
formatSet, comboCharts, err := f.getFormatChart(format, combo)
783769
if err != nil {
784770
return err
785771
}
786-
comboCharts := []*formatChart{}
787-
for _, comboFormat := range combo {
788-
comboChart, err := parseFormatChartSet(comboFormat)
789-
if err != nil {
790-
return err
791-
}
792-
if _, ok := chartValAxNumFmtFormatCode[comboChart.Type]; !ok {
793-
return errors.New("unsupported chart type " + comboChart.Type)
794-
}
795-
comboCharts = append(comboCharts, comboChart)
796-
}
797-
if _, ok := chartValAxNumFmtFormatCode[formatSet.Type]; !ok {
798-
return errors.New("unsupported chart type " + formatSet.Type)
799-
}
800772
cs := xlsxChartsheet{
801773
SheetViews: []*xlsxChartsheetViews{{
802774
SheetView: []*xlsxChartsheetView{{ZoomScaleAttr: 100, ZoomToFitAttr: true}}},
803775
},
804776
}
777+
f.SheetCount++
805778
wb := f.workbookReader()
806779
sheetID := 0
807780
for _, v := range wb.Sheets.Sheet {
@@ -819,10 +792,7 @@ func (f *File) AddChartSheet(sheet, format string, combo ...string) error {
819792
drawingID, drawingXML = f.prepareChartSheetDrawing(&cs, drawingID, sheet, drawingXML)
820793
drawingRels := "xl/drawings/_rels/drawing" + strconv.Itoa(drawingID) + ".xml.rels"
821794
drawingRID := f.addRels(drawingRels, SourceRelationshipChart, "../charts/chart"+strconv.Itoa(chartID)+".xml", "")
822-
err = f.addSheetDrawingChart(sheet, drawingXML, formatSet.Dimension.Width, formatSet.Dimension.Height, drawingRID, &formatSet.Format)
823-
if err != nil {
824-
return err
825-
}
795+
f.addSheetDrawingChart(drawingXML, drawingRID, &formatSet.Format)
826796
f.addChart(formatSet, comboCharts)
827797
f.addContentTypePart(chartID, "chart")
828798
f.addContentTypePart(sheetID, "chartsheet")
@@ -831,11 +801,35 @@ func (f *File) AddChartSheet(sheet, format string, combo ...string) error {
831801
rID := f.addRels("xl/_rels/workbook.xml.rels", SourceRelationshipChartsheet, fmt.Sprintf("chartsheets/sheet%d.xml", sheetID), "")
832802
// Update xl/workbook.xml
833803
f.setWorkbook(sheet, sheetID, rID)
834-
v, _ := xml.Marshal(cs)
835-
f.saveFileList(path, replaceRelationshipsBytes(replaceWorkSheetsRelationshipsNameSpaceBytes(v)))
804+
chartsheet, _ := xml.Marshal(cs)
805+
f.saveFileList(path, replaceRelationshipsBytes(replaceRelationshipsNameSpaceBytes(chartsheet)))
836806
return err
837807
}
838808

809+
// getFormatChart provides a function to check format set of the chart and
810+
// create chart format.
811+
func (f *File) getFormatChart(format string, combo []string) (*formatChart, []*formatChart, error) {
812+
comboCharts := []*formatChart{}
813+
formatSet, err := parseFormatChartSet(format)
814+
if err != nil {
815+
return formatSet, comboCharts, err
816+
}
817+
for _, comboFormat := range combo {
818+
comboChart, err := parseFormatChartSet(comboFormat)
819+
if err != nil {
820+
return formatSet, comboCharts, err
821+
}
822+
if _, ok := chartValAxNumFmtFormatCode[comboChart.Type]; !ok {
823+
return formatSet, comboCharts, errors.New("unsupported chart type " + comboChart.Type)
824+
}
825+
comboCharts = append(comboCharts, comboChart)
826+
}
827+
if _, ok := chartValAxNumFmtFormatCode[formatSet.Type]; !ok {
828+
return formatSet, comboCharts, errors.New("unsupported chart type " + formatSet.Type)
829+
}
830+
return formatSet, comboCharts, err
831+
}
832+
839833
// DeleteChart provides a function to delete chart in XLSX by given worksheet
840834
// and cell name.
841835
func (f *File) DeleteChart(sheet, cell string) (err error) {

chart_test.go

+16-2
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,8 @@ func TestAddChart(t *testing.T) {
198198
assert.NoError(t, f.AddChart("Combo Charts", axis, fmt.Sprintf(`{"type":"areaStacked","series":[{"name":"Sheet1!$A$30","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$30:$D$30"},{"name":"Sheet1!$A$31","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$31:$D$31"},{"name":"Sheet1!$A$32","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$32:$D$32"},{"name":"Sheet1!$A$33","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$33:$D$33"}],"format":{"x_scale":1.0,"y_scale":1.0,"x_offset":15,"y_offset":10,"print_obj":true,"lock_aspect_ratio":false,"locked":false},"legend":{"position":"left","show_legend_key":false},"title":{"name":"%s"},"plotarea":{"show_bubble_size":true,"show_cat_name":false,"show_leader_lines":false,"show_percent":true,"show_series_name":true,"show_val":true}}`, props[1]), fmt.Sprintf(`{"type":"%s","series":[{"name":"Sheet1!$A$34","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$34:$D$34"},{"name":"Sheet1!$A$35","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$35:$D$35"},{"name":"Sheet1!$A$36","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$36:$D$36"},{"name":"Sheet1!$A$37","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$37:$D$37"}],"format":{"x_scale":1.0,"y_scale":1.0,"x_offset":15,"y_offset":10,"print_obj":true,"lock_aspect_ratio":false,"locked":false},"legend":{"position":"left","show_legend_key":false},"plotarea":{"show_bubble_size":true,"show_cat_name":false,"show_leader_lines":false,"show_percent":true,"show_series_name":true,"show_val":true}}`, props[0])))
199199
}
200200
assert.NoError(t, f.SaveAs(filepath.Join("test", "TestAddChart.xlsx")))
201+
// Test with illegal cell coordinates
202+
assert.EqualError(t, f.AddChart("Sheet2", "A", `{"type":"col","series":[{"name":"Sheet1!$A$30","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$30:$D$30"},{"name":"Sheet1!$A$31","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$31:$D$31"},{"name":"Sheet1!$A$32","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$32:$D$32"},{"name":"Sheet1!$A$33","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$33:$D$33"},{"name":"Sheet1!$A$34","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$34:$D$34"},{"name":"Sheet1!$A$35","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$35:$D$35"},{"name":"Sheet1!$A$36","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$36:$D$36"},{"name":"Sheet1!$A$37","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$37:$D$37"}],"format":{"x_scale":1.0,"y_scale":1.0,"x_offset":15,"y_offset":10,"print_obj":true,"lock_aspect_ratio":false,"locked":false},"legend":{"position":"left","show_legend_key":false},"title":{"name":"2D Column Chart"},"plotarea":{"show_bubble_size":true,"show_cat_name":false,"show_leader_lines":false,"show_percent":true,"show_series_name":true,"show_val":true},"show_blanks_as":"zero"}`), `cannot convert cell "A" to coordinates: invalid cell name "A"`)
201203
// Test with unsupported chart type
202204
assert.EqualError(t, f.AddChart("Sheet2", "BD32", `{"type":"unknown","series":[{"name":"Sheet1!$A$30","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$30:$D$30"},{"name":"Sheet1!$A$31","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$31:$D$31"},{"name":"Sheet1!$A$32","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$32:$D$32"},{"name":"Sheet1!$A$33","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$33:$D$33"},{"name":"Sheet1!$A$34","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$34:$D$34"},{"name":"Sheet1!$A$35","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$35:$D$35"},{"name":"Sheet1!$A$36","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$36:$D$36"},{"name":"Sheet1!$A$37","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$37:$D$37"}],"format":{"x_scale":1.0,"y_scale":1.0,"x_offset":15,"y_offset":10,"print_obj":true,"lock_aspect_ratio":false,"locked":false},"legend":{"position":"left","show_legend_key":false},"title":{"name":"Bubble 3D Chart"},"plotarea":{"show_bubble_size":true,"show_cat_name":false,"show_leader_lines":false,"show_percent":true,"show_series_name":true,"show_val":true},"show_blanks_as":"zero"}`), "unsupported chart type unknown")
203205
// Test add combo chart with invalid format set
@@ -217,8 +219,20 @@ func TestAddChartSheet(t *testing.T) {
217219
assert.NoError(t, f.SetCellValue("Sheet1", k, v))
218220
}
219221
assert.NoError(t, f.AddChartSheet("Chart1", `{"type":"col3DClustered","series":[{"name":"Sheet1!$A$2","categories":"Sheet1!$B$1:$D$1","values":"Sheet1!$B$2:$D$2"},{"name":"Sheet1!$A$3","categories":"Sheet1!$B$1:$D$1","values":"Sheet1!$B$3:$D$3"},{"name":"Sheet1!$A$4","categories":"Sheet1!$B$1:$D$1","values":"Sheet1!$B$4:$D$4"}],"title":{"name":"Fruit 3D Clustered Column Chart"}}`))
220-
221-
assert.EqualError(t, f.AddChartSheet("Sheet1", `{"type":"col3DClustered","series":[{"name":"Sheet1!$A$2","categories":"Sheet1!$B$1:$D$1","values":"Sheet1!$B$2:$D$2"},{"name":"Sheet1!$A$3","categories":"Sheet1!$B$1:$D$1","values":"Sheet1!$B$3:$D$3"},{"name":"Sheet1!$A$4","categories":"Sheet1!$B$1:$D$1","values":"Sheet1!$B$4:$D$4"}],"title":{"name":"Fruit 3D Clustered Column Chart"}}`), "already existing name worksheet")
222+
// Test set the chartsheet as active sheet
223+
var sheetID int
224+
for idx, sheetName := range f.GetSheetMap() {
225+
if sheetName != "Chart1" {
226+
continue
227+
}
228+
sheetID = idx
229+
}
230+
f.SetActiveSheet(sheetID)
231+
232+
// Test cell value on chartsheet
233+
assert.EqualError(t, f.SetCellValue("Chart1", "A1", true), "sheet Chart1 is chart sheet")
234+
// Test add chartsheet on already existing name sheet
235+
assert.EqualError(t, f.AddChartSheet("Sheet1", `{"type":"col3DClustered","series":[{"name":"Sheet1!$A$2","categories":"Sheet1!$B$1:$D$1","values":"Sheet1!$B$2:$D$2"},{"name":"Sheet1!$A$3","categories":"Sheet1!$B$1:$D$1","values":"Sheet1!$B$3:$D$3"},{"name":"Sheet1!$A$4","categories":"Sheet1!$B$1:$D$1","values":"Sheet1!$B$4:$D$4"}],"title":{"name":"Fruit 3D Clustered Column Chart"}}`), "the same name worksheet already exists")
222236
// Test with unsupported chart type
223237
assert.EqualError(t, f.AddChartSheet("Chart2", `{"type":"unknown","series":[{"name":"Sheet1!$A$2","categories":"Sheet1!$B$1:$D$1","values":"Sheet1!$B$2:$D$2"},{"name":"Sheet1!$A$3","categories":"Sheet1!$B$1:$D$1","values":"Sheet1!$B$3:$D$3"},{"name":"Sheet1!$A$4","categories":"Sheet1!$B$1:$D$1","values":"Sheet1!$B$4:$D$4"}],"title":{"name":"Fruit 3D Clustered Column Chart"}}`), "unsupported chart type unknown")
224238

drawing.go

+2-5
Original file line numberDiff line numberDiff line change
@@ -1232,10 +1232,7 @@ func (f *File) addDrawingChart(sheet, drawingXML, cell string, width, height, rI
12321232
// addSheetDrawingChart provides a function to add chart graphic frame for
12331233
// chartsheet by given sheet, drawingXML, width, height, relationship index
12341234
// and format sets.
1235-
func (f *File) addSheetDrawingChart(sheet, drawingXML string, width, height, rID int, formatSet *formatPicture) (err error) {
1236-
width = int(float64(width) * formatSet.XScale)
1237-
height = int(float64(height) * formatSet.YScale)
1238-
1235+
func (f *File) addSheetDrawingChart(drawingXML string, rID int, formatSet *formatPicture) {
12391236
content, cNvPrID := f.drawingParser(drawingXML)
12401237
absoluteAnchor := xdrCellAnchor{
12411238
EditAs: formatSet.Positioning,
@@ -1269,7 +1266,7 @@ func (f *File) addSheetDrawingChart(sheet, drawingXML string, width, height, rID
12691266
}
12701267
content.AbsoluteAnchor = append(content.AbsoluteAnchor, &absoluteAnchor)
12711268
f.Drawings[drawingXML] = content
1272-
return err
1269+
return
12731270
}
12741271

12751272
// deleteDrawing provides a function to delete chart graphic frame by given by

excelize.go

+6-2
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,10 @@ func (f *File) workSheetReader(sheet string) (xlsx *xlsxWorksheet, err error) {
156156
return
157157
}
158158
if xlsx = f.Sheet[name]; f.Sheet[name] == nil {
159+
if strings.HasPrefix(name, "xl/chartsheets") {
160+
err = fmt.Errorf("sheet %s is chart sheet", sheet)
161+
return
162+
}
159163
xlsx = new(xlsxWorksheet)
160164
if err = f.xmlNewDecoder(bytes.NewReader(namespaceStrictToTransitional(f.readXML(name)))).
161165
Decode(xlsx); err != nil && err != io.EOF {
@@ -227,9 +231,9 @@ func (f *File) addRels(relPath, relType, target, targetMode string) int {
227231
return rID
228232
}
229233

230-
// replaceWorkSheetsRelationshipsNameSpaceBytes provides a function to replace
234+
// replaceRelationshipsNameSpaceBytes provides a function to replace
231235
// XML tags to self-closing for compatible Microsoft Office Excel 2007.
232-
func replaceWorkSheetsRelationshipsNameSpaceBytes(contentMarshal []byte) []byte {
236+
func replaceRelationshipsNameSpaceBytes(contentMarshal []byte) []byte {
233237
var oldXmlns = []byte(` xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">`)
234238
var newXmlns = []byte(templateNamespaceIDMap)
235239
contentMarshal = bytes.Replace(contentMarshal, oldXmlns, newXmlns, -1)

rows.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ func (f *File) Rows(sheet string) (*Rows, error) {
174174
if f.Sheet[name] != nil {
175175
// flush data
176176
output, _ := xml.Marshal(f.Sheet[name])
177-
f.saveFileList(name, replaceWorkSheetsRelationshipsNameSpaceBytes(output))
177+
f.saveFileList(name, replaceRelationshipsNameSpaceBytes(output))
178178
}
179179
var (
180180
err error

sheet.go

+15-20
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ func (f *File) workSheetWriter() {
119119
f.Sheet[p].SheetData.Row[k].C = trimCell(v.C)
120120
}
121121
output, _ := xml.Marshal(sheet)
122-
f.saveFileList(p, replaceRelationshipsBytes(replaceWorkSheetsRelationshipsNameSpaceBytes(output)))
122+
f.saveFileList(p, replaceRelationshipsBytes(replaceRelationshipsNameSpaceBytes(output)))
123123
ok := f.checked[p]
124124
if ok {
125125
delete(f.Sheet, p)
@@ -190,7 +190,7 @@ func (f *File) relsWriter() {
190190
if rel != nil {
191191
output, _ := xml.Marshal(rel)
192192
if strings.HasPrefix(path, "xl/worksheets/sheet/rels/sheet") {
193-
output = replaceWorkSheetsRelationshipsNameSpaceBytes(output)
193+
output = replaceRelationshipsNameSpaceBytes(output)
194194
}
195195
f.saveFileList(path, replaceRelationshipsBytes(output))
196196
}
@@ -211,19 +211,6 @@ func replaceRelationshipsBytes(content []byte) []byte {
211211
return bytes.Replace(content, oldXmlns, newXmlns, -1)
212212
}
213213

214-
// replaceRelationshipsNameSpaceBytes; Some tools that read XLSX files have
215-
// very strict requirements about the structure of the input XML. In
216-
// particular both Numbers on the Mac and SAS dislike inline XML namespace
217-
// declarations, or namespace prefixes that don't match the ones that Excel
218-
// itself uses. This is a problem because the Go XML library doesn't multiple
219-
// namespace declarations in a single element of a document. This function is
220-
// a horrible hack to fix that after the XML marshalling is completed.
221-
func replaceRelationshipsNameSpaceBytes(workbookMarshal []byte) []byte {
222-
oldXmlns := []byte(`<workbook xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">`)
223-
newXmlns := []byte(`<workbook` + templateNamespaceIDMap)
224-
return bytes.Replace(workbookMarshal, oldXmlns, newXmlns, -1)
225-
}
226-
227214
// SetActiveSheet provides function to set default active worksheet of XLSX by
228215
// given index. Note that active index is different from the index returned by
229216
// function GetSheetMap(). It should be greater than 0 and less than total
@@ -248,7 +235,11 @@ func (f *File) SetActiveSheet(index int) {
248235
}
249236
}
250237
for idx, name := range f.GetSheetMap() {
251-
xlsx, _ := f.workSheetReader(name)
238+
xlsx, err := f.workSheetReader(name)
239+
if err != nil {
240+
// Chartsheet
241+
return
242+
}
252243
if xlsx.SheetViews == nil {
253244
xlsx.SheetViews = &xlsxSheetViews{
254245
SheetView: []xlsxSheetView{{WorkbookViewID: 0}},
@@ -370,8 +361,8 @@ func (f *File) getSheetMap() map[string]string {
370361
// Construct a target XML as xl/worksheets/sheet%d by split path, compatible with different types of relative paths in workbook.xml.rels, for example: worksheets/sheet%d.xml and /xl/worksheets/sheet%d.xml
371362
pathInfo := strings.Split(rel.Target, "/")
372363
pathInfoLen := len(pathInfo)
373-
if pathInfoLen > 0 {
374-
maps[v.Name] = fmt.Sprintf("xl/worksheets/%s", pathInfo[pathInfoLen-1])
364+
if pathInfoLen > 1 {
365+
maps[v.Name] = fmt.Sprintf("xl/%s", strings.Join(pathInfo[pathInfoLen-2:], "/"))
375366
}
376367
}
377368
}
@@ -420,7 +411,10 @@ func (f *File) DeleteSheet(name string) {
420411
for _, rel := range wbRels.Relationships {
421412
if rel.ID == sheet.ID {
422413
sheetXML = fmt.Sprintf("xl/%s", rel.Target)
423-
rels = strings.Replace(fmt.Sprintf("xl/%s.rels", rel.Target), "xl/worksheets/", "xl/worksheets/_rels/", -1)
414+
pathInfo := strings.Split(rel.Target, "/")
415+
if len(pathInfo) == 2 {
416+
rels = fmt.Sprintf("xl/%s/_rels/%s.rels", pathInfo[0], pathInfo[1])
417+
}
424418
}
425419
}
426420
}
@@ -430,6 +424,7 @@ func (f *File) DeleteSheet(name string) {
430424
delete(f.sheetMap, sheetName)
431425
delete(f.XLSX, sheetXML)
432426
delete(f.XLSX, rels)
427+
delete(f.Relationships, rels)
433428
delete(f.Sheet, sheetXML)
434429
f.SheetCount--
435430
}
@@ -729,7 +724,7 @@ func (f *File) SearchSheet(sheet, value string, reg ...bool) ([]string, error) {
729724
if f.Sheet[name] != nil {
730725
// flush data
731726
output, _ := xml.Marshal(f.Sheet[name])
732-
f.saveFileList(name, replaceWorkSheetsRelationshipsNameSpaceBytes(output))
727+
f.saveFileList(name, replaceRelationshipsNameSpaceBytes(output))
733728
}
734729
return f.searchSheet(name, value, regSearch)
735730
}

styles.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -1018,7 +1018,7 @@ func (f *File) stylesReader() *xlsxStyleSheet {
10181018
func (f *File) styleSheetWriter() {
10191019
if f.Styles != nil {
10201020
output, _ := xml.Marshal(f.Styles)
1021-
f.saveFileList("xl/styles.xml", replaceWorkSheetsRelationshipsNameSpaceBytes(output))
1021+
f.saveFileList("xl/styles.xml", replaceRelationshipsNameSpaceBytes(output))
10221022
}
10231023
}
10241024

0 commit comments

Comments
 (0)