Browse Source

- Supplemental worksheet struct fields and field order adjustment
- Testing case for set and get doc properties
- Update charts struct XML tags

xuri 6 years ago
parent
commit
cff16fa811
8 changed files with 306 additions and 180 deletions
  1. 12 2
      cellmerged.go
  2. 0 0
      docProps.go
  3. 56 0
      docProps_test.go
  4. 1 1
      excelize_test.go
  5. 164 164
      xmlChart.go
  6. 0 0
      xmlCore.go
  7. 0 0
      xmlDrawing.go
  8. 73 13
      xmlWorksheet.go

+ 12 - 2
cellmerged.go

@@ -1,8 +1,18 @@
+// Copyright 2016 - 2019 The excelize Authors. All rights reserved. Use of
+// this source code is governed by a BSD-style license that can be found in
+// the LICENSE file.
+//
+// Package excelize providing a set of functions that allow you to write to
+// and read from XLSX files. Support reads and writes XLSX file generated by
+// Microsoft Excel™ 2007 and later. Support save file without losing original
+// charts of XLSX. This library needs Go version 1.8 or later.
+
 package excelize
 
 import "strings"
 
-// GetMergeCells provides a function to get all merged cells from a worksheet currently.
+// GetMergeCells provides a function to get all merged cells from a worksheet
+// currently.
 func (f *File) GetMergeCells(sheet string) ([]MergeCell, error) {
 	var mergeCells []MergeCell
 	xlsx, err := f.workSheetReader(sheet)
@@ -45,4 +55,4 @@ func (m *MergeCell) GetStartAxis() string {
 func (m *MergeCell) GetEndAxis() string {
 	axis := strings.Split((*m)[0], ":")
 	return axis[1]
-}
+}

+ 0 - 0
docProps.go


+ 56 - 0
docProps_test.go

@@ -0,0 +1,56 @@
+// Copyright 2016 - 2019 The excelize Authors. All rights reserved. Use of
+// this source code is governed by a BSD-style license that can be found in
+// the LICENSE file.
+//
+// Package excelize providing a set of functions that allow you to write to
+// and read from XLSX files. Support reads and writes XLSX file generated by
+// Microsoft Excel™ 2007 and later. Support save file without losing original
+// charts of XLSX. This library needs Go version 1.8 or later.
+
+package excelize
+
+import (
+	"path/filepath"
+	"testing"
+
+	"github.com/stretchr/testify/assert"
+)
+
+func TestSetDocProps(t *testing.T) {
+	f, err := OpenFile(filepath.Join("test", "Book1.xlsx"))
+	if !assert.NoError(t, err) {
+		t.FailNow()
+	}
+	assert.NoError(t, f.SetDocProps(&DocProperties{
+		Category:       "category",
+		ContentStatus:  "Draft",
+		Created:        "2019-06-04T22:00:10Z",
+		Creator:        "Go Excelize",
+		Description:    "This file created by Go Excelize",
+		Identifier:     "xlsx",
+		Keywords:       "Spreadsheet",
+		LastModifiedBy: "Go Author",
+		Modified:       "2019-06-04T22:00:10Z",
+		Revision:       "0",
+		Subject:        "Test Subject",
+		Title:          "Test Title",
+		Language:       "en-US",
+		Version:        "1.0.0",
+	}))
+	assert.NoError(t, f.SaveAs(filepath.Join("test", "TestSetDocProps.xlsx")))
+	f.XLSX["docProps/core.xml"] = nil
+	assert.EqualError(t, f.SetDocProps(&DocProperties{}), "EOF")
+}
+
+func TestGetDocProps(t *testing.T) {
+	f, err := OpenFile(filepath.Join("test", "Book1.xlsx"))
+	if !assert.NoError(t, err) {
+		t.FailNow()
+	}
+	props, err := f.GetDocProps()
+	assert.NoError(t, err)
+	assert.Equal(t, props.Creator, "Microsoft Office User")
+	f.XLSX["docProps/core.xml"] = nil
+	_, err = f.GetDocProps()
+	assert.EqualError(t, err, "EOF")
+}

+ 1 - 1
excelize_test.go

@@ -192,7 +192,7 @@ func TestBrokenFile(t *testing.T) {
 
 	t.Run("SaveAsEmptyStruct", func(t *testing.T) {
 		// Test write file with broken file struct with given path.
-		assert.NoError(t, f.SaveAs(filepath.Join("test", "TestBrokenFile.SaveAsEmptyStruct.xlsx")))
+		assert.NoError(t, f.SaveAs(filepath.Join("test", "BrokenFile.SaveAsEmptyStruct.xlsx")))
 	})
 
 	t.Run("OpenBadWorkbook", func(t *testing.T) {

+ 164 - 164
xmlChart.go

@@ -11,66 +11,66 @@ package excelize
 
 import "encoding/xml"
 
-// xlsxChartSpace directly maps the c:chartSpace element. The chart namespace in
+// xlsxChartSpace directly maps the chartSpace element. The chart namespace in
 // DrawingML is for representing visualizations of numeric data with column
 // charts, pie charts, scatter charts, or other types of charts.
 type xlsxChartSpace struct {
-	XMLName        xml.Name        `xml:"c:chartSpace"`
+	XMLName        xml.Name        `xml:"http://schemas.openxmlformats.org/drawingml/2006/chart chartSpace"`
 	XMLNSc         string          `xml:"xmlns:c,attr"`
 	XMLNSa         string          `xml:"xmlns:a,attr"`
 	XMLNSr         string          `xml:"xmlns:r,attr"`
 	XMLNSc16r2     string          `xml:"xmlns:c16r2,attr"`
-	Date1904       *attrValBool    `xml:"c:date1904"`
-	Lang           *attrValString  `xml:"c:lang"`
-	RoundedCorners *attrValBool    `xml:"c:roundedCorners"`
-	Chart          cChart          `xml:"c:chart"`
-	SpPr           *cSpPr          `xml:"c:spPr"`
-	TxPr           *cTxPr          `xml:"c:txPr"`
-	PrintSettings  *cPrintSettings `xml:"c:printSettings"`
-}
-
-// cThicknessSpPr directly maps the element that specifies the thickness of the
-// walls or floor as a percentage of the largest dimension of the plot volume
-// and SpPr element.
+	Date1904       *attrValBool    `xml:"date1904"`
+	Lang           *attrValString  `xml:"lang"`
+	RoundedCorners *attrValBool    `xml:"roundedCorners"`
+	Chart          cChart          `xml:"chart"`
+	SpPr           *cSpPr          `xml:"spPr"`
+	TxPr           *cTxPr          `xml:"txPr"`
+	PrintSettings  *cPrintSettings `xml:"printSettings"`
+}
+
+// cThicknessSpPr directly maps the element that specifies the thickness of
+// the walls or floor as a percentage of the largest dimension of the plot
+// volume and SpPr element.
 type cThicknessSpPr struct {
-	Thickness *attrValInt `xml:"c:thickness"`
-	SpPr      *cSpPr      `xml:"c:spPr"`
+	Thickness *attrValInt `xml:"thickness"`
+	SpPr      *cSpPr      `xml:"spPr"`
 }
 
-// cChart (Chart) directly maps the c:chart element. This element specifies a
+// cChart (Chart) directly maps the chart element. This element specifies a
 // title.
 type cChart struct {
-	Title            *cTitle            `xml:"c:title"`
-	AutoTitleDeleted *cAutoTitleDeleted `xml:"c:autoTitleDeleted"`
-	View3D           *cView3D           `xml:"c:view3D"`
-	Floor            *cThicknessSpPr    `xml:"c:floor"`
-	SideWall         *cThicknessSpPr    `xml:"c:sideWall"`
-	BackWall         *cThicknessSpPr    `xml:"c:backWall"`
-	PlotArea         *cPlotArea         `xml:"c:plotArea"`
-	Legend           *cLegend           `xml:"c:legend"`
-	PlotVisOnly      *attrValBool       `xml:"c:plotVisOnly"`
-	DispBlanksAs     *attrValString     `xml:"c:dispBlanksAs"`
-	ShowDLblsOverMax *attrValBool       `xml:"c:showDLblsOverMax"`
-}
-
-// cTitle (Title) directly maps the c:title element. This element specifies a
+	Title            *cTitle            `xml:"title"`
+	AutoTitleDeleted *cAutoTitleDeleted `xml:"autoTitleDeleted"`
+	View3D           *cView3D           `xml:"view3D"`
+	Floor            *cThicknessSpPr    `xml:"floor"`
+	SideWall         *cThicknessSpPr    `xml:"sideWall"`
+	BackWall         *cThicknessSpPr    `xml:"backWall"`
+	PlotArea         *cPlotArea         `xml:"plotArea"`
+	Legend           *cLegend           `xml:"legend"`
+	PlotVisOnly      *attrValBool       `xml:"plotVisOnly"`
+	DispBlanksAs     *attrValString     `xml:"dispBlanksAs"`
+	ShowDLblsOverMax *attrValBool       `xml:"showDLblsOverMax"`
+}
+
+// cTitle (Title) directly maps the title element. This element specifies a
 // title.
 type cTitle struct {
-	Tx      cTx         `xml:"c:tx,omitempty"`
-	Layout  string      `xml:"c:layout,omitempty"`
-	Overlay attrValBool `xml:"c:overlay,omitempty"`
-	SpPr    cSpPr       `xml:"c:spPr,omitempty"`
-	TxPr    cTxPr       `xml:"c:txPr,omitempty"`
+	Tx      cTx         `xml:"tx,omitempty"`
+	Layout  string      `xml:"layout,omitempty"`
+	Overlay attrValBool `xml:"overlay,omitempty"`
+	SpPr    cSpPr       `xml:"spPr,omitempty"`
+	TxPr    cTxPr       `xml:"txPr,omitempty"`
 }
 
-// cTx (Chart Text) directly maps the c:tx element. This element specifies text
+// cTx (Chart Text) directly maps the tx element. This element specifies text
 // to use on a chart, including rich text formatting.
 type cTx struct {
-	StrRef *cStrRef `xml:"c:strRef"`
-	Rich   *cRich   `xml:"c:rich,omitempty"`
+	StrRef *cStrRef `xml:"strRef"`
+	Rich   *cRich   `xml:"rich,omitempty"`
 }
 
-// cRich (Rich Text) directly maps the c:rich element. This element contains a
+// cRich (Rich Text) directly maps the rich element. This element contains a
 // string with rich text formatting.
 type cRich struct {
 	BodyPr   aBodyPr `xml:"a:bodyPr,omitempty"`
@@ -186,7 +186,7 @@ type aR struct {
 	T   string `xml:"a:t,omitempty"`
 }
 
-// aRPr (Run Properties) directly maps the c:rPr element. This element
+// aRPr (Run Properties) directly maps the rPr element. This element
 // specifies a set of run properties which shall be applied to the contents of
 // the parent run after all style formatting has been applied to the text. These
 // properties are defined as direct formatting, since they are directly applied
@@ -217,7 +217,7 @@ type aRPr struct {
 	Cs         *aCs        `xml:"a:cs"`
 }
 
-// cSpPr (Shape Properties) directly maps the c:spPr element. This element
+// cSpPr (Shape Properties) directly maps the spPr element. This element
 // specifies the visual shape properties that can be applied to a shape. These
 // properties include the shape fill, outline, geometry, effects, and 3D
 // orientation.
@@ -259,7 +259,7 @@ type aLn struct {
 	SolidFill *aSolidFill `xml:"a:solidFill"`
 }
 
-// cTxPr (Text Properties) directly maps the c:txPr element. This element
+// cTxPr (Text Properties) directly maps the txPr element. This element
 // specifies text formatting. The lstStyle element is not supported.
 type cTxPr struct {
 	BodyPr   aBodyPr `xml:"a:bodyPr,omitempty"`
@@ -282,207 +282,207 @@ type aEndParaRPr struct {
 }
 
 // cAutoTitleDeleted (Auto Title Is Deleted) directly maps the
-// c:autoTitleDeleted element. This element specifies the title shall not be
+// autoTitleDeleted element. This element specifies the title shall not be
 // shown for this chart.
 type cAutoTitleDeleted struct {
 	Val bool `xml:"val,attr"`
 }
 
-// cView3D (View In 3D) directly maps the c:view3D element. This element
+// cView3D (View In 3D) directly maps the view3D element. This element
 // specifies the 3-D view of the chart.
 type cView3D struct {
-	RotX         *attrValInt `xml:"c:rotX"`
-	RotY         *attrValInt `xml:"c:rotY"`
-	DepthPercent *attrValInt `xml:"c:depthPercent"`
-	RAngAx       *attrValInt `xml:"c:rAngAx"`
+	RotX         *attrValInt `xml:"rotX"`
+	RotY         *attrValInt `xml:"rotY"`
+	DepthPercent *attrValInt `xml:"depthPercent"`
+	RAngAx       *attrValInt `xml:"rAngAx"`
 }
 
-// cPlotArea directly maps the c:plotArea element. This element specifies the
+// cPlotArea directly maps the plotArea element. This element specifies the
 // plot area of the chart.
 type cPlotArea struct {
-	Layout        *string  `xml:"c:layout"`
-	AreaChart     *cCharts `xml:"c:areaChart"`
-	Area3DChart   *cCharts `xml:"c:area3DChart"`
-	BarChart      *cCharts `xml:"c:barChart"`
-	Bar3DChart    *cCharts `xml:"c:bar3DChart"`
-	DoughnutChart *cCharts `xml:"c:doughnutChart"`
-	LineChart     *cCharts `xml:"c:lineChart"`
-	PieChart      *cCharts `xml:"c:pieChart"`
-	Pie3DChart    *cCharts `xml:"c:pie3DChart"`
-	RadarChart    *cCharts `xml:"c:radarChart"`
-	ScatterChart  *cCharts `xml:"c:scatterChart"`
-	CatAx         []*cAxs  `xml:"c:catAx"`
-	ValAx         []*cAxs  `xml:"c:valAx"`
-	SpPr          *cSpPr   `xml:"c:spPr"`
+	Layout        *string  `xml:"layout"`
+	AreaChart     *cCharts `xml:"areaChart"`
+	Area3DChart   *cCharts `xml:"area3DChart"`
+	BarChart      *cCharts `xml:"barChart"`
+	Bar3DChart    *cCharts `xml:"bar3DChart"`
+	DoughnutChart *cCharts `xml:"doughnutChart"`
+	LineChart     *cCharts `xml:"lineChart"`
+	PieChart      *cCharts `xml:"pieChart"`
+	Pie3DChart    *cCharts `xml:"pie3DChart"`
+	RadarChart    *cCharts `xml:"radarChart"`
+	ScatterChart  *cCharts `xml:"scatterChart"`
+	CatAx         []*cAxs  `xml:"catAx"`
+	ValAx         []*cAxs  `xml:"valAx"`
+	SpPr          *cSpPr   `xml:"spPr"`
 }
 
 // cCharts specifies the common element of the chart.
 type cCharts struct {
-	BarDir       *attrValString `xml:"c:barDir"`
-	Grouping     *attrValString `xml:"c:grouping"`
-	RadarStyle   *attrValString `xml:"c:radarStyle"`
-	ScatterStyle *attrValString `xml:"c:scatterStyle"`
-	VaryColors   *attrValBool   `xml:"c:varyColors"`
-	Ser          *[]cSer        `xml:"c:ser"`
-	DLbls        *cDLbls        `xml:"c:dLbls"`
-	HoleSize     *attrValInt    `xml:"c:holeSize"`
-	Smooth       *attrValBool   `xml:"c:smooth"`
-	Overlap      *attrValInt    `xml:"c:overlap"`
-	AxID         []*attrValInt  `xml:"c:axId"`
-}
-
-// cAxs directly maps the c:catAx and c:valAx element.
+	BarDir       *attrValString `xml:"barDir"`
+	Grouping     *attrValString `xml:"grouping"`
+	RadarStyle   *attrValString `xml:"radarStyle"`
+	ScatterStyle *attrValString `xml:"scatterStyle"`
+	VaryColors   *attrValBool   `xml:"varyColors"`
+	Ser          *[]cSer        `xml:"ser"`
+	DLbls        *cDLbls        `xml:"dLbls"`
+	HoleSize     *attrValInt    `xml:"holeSize"`
+	Smooth       *attrValBool   `xml:"smooth"`
+	Overlap      *attrValInt    `xml:"overlap"`
+	AxID         []*attrValInt  `xml:"axId"`
+}
+
+// cAxs directly maps the catAx and valAx element.
 type cAxs struct {
-	AxID          *attrValInt    `xml:"c:axId"`
-	Scaling       *cScaling      `xml:"c:scaling"`
-	Delete        *attrValBool   `xml:"c:delete"`
-	AxPos         *attrValString `xml:"c:axPos"`
-	NumFmt        *cNumFmt       `xml:"c:numFmt"`
-	MajorTickMark *attrValString `xml:"c:majorTickMark"`
-	MinorTickMark *attrValString `xml:"c:minorTickMark"`
-	TickLblPos    *attrValString `xml:"c:tickLblPos"`
-	SpPr          *cSpPr         `xml:"c:spPr"`
-	TxPr          *cTxPr         `xml:"c:txPr"`
-	CrossAx       *attrValInt    `xml:"c:crossAx"`
-	Crosses       *attrValString `xml:"c:crosses"`
-	CrossBetween  *attrValString `xml:"c:crossBetween"`
-	Auto          *attrValBool   `xml:"c:auto"`
-	LblAlgn       *attrValString `xml:"c:lblAlgn"`
-	LblOffset     *attrValInt    `xml:"c:lblOffset"`
-	NoMultiLvlLbl *attrValBool   `xml:"c:noMultiLvlLbl"`
-}
-
-// cScaling directly maps the c:scaling element. This element contains
+	AxID          *attrValInt    `xml:"axId"`
+	Scaling       *cScaling      `xml:"scaling"`
+	Delete        *attrValBool   `xml:"delete"`
+	AxPos         *attrValString `xml:"axPos"`
+	NumFmt        *cNumFmt       `xml:"numFmt"`
+	MajorTickMark *attrValString `xml:"majorTickMark"`
+	MinorTickMark *attrValString `xml:"minorTickMark"`
+	TickLblPos    *attrValString `xml:"tickLblPos"`
+	SpPr          *cSpPr         `xml:"spPr"`
+	TxPr          *cTxPr         `xml:"txPr"`
+	CrossAx       *attrValInt    `xml:"crossAx"`
+	Crosses       *attrValString `xml:"crosses"`
+	CrossBetween  *attrValString `xml:"crossBetween"`
+	Auto          *attrValBool   `xml:"auto"`
+	LblAlgn       *attrValString `xml:"lblAlgn"`
+	LblOffset     *attrValInt    `xml:"lblOffset"`
+	NoMultiLvlLbl *attrValBool   `xml:"noMultiLvlLbl"`
+}
+
+// cScaling directly maps the scaling element. This element contains
 // additional axis settings.
 type cScaling struct {
-	Orientation *attrValString `xml:"c:orientation"`
-	Max         *attrValFloat  `xml:"c:max"`
-	Min         *attrValFloat  `xml:"c:min"`
+	Orientation *attrValString `xml:"orientation"`
+	Max         *attrValFloat  `xml:"max"`
+	Min         *attrValFloat  `xml:"min"`
 }
 
-// cNumFmt (Numbering Format) directly maps the c:numFmt element. This element
+// cNumFmt (Numbering Format) directly maps the numFmt element. This element
 // specifies number formatting for the parent element.
 type cNumFmt struct {
 	FormatCode   string `xml:"formatCode,attr"`
 	SourceLinked bool   `xml:"sourceLinked,attr"`
 }
 
-// cSer directly maps the c:ser element. This element specifies a series on a
+// cSer directly maps the ser element. This element specifies a series on a
 // chart.
 type cSer struct {
-	IDx              *attrValInt  `xml:"c:idx"`
-	Order            *attrValInt  `xml:"c:order"`
-	Tx               *cTx         `xml:"c:tx"`
-	SpPr             *cSpPr       `xml:"c:spPr"`
-	DPt              []*cDPt      `xml:"c:dPt"`
-	DLbls            *cDLbls      `xml:"c:dLbls"`
-	Marker           *cMarker     `xml:"c:marker"`
-	InvertIfNegative *attrValBool `xml:"c:invertIfNegative"`
-	Cat              *cCat        `xml:"c:cat"`
-	Val              *cVal        `xml:"c:val"`
-	XVal             *cCat        `xml:"c:xVal"`
-	YVal             *cVal        `xml:"c:yVal"`
-	Smooth           *attrValBool `xml:"c:smooth"`
-}
-
-// cMarker (Marker) directly maps the c:marker element. This element specifies a
+	IDx              *attrValInt  `xml:"idx"`
+	Order            *attrValInt  `xml:"order"`
+	Tx               *cTx         `xml:"tx"`
+	SpPr             *cSpPr       `xml:"spPr"`
+	DPt              []*cDPt      `xml:"dPt"`
+	DLbls            *cDLbls      `xml:"dLbls"`
+	Marker           *cMarker     `xml:"marker"`
+	InvertIfNegative *attrValBool `xml:"invertIfNegative"`
+	Cat              *cCat        `xml:"cat"`
+	Val              *cVal        `xml:"val"`
+	XVal             *cCat        `xml:"xVal"`
+	YVal             *cVal        `xml:"yVal"`
+	Smooth           *attrValBool `xml:"smooth"`
+}
+
+// cMarker (Marker) directly maps the marker element. This element specifies a
 // data marker.
 type cMarker struct {
-	Symbol *attrValString `xml:"c:symbol"`
-	Size   *attrValInt    `xml:"c:size"`
-	SpPr   *cSpPr         `xml:"c:spPr"`
+	Symbol *attrValString `xml:"symbol"`
+	Size   *attrValInt    `xml:"size"`
+	SpPr   *cSpPr         `xml:"spPr"`
 }
 
-// cDPt (Data Point) directly maps the c:dPt element. This element specifies a
+// cDPt (Data Point) directly maps the dPt element. This element specifies a
 // single data point.
 type cDPt struct {
-	IDx      *attrValInt  `xml:"c:idx"`
-	Bubble3D *attrValBool `xml:"c:bubble3D"`
-	SpPr     *cSpPr       `xml:"c:spPr"`
+	IDx      *attrValInt  `xml:"idx"`
+	Bubble3D *attrValBool `xml:"bubble3D"`
+	SpPr     *cSpPr       `xml:"spPr"`
 }
 
-// cCat (Category Axis Data) directly maps the c:cat element. This element
+// cCat (Category Axis Data) directly maps the cat element. This element
 // specifies the data used for the category axis.
 type cCat struct {
-	StrRef *cStrRef `xml:"c:strRef"`
+	StrRef *cStrRef `xml:"strRef"`
 }
 
-// cStrRef (String Reference) directly maps the c:strRef element. This element
+// cStrRef (String Reference) directly maps the strRef element. This element
 // specifies a reference to data for a single data label or title with a cache
 // of the last values used.
 type cStrRef struct {
-	F        string     `xml:"c:f"`
-	StrCache *cStrCache `xml:"c:strCache"`
+	F        string     `xml:"f"`
+	StrCache *cStrCache `xml:"strCache"`
 }
 
-// cStrCache (String Cache) directly maps the c:strCache element. This element
+// cStrCache (String Cache) directly maps the strCache element. This element
 // specifies the last string data used for a chart.
 type cStrCache struct {
-	Pt      []*cPt      `xml:"c:pt"`
-	PtCount *attrValInt `xml:"c:ptCount"`
+	Pt      []*cPt      `xml:"pt"`
+	PtCount *attrValInt `xml:"ptCount"`
 }
 
-// cPt directly maps the c:pt element. This element specifies data for a
+// cPt directly maps the pt element. This element specifies data for a
 // particular data point.
 type cPt struct {
 	IDx int     `xml:"idx,attr"`
-	V   *string `xml:"c:v"`
+	V   *string `xml:"v"`
 }
 
-// cVal directly maps the c:val element. This element specifies the data values
+// cVal directly maps the val element. This element specifies the data values
 // which shall be used to define the location of data markers on a chart.
 type cVal struct {
-	NumRef *cNumRef `xml:"c:numRef"`
+	NumRef *cNumRef `xml:"numRef"`
 }
 
-// cNumRef directly maps the c:numRef element. This element specifies a
+// cNumRef directly maps the numRef element. This element specifies a
 // reference to numeric data with a cache of the last values used.
 type cNumRef struct {
-	F        string     `xml:"c:f"`
-	NumCache *cNumCache `xml:"c:numCache"`
+	F        string     `xml:"f"`
+	NumCache *cNumCache `xml:"numCache"`
 }
 
-// cNumCache directly maps the c:numCache element. This element specifies the
+// cNumCache directly maps the numCache element. This element specifies the
 // last data shown on the chart for a series.
 type cNumCache struct {
-	FormatCode string      `xml:"c:formatCode"`
-	Pt         []*cPt      `xml:"c:pt"`
-	PtCount    *attrValInt `xml:"c:ptCount"`
+	FormatCode string      `xml:"formatCode"`
+	Pt         []*cPt      `xml:"pt"`
+	PtCount    *attrValInt `xml:"ptCount"`
 }
 
-// cDLbls (Data Lables) directly maps the c:dLbls element. This element serves
+// cDLbls (Data Lables) directly maps the dLbls element. This element serves
 // as a root element that specifies the settings for the data labels for an
 // entire series or the entire chart. It contains child elements that specify
 // the specific formatting and positioning settings.
 type cDLbls struct {
-	ShowLegendKey   *attrValBool `xml:"c:showLegendKey"`
-	ShowVal         *attrValBool `xml:"c:showVal"`
-	ShowCatName     *attrValBool `xml:"c:showCatName"`
-	ShowSerName     *attrValBool `xml:"c:showSerName"`
-	ShowPercent     *attrValBool `xml:"c:showPercent"`
-	ShowBubbleSize  *attrValBool `xml:"c:showBubbleSize"`
-	ShowLeaderLines *attrValBool `xml:"c:showLeaderLines"`
+	ShowLegendKey   *attrValBool `xml:"showLegendKey"`
+	ShowVal         *attrValBool `xml:"showVal"`
+	ShowCatName     *attrValBool `xml:"showCatName"`
+	ShowSerName     *attrValBool `xml:"showSerName"`
+	ShowPercent     *attrValBool `xml:"showPercent"`
+	ShowBubbleSize  *attrValBool `xml:"showBubbleSize"`
+	ShowLeaderLines *attrValBool `xml:"showLeaderLines"`
 }
 
-// cLegend (Legend) directly maps the c:legend element. This element specifies
+// cLegend (Legend) directly maps the legend element. This element specifies
 // the legend.
 type cLegend struct {
-	Layout    *string        `xml:"c:layout"`
-	LegendPos *attrValString `xml:"c:legendPos"`
-	Overlay   *attrValBool   `xml:"c:overlay"`
-	SpPr      *cSpPr         `xml:"c:spPr"`
-	TxPr      *cTxPr         `xml:"c:txPr"`
+	Layout    *string        `xml:"layout"`
+	LegendPos *attrValString `xml:"legendPos"`
+	Overlay   *attrValBool   `xml:"overlay"`
+	SpPr      *cSpPr         `xml:"spPr"`
+	TxPr      *cTxPr         `xml:"txPr"`
 }
 
-// cPrintSettings directly maps the c:printSettings element. This element
+// cPrintSettings directly maps the printSettings element. This element
 // specifies the print settings for the chart.
 type cPrintSettings struct {
-	HeaderFooter *string       `xml:"c:headerFooter"`
-	PageMargins  *cPageMargins `xml:"c:pageMargins"`
-	PageSetup    *string       `xml:"c:pageSetup"`
+	HeaderFooter *string       `xml:"headerFooter"`
+	PageMargins  *cPageMargins `xml:"pageMargins"`
+	PageSetup    *string       `xml:"pageSetup"`
 }
 
-// cPageMargins directly maps the c:pageMargins element. This element specifies
+// cPageMargins directly maps the pageMargins element. This element specifies
 // the page margins for a chart.
 type cPageMargins struct {
 	B      float64 `xml:"b,attr"`

+ 0 - 0
xmlCore.go


+ 0 - 0
xmlDrawing.go


+ 73 - 13
xmlWorksheet.go

@@ -24,6 +24,7 @@ type xlsxWorksheet struct {
 	SheetData             xlsxSheetData                `xml:"sheetData"`
 	SheetProtection       *xlsxSheetProtection         `xml:"sheetProtection"`
 	AutoFilter            *xlsxAutoFilter              `xml:"autoFilter"`
+	CustomSheetViews      *xlsxCustomSheetViews        `xml:"customSheetViews"`
 	MergeCells            *xlsxMergeCells              `xml:"mergeCells"`
 	PhoneticPr            *xlsxPhoneticPr              `xml:"phoneticPr"`
 	ConditionalFormatting []*xlsxConditionalFormatting `xml:"conditionalFormatting"`
@@ -33,6 +34,8 @@ type xlsxWorksheet struct {
 	PageMargins           *xlsxPageMargins             `xml:"pageMargins"`
 	PageSetUp             *xlsxPageSetUp               `xml:"pageSetup"`
 	HeaderFooter          *xlsxHeaderFooter            `xml:"headerFooter"`
+	RowBreaks             *xlsxBreaks                  `xml:"rowBreaks"`
+	ColBreaks             *xlsxBreaks                  `xml:"colBreaks"`
 	Drawing               *xlsxDrawing                 `xml:"drawing"`
 	LegacyDrawing         *xlsxLegacyDrawing           `xml:"legacyDrawing"`
 	Picture               *xlsxPicture                 `xml:"picture"`
@@ -299,6 +302,63 @@ type xlsxRow struct {
 	C            []xlsxC `xml:"c"`
 }
 
+// xlsxCustomSheetViews directly maps the customSheetViews element. This is a
+// collection of custom sheet views.
+type xlsxCustomSheetViews struct {
+	CustomSheetView []*xlsxCustomSheetView `xml:"customSheetView"`
+}
+
+// xlsxBrk directly maps the row or column break to use when paginating a
+// worksheet.
+type xlsxBrk struct {
+	ID  int  `xml:"id,attr,omitempty"`
+	Min int  `xml:"min,attr,omitempty"`
+	Max int  `xml:"max,attr,omitempty"`
+	Man bool `xml:"man,attr,omitempty"`
+	Pt  bool `xml:"pt,attr,omitempty"`
+}
+
+// xlsxBreaks directly maps a collection of the row or column breaks.
+type xlsxBreaks struct {
+	Brk              *xlsxBrk `xml:"brk"`
+	Count            int      `xml:"count,attr,omitempty"`
+	ManualBreakCount int      `xml:"manualBreakCount,attr,omitempty"`
+}
+
+// xlsxCustomSheetView directly maps the customSheetView element.
+type xlsxCustomSheetView struct {
+	Pane           *xlsxPane         `xml:"pane"`
+	Selection      *xlsxSelection    `xml:"selection"`
+	RowBreaks      *xlsxBreaks       `xml:"rowBreaks"`
+	ColBreaks      *xlsxBreaks       `xml:"colBreaks"`
+	PageMargins    *xlsxPageMargins  `xml:"pageMargins"`
+	PrintOptions   *xlsxPrintOptions `xml:"printOptions"`
+	PageSetup      *xlsxPageSetUp    `xml:"pageSetup"`
+	HeaderFooter   *xlsxHeaderFooter `xml:"headerFooter"`
+	AutoFilter     *xlsxAutoFilter   `xml:"autoFilter"`
+	ExtLst         *xlsxExt          `xml:"extLst"`
+	GUID           string            `xml:"guid,attr"`
+	Scale          int               `xml:"scale,attr,omitempty"`
+	ColorID        int               `xml:"colorId,attr,omitempty"`
+	ShowPageBreaks bool              `xml:"showPageBreaks,attr,omitempty"`
+	ShowFormulas   bool              `xml:"showFormulas,attr,omitempty"`
+	ShowGridLines  bool              `xml:"showGridLines,attr,omitempty"`
+	ShowRowCol     bool              `xml:"showRowCol,attr,omitempty"`
+	OutlineSymbols bool              `xml:"outlineSymbols,attr,omitempty"`
+	ZeroValues     bool              `xml:"zeroValues,attr,omitempty"`
+	FitToPage      bool              `xml:"fitToPage,attr,omitempty"`
+	PrintArea      bool              `xml:"printArea,attr,omitempty"`
+	Filter         bool              `xml:"filter,attr,omitempty"`
+	ShowAutoFilter bool              `xml:"showAutoFilter,attr,omitempty"`
+	HiddenRows     bool              `xml:"hiddenRows,attr,omitempty"`
+	HiddenColumns  bool              `xml:"hiddenColumns,attr,omitempty"`
+	State          string            `xml:"state,attr,omitempty"`
+	FilterUnique   bool              `xml:"filterUnique,attr,omitempty"`
+	View           string            `xml:"view,attr,omitempty"`
+	ShowRuler      bool              `xml:"showRuler,attr,omitempty"`
+	TopLeftCell    string            `xml:"topLeftCell,attr,omitempty"`
+}
+
 // xlsxMergeCell directly maps the mergeCell element. A single merged cell.
 type xlsxMergeCell struct {
 	Ref string `xml:"ref,attr,omitempty"`
@@ -389,26 +449,26 @@ type xlsxF struct {
 // enforce when the sheet is protected.
 type xlsxSheetProtection struct {
 	AlgorithmName       string `xml:"algorithmName,attr,omitempty"`
-	AutoFilter          bool   `xml:"autoFilter,attr,omitempty"`
-	DeleteColumns       bool   `xml:"deleteColumns,attr,omitempty"`
-	DeleteRows          bool   `xml:"deleteRows,attr,omitempty"`
+	Password            string `xml:"password,attr,omitempty"`
+	HashValue           string `xml:"hashValue,attr,omitempty"`
+	SaltValue           string `xml:"saltValue,attr,omitempty"`
+	SpinCount           int    `xml:"spinCount,attr,omitempty"`
+	Sheet               bool   `xml:"sheet,attr,omitempty"`
+	Objects             bool   `xml:"objects,attr,omitempty"`
+	Scenarios           bool   `xml:"scenarios,attr,omitempty"`
 	FormatCells         bool   `xml:"formatCells,attr,omitempty"`
 	FormatColumns       bool   `xml:"formatColumns,attr,omitempty"`
 	FormatRows          bool   `xml:"formatRows,attr,omitempty"`
-	HashValue           string `xml:"hashValue,attr,omitempty"`
 	InsertColumns       bool   `xml:"insertColumns,attr,omitempty"`
-	InsertHyperlinks    bool   `xml:"insertHyperlinks,attr,omitempty"`
 	InsertRows          bool   `xml:"insertRows,attr,omitempty"`
-	Objects             bool   `xml:"objects,attr,omitempty"`
-	Password            string `xml:"password,attr,omitempty"`
-	PivotTables         bool   `xml:"pivotTables,attr,omitempty"`
-	SaltValue           string `xml:"saltValue,attr,omitempty"`
-	Scenarios           bool   `xml:"scenarios,attr,omitempty"`
+	InsertHyperlinks    bool   `xml:"insertHyperlinks,attr,omitempty"`
+	DeleteColumns       bool   `xml:"deleteColumns,attr,omitempty"`
+	DeleteRows          bool   `xml:"deleteRows,attr,omitempty"`
 	SelectLockedCells   bool   `xml:"selectLockedCells,attr,omitempty"`
-	SelectUnlockedCells bool   `xml:"selectUnlockedCells,attr,omitempty"`
-	Sheet               bool   `xml:"sheet,attr,omitempty"`
 	Sort                bool   `xml:"sort,attr,omitempty"`
-	SpinCount           int    `xml:"spinCount,attr,omitempty"`
+	AutoFilter          bool   `xml:"autoFilter,attr,omitempty"`
+	PivotTables         bool   `xml:"pivotTables,attr,omitempty"`
+	SelectUnlockedCells bool   `xml:"selectUnlockedCells,attr,omitempty"`
 }
 
 // xlsxPhoneticPr (Phonetic Properties) represents a collection of phonetic