Fix #426, handle empty workbook view

This commit is contained in:
xuri 2019-12-16 08:32:04 +08:00
parent 3763228ea7
commit a526e90404
No known key found for this signature in database
GPG Key ID: BA5E5BB1C948EDF7
4 changed files with 25 additions and 23 deletions

View File

@ -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()))

View File

@ -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>`)...)

View File

@ -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"`

View File

@ -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"`