diff --git a/docProps.go b/docProps.go index 41ea18e..fe6f214 100644 --- a/docProps.go +++ b/docProps.go @@ -204,7 +204,12 @@ func (f *File) SetDocProps(docProperties *DocProperties) (err error) { Category: core.Category, Version: core.Version, }, nil - newProps.Created.Text, newProps.Created.Type, newProps.Modified.Text, newProps.Modified.Type = core.Created.Text, core.Created.Type, core.Modified.Text, core.Modified.Type + if core.Created != nil { + newProps.Created = &xlsxDcTerms{Type: core.Created.Type, Text: core.Created.Text} + } + if core.Modified != nil { + newProps.Modified = &xlsxDcTerms{Type: core.Modified.Type, Text: core.Modified.Text} + } fields = []string{ "Category", "ContentStatus", "Creator", "Description", "Identifier", "Keywords", "LastModifiedBy", "Revision", "Subject", "Title", "Language", "Version", @@ -216,10 +221,10 @@ func (f *File) SetDocProps(docProperties *DocProperties) (err error) { } } if docProperties.Created != "" { - newProps.Created.Text = docProperties.Created + newProps.Created = &xlsxDcTerms{Type: "dcterms:W3CDTF", Text: docProperties.Created} } if docProperties.Modified != "" { - newProps.Modified.Text = docProperties.Modified + newProps.Modified = &xlsxDcTerms{Type: "dcterms:W3CDTF", Text: docProperties.Modified} } output, err = xml.Marshal(newProps) f.saveFileList(defaultXMLPathDocPropsCore, output) @@ -239,19 +244,22 @@ func (f *File) GetDocProps() (ret *DocProperties, err error) { ret, err = &DocProperties{ Category: core.Category, ContentStatus: core.ContentStatus, - Created: core.Created.Text, Creator: core.Creator, Description: core.Description, Identifier: core.Identifier, Keywords: core.Keywords, LastModifiedBy: core.LastModifiedBy, - Modified: core.Modified.Text, Revision: core.Revision, Subject: core.Subject, Title: core.Title, Language: core.Language, Version: core.Version, }, nil - + if core.Created != nil { + ret.Created = core.Created.Text + } + if core.Modified != nil { + ret.Modified = core.Modified.Text + } return } diff --git a/sheetview.go b/sheetview.go index bf8f023..99f0634 100644 --- a/sheetview.go +++ b/sheetview.go @@ -163,6 +163,11 @@ func (f *File) getSheetView(sheet string, viewIndex int) (*xlsxSheetView, error) if err != nil { return nil, err } + if ws.SheetViews == nil { + ws.SheetViews = &xlsxSheetViews{ + SheetView: []xlsxSheetView{{WorkbookViewID: 0}}, + } + } if viewIndex < 0 { if viewIndex < -len(ws.SheetViews.SheetView) { return nil, fmt.Errorf("view index %d out of range", viewIndex) diff --git a/sheetview_test.go b/sheetview_test.go index 2bba8f9..65c4f51 100644 --- a/sheetview_test.go +++ b/sheetview_test.go @@ -210,4 +210,9 @@ func TestSheetViewOptionsErrors(t *testing.T) { assert.NoError(t, f.SetSheetViewOptions(sheet, -1)) assert.Error(t, f.SetSheetViewOptions(sheet, 1)) assert.Error(t, f.SetSheetViewOptions(sheet, -2)) + + ws, ok := f.Sheet.Load("xl/worksheets/sheet1.xml") + assert.True(t, ok) + ws.(*xlsxWorksheet).SheetViews = nil + assert.NoError(t, f.GetSheetViewOptions(sheet, 0)) } diff --git a/xmlCore.go b/xmlCore.go index 22ae6bc..1849131 100644 --- a/xmlCore.go +++ b/xmlCore.go @@ -31,61 +31,61 @@ type DocProperties struct { Version string } +// decodeDcTerms directly maps the DCMI metadata terms for the coreProperties. +type decodeDcTerms struct { + Text string `xml:",chardata"` + Type string `xml:"http://www.w3.org/2001/XMLSchema-instance type,attr"` +} + // decodeCoreProperties directly maps the root element for a part of this // content type shall coreProperties. In order to solve the problem that the // label structure is changed after serialization and deserialization, two // different structures are defined. decodeCoreProperties just for // deserialization. type decodeCoreProperties struct { - XMLName xml.Name `xml:"http://schemas.openxmlformats.org/package/2006/metadata/core-properties coreProperties"` - Title string `xml:"http://purl.org/dc/elements/1.1/ title,omitempty"` - Subject string `xml:"http://purl.org/dc/elements/1.1/ subject,omitempty"` - Creator string `xml:"http://purl.org/dc/elements/1.1/ creator"` - Keywords string `xml:"keywords,omitempty"` - Description string `xml:"http://purl.org/dc/elements/1.1/ description,omitempty"` - LastModifiedBy string `xml:"lastModifiedBy"` - Language string `xml:"http://purl.org/dc/elements/1.1/ language,omitempty"` - Identifier string `xml:"http://purl.org/dc/elements/1.1/ identifier,omitempty"` - Revision string `xml:"revision,omitempty"` - Created struct { - Text string `xml:",chardata"` - Type string `xml:"http://www.w3.org/2001/XMLSchema-instance type,attr"` - } `xml:"http://purl.org/dc/terms/ created"` - Modified struct { - Text string `xml:",chardata"` - Type string `xml:"http://www.w3.org/2001/XMLSchema-instance type,attr"` - } `xml:"http://purl.org/dc/terms/ modified"` - ContentStatus string `xml:"contentStatus,omitempty"` - Category string `xml:"category,omitempty"` - Version string `xml:"version,omitempty"` + XMLName xml.Name `xml:"http://schemas.openxmlformats.org/package/2006/metadata/core-properties coreProperties"` + Title string `xml:"http://purl.org/dc/elements/1.1/ title,omitempty"` + Subject string `xml:"http://purl.org/dc/elements/1.1/ subject,omitempty"` + Creator string `xml:"http://purl.org/dc/elements/1.1/ creator"` + Keywords string `xml:"keywords,omitempty"` + Description string `xml:"http://purl.org/dc/elements/1.1/ description,omitempty"` + LastModifiedBy string `xml:"lastModifiedBy"` + Language string `xml:"http://purl.org/dc/elements/1.1/ language,omitempty"` + Identifier string `xml:"http://purl.org/dc/elements/1.1/ identifier,omitempty"` + Revision string `xml:"revision,omitempty"` + Created *decodeDcTerms `xml:"http://purl.org/dc/terms/ created"` + Modified *decodeDcTerms `xml:"http://purl.org/dc/terms/ modified"` + ContentStatus string `xml:"contentStatus,omitempty"` + Category string `xml:"category,omitempty"` + Version string `xml:"version,omitempty"` +} + +// xlsxDcTerms directly maps the DCMI metadata terms for the coreProperties. +type xlsxDcTerms struct { + Text string `xml:",chardata"` + Type string `xml:"xsi:type,attr"` } // xlsxCoreProperties directly maps the root element for a part of this // content type shall coreProperties. type xlsxCoreProperties struct { - XMLName xml.Name `xml:"http://schemas.openxmlformats.org/package/2006/metadata/core-properties coreProperties"` - Dc string `xml:"xmlns:dc,attr"` - Dcterms string `xml:"xmlns:dcterms,attr"` - Dcmitype string `xml:"xmlns:dcmitype,attr"` - XSI string `xml:"xmlns:xsi,attr"` - Title string `xml:"dc:title,omitempty"` - Subject string `xml:"dc:subject,omitempty"` - Creator string `xml:"dc:creator"` - Keywords string `xml:"keywords,omitempty"` - Description string `xml:"dc:description,omitempty"` - LastModifiedBy string `xml:"lastModifiedBy"` - Language string `xml:"dc:language,omitempty"` - Identifier string `xml:"dc:identifier,omitempty"` - Revision string `xml:"revision,omitempty"` - Created struct { - Text string `xml:",chardata"` - Type string `xml:"xsi:type,attr"` - } `xml:"dcterms:created"` - Modified struct { - Text string `xml:",chardata"` - Type string `xml:"xsi:type,attr"` - } `xml:"dcterms:modified"` - ContentStatus string `xml:"contentStatus,omitempty"` - Category string `xml:"category,omitempty"` - Version string `xml:"version,omitempty"` + XMLName xml.Name `xml:"http://schemas.openxmlformats.org/package/2006/metadata/core-properties coreProperties"` + Dc string `xml:"xmlns:dc,attr"` + Dcterms string `xml:"xmlns:dcterms,attr"` + Dcmitype string `xml:"xmlns:dcmitype,attr"` + XSI string `xml:"xmlns:xsi,attr"` + Title string `xml:"dc:title,omitempty"` + Subject string `xml:"dc:subject,omitempty"` + Creator string `xml:"dc:creator"` + Keywords string `xml:"keywords,omitempty"` + Description string `xml:"dc:description,omitempty"` + LastModifiedBy string `xml:"lastModifiedBy"` + Language string `xml:"dc:language,omitempty"` + Identifier string `xml:"dc:identifier,omitempty"` + Revision string `xml:"revision,omitempty"` + Created *xlsxDcTerms `xml:"dcterms:created"` + Modified *xlsxDcTerms `xml:"dcterms:modified"` + ContentStatus string `xml:"contentStatus,omitempty"` + Category string `xml:"category,omitempty"` + Version string `xml:"version,omitempty"` }