diff options
author | xuri <xuri.me@gmail.com> | 2019-12-16 08:32:04 +0800 |
---|---|---|
committer | xuri <xuri.me@gmail.com> | 2019-12-16 08:32:04 +0800 |
commit | a526e90404913f5d649d29a7aeee29f5ac9ff590 (patch) | |
tree | 6f502897cf2083935d6e8842a06146de303e7c98 | |
parent | 3763228ea7c37e18633ada493a63a6a8722e508c (diff) |
Fix #426, handle empty workbook view
-rw-r--r-- | sheet.go | 35 | ||||
-rw-r--r-- | stream.go | 3 | ||||
-rw-r--r-- | xmlWorkbook.go | 2 | ||||
-rw-r--r-- | xmlWorksheet.go | 8 |
4 files changed, 25 insertions, 23 deletions
@@ -149,11 +149,12 @@ func (f *File) setContentTypes(index int) { // setSheet provides a function to update sheet property by given index. func (f *File) setSheet(index int, name string) { - var xlsx xlsxWorksheet - xlsx.Dimension.Ref = "A1" - xlsx.SheetViews.SheetView = append(xlsx.SheetViews.SheetView, xlsxSheetView{ - WorkbookViewID: 0, - }) + xlsx := xlsxWorksheet{ + Dimension: &xlsxDimension{Ref: "A1"}, + SheetViews: xlsxSheetViews{ + SheetView: []xlsxSheetView{{WorkbookViewID: 0}}, + }, + } path := "xl/worksheets/sheet" + strconv.Itoa(index) + ".xml" f.sheetMap[trimSheetName(name)] = path f.Sheet[path] = &xlsx @@ -222,6 +223,9 @@ func (f *File) SetActiveSheet(index int) { wb := f.workbookReader() for activeTab, sheet := range wb.Sheets.Sheet { if sheet.SheetID == index { + if wb.BookViews == nil { + wb.BookViews = &xlsxBookViews{} + } if len(wb.BookViews.WorkBookView) > 0 { wb.BookViews.WorkBookView[0].ActiveTab = activeTab } else { @@ -253,16 +257,13 @@ func (f *File) SetActiveSheet(index int) { func (f *File) GetActiveSheetIndex() int { wb := f.workbookReader() if wb != nil { - view := wb.BookViews.WorkBookView - sheets := wb.Sheets.Sheet - var activeTab int - if len(view) > 0 { - activeTab = view[0].ActiveTab - if len(sheets) > activeTab && sheets[activeTab].SheetID != 0 { - return sheets[activeTab].SheetID + if wb.BookViews != nil && len(wb.BookViews.WorkBookView) > 0 { + activeTab := wb.BookViews.WorkBookView[0].ActiveTab + if len(wb.Sheets.Sheet) > activeTab && wb.Sheets.Sheet[activeTab].SheetID != 0 { + return wb.Sheets.Sheet[activeTab].SheetID } } - if len(wb.Sheets.Sheet) == 1 { + if len(wb.Sheets.Sheet) >= 1 { return wb.Sheets.Sheet[0].SheetID } } @@ -413,9 +414,11 @@ func (f *File) DeleteSheet(name string) { f.SheetCount-- } } - for idx, bookView := range wb.BookViews.WorkBookView { - if bookView.ActiveTab >= f.SheetCount { - wb.BookViews.WorkBookView[idx].ActiveTab-- + if wb.BookViews != nil { + for idx, bookView := range wb.BookViews.WorkBookView { + if bookView.ActiveTab >= f.SheetCount { + wb.BookViews.WorkBookView[idx].ActiveTab-- + } } } f.SetActiveSheet(len(f.GetSheetMap())) @@ -191,13 +191,12 @@ func StreamMarshalSheet(ws *xlsxWorksheet, replaceMap map[string][]byte) []byte var marshalResult []byte marshalResult = append(marshalResult, []byte(XMLHeader+`<worksheet`+templateNamespaceIDMap)...) for i := 0; i < s.NumField(); i++ { - f := s.Field(i) content, ok := replaceMap[typeOfT.Field(i).Name] if ok { marshalResult = append(marshalResult, content...) continue } - out, _ := xml.Marshal(f.Interface()) + out, _ := xml.Marshal(s.Field(i).Interface()) marshalResult = append(marshalResult, out...) } marshalResult = append(marshalResult, []byte(`</worksheet>`)...) diff --git a/xmlWorkbook.go b/xmlWorkbook.go index 765563b..e9ded6c 100644 --- a/xmlWorkbook.go +++ b/xmlWorkbook.go @@ -33,7 +33,7 @@ type xlsxWorkbook struct { FileVersion *xlsxFileVersion `xml:"fileVersion"` WorkbookPr *xlsxWorkbookPr `xml:"workbookPr"` WorkbookProtection *xlsxWorkbookProtection `xml:"workbookProtection"` - BookViews xlsxBookViews `xml:"bookViews"` + BookViews *xlsxBookViews `xml:"bookViews"` Sheets xlsxSheets `xml:"sheets"` ExternalReferences *xlsxExternalReferences `xml:"externalReferences"` DefinedNames *xlsxDefinedNames `xml:"definedNames"` diff --git a/xmlWorksheet.go b/xmlWorksheet.go index 9a478e1..b785eac 100644 --- a/xmlWorksheet.go +++ b/xmlWorksheet.go @@ -17,10 +17,10 @@ import "encoding/xml" type xlsxWorksheet struct { XMLName xml.Name `xml:"http://schemas.openxmlformats.org/spreadsheetml/2006/main worksheet"` SheetPr *xlsxSheetPr `xml:"sheetPr"` - Dimension xlsxDimension `xml:"dimension"` - SheetViews xlsxSheetViews `xml:"sheetViews,omitempty"` + Dimension *xlsxDimension `xml:"dimension"` + SheetViews xlsxSheetViews `xml:"sheetViews"` SheetFormatPr *xlsxSheetFormatPr `xml:"sheetFormatPr"` - Cols *xlsxCols `xml:"cols,omitempty"` + Cols *xlsxCols `xml:"cols"` SheetData xlsxSheetData `xml:"sheetData"` SheetCalcPr *xlsxInnerXML `xml:"sheetCalcPr"` SheetProtection *xlsxSheetProtection `xml:"sheetProtection"` @@ -33,7 +33,7 @@ type xlsxWorksheet struct { MergeCells *xlsxMergeCells `xml:"mergeCells"` PhoneticPr *xlsxPhoneticPr `xml:"phoneticPr"` ConditionalFormatting []*xlsxConditionalFormatting `xml:"conditionalFormatting"` - DataValidations *xlsxDataValidations `xml:"dataValidations,omitempty"` + DataValidations *xlsxDataValidations `xml:"dataValidations"` Hyperlinks *xlsxHyperlinks `xml:"hyperlinks"` PrintOptions *xlsxPrintOptions `xml:"printOptions"` PageMargins *xlsxPageMargins `xml:"pageMargins"` |