// Copyright 2016 - 2020 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.10 or later. package excelize import "encoding/xml" // 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:"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:"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:"thickness"` SpPr *cSpPr `xml:"spPr"` } // cChart (Chart) directly maps the chart element. This element specifies a // title. type cChart struct { 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:"tx,omitempty"` Layout string `xml:"layout,omitempty"` Overlay *attrValBool `xml:"overlay"` SpPr cSpPr `xml:"spPr,omitempty"` TxPr cTxPr `xml:"txPr,omitempty"` } // 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:"strRef"` Rich *cRich `xml:"rich,omitempty"` } // 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"` LstStyle string `xml:"a:lstStyle,omitempty"` P aP `xml:"a:p"` } // aBodyPr (Body Properties) directly maps the a:bodyPr element. This element // defines the body properties for the text body within a shape. type aBodyPr struct { Anchor string `xml:"anchor,attr,omitempty"` AnchorCtr bool `xml:"anchorCtr,attr"` Rot int `xml:"rot,attr"` BIns float64 `xml:"bIns,attr,omitempty"` CompatLnSpc bool `xml:"compatLnSpc,attr,omitempty"` ForceAA bool `xml:"forceAA,attr,omitempty"` FromWordArt bool `xml:"fromWordArt,attr,omitempty"` HorzOverflow string `xml:"horzOverflow,attr,omitempty"` LIns float64 `xml:"lIns,attr,omitempty"` NumCol int `xml:"numCol,attr,omitempty"` RIns float64 `xml:"rIns,attr,omitempty"` RtlCol bool `xml:"rtlCol,attr,omitempty"` SpcCol int `xml:"spcCol,attr,omitempty"` SpcFirstLastPara bool `xml:"spcFirstLastPara,attr"` TIns float64 `xml:"tIns,attr,omitempty"` Upright bool `xml:"upright,attr,omitempty"` Vert string `xml:"vert,attr,omitempty"` VertOverflow string `xml:"vertOverflow,attr,omitempty"` Wrap string `xml:"wrap,attr,omitempty"` } // aP (Paragraph) directly maps the a:p element. This element specifies a // paragraph of content in the document. type aP struct { PPr *aPPr `xml:"a:pPr"` R *aR `xml:"a:r"` EndParaRPr *aEndParaRPr `xml:"a:endParaRPr"` } // aPPr (Paragraph Properties) directly maps the a:pPr element. This element // specifies a set of paragraph properties which shall be applied to the // contents of the parent paragraph after all style/numbering/table properties // have been applied to the text. These properties are defined as direct // formatting, since they are directly applied to the paragraph and supersede // any formatting from styles. type aPPr struct { DefRPr aRPr `xml:"a:defRPr"` } // aSolidFill (Solid Fill) directly maps the solidFill element. This element // specifies a solid color fill. The shape is filled entirely with the specified // color. type aSolidFill struct { SchemeClr *aSchemeClr `xml:"a:schemeClr"` SrgbClr *attrValString `xml:"a:srgbClr"` } // aSchemeClr (Scheme Color) directly maps the a:schemeClr element. This // element specifies a color bound to a user's theme. As with all elements which // define a color, it is possible to apply a list of color transforms to the // base color defined. type aSchemeClr struct { Val string `xml:"val,attr,omitempty"` LumMod *attrValInt `xml:"a:lumMod"` LumOff *attrValInt `xml:"a:lumOff"` } // attrValInt directly maps the val element with integer data type as an // attribute。 type attrValInt struct { Val *int `xml:"val,attr"` } // attrValFloat directly maps the val element with float64 data type as an // attribute。 type attrValFloat struct { Val *float64 `xml:"val,attr"` } // attrValBool directly maps the val element with boolean data type as an // attribute。 type attrValBool struct { Val *bool `xml:"val,attr"` } // attrValString directly maps the val element with string data type as an // attribute。 type attrValString struct { Val *string `xml:"val,attr"` } // aCs directly maps the a:cs element. type aCs struct { Typeface string `xml:"typeface,attr"` } // aEa directly maps the a:ea element. type aEa struct { Typeface string `xml:"typeface,attr"` } // aLatin (Latin Font) directly maps the a:latin element. This element // specifies that a Latin font be used for a specific run of text. This font is // specified with a typeface attribute much like the others but is specifically // classified as a Latin font. type aLatin struct { Typeface string `xml:"typeface,attr"` } // aR directly maps the a:r element. type aR struct { RPr aRPr `xml:"a:rPr,omitempty"` T string `xml:"a:t,omitempty"` } // 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 // to the run and supersede any formatting from styles. type aRPr struct { AltLang string `xml:"altLang,attr,omitempty"` B bool `xml:"b,attr"` Baseline int `xml:"baseline,attr"` Bmk string `xml:"bmk,attr,omitempty"` Cap string `xml:"cap,attr,omitempty"` Dirty bool `xml:"dirty,attr,omitempty"` Err bool `xml:"err,attr,omitempty"` I bool `xml:"i,attr"` Kern int `xml:"kern,attr"` Kumimoji bool `xml:"kumimoji,attr,omitempty"` Lang string `xml:"lang,attr,omitempty"` NoProof bool `xml:"noProof,attr,omitempty"` NormalizeH bool `xml:"normalizeH,attr,omitempty"` SmtClean bool `xml:"smtClean,attr,omitempty"` SmtID uint64 `xml:"smtId,attr,omitempty"` Spc int `xml:"spc,attr"` Strike string `xml:"strike,attr,omitempty"` Sz float64 `xml:"sz,attr,omitempty"` U string `xml:"u,attr,omitempty"` SolidFill *aSolidFill `xml:"a:solidFill"` Latin *aLatin `xml:"a:latin"` Ea *aEa `xml:"a:ea"` Cs *aCs `xml:"a:cs"` } // 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. type cSpPr struct { NoFill *string `xml:"a:noFill"` SolidFill *aSolidFill `xml:"a:solidFill"` Ln *aLn `xml:"a:ln"` Sp3D *aSp3D `xml:"a:sp3d"` EffectLst *string `xml:"a:effectLst"` } // aSp3D (3-D Shape Properties) directly maps the a:sp3d element. This element // defines the 3D properties associated with a particular shape in DrawingML. // The 3D properties which can be applied to a shape are top and bottom bevels, // a contour and an extrusion. type aSp3D struct { ContourW int `xml:"contourW,attr"` ContourClr *aContourClr `xml:"a:contourClr"` } // aContourClr (Contour Color) directly maps the a:contourClr element. This // element defines the color for the contour on a shape. The contour of a shape // is a solid filled line which surrounds the outer edges of the shape. type aContourClr struct { SchemeClr *aSchemeClr `xml:"a:schemeClr"` } // aLn (Outline) directly maps the a:ln element. This element specifies an // outline style that can be applied to a number of different objects such as // shapes and text. The line allows for the specifying of many different types // of outlines including even line dashes and bevels. type aLn struct { Algn string `xml:"algn,attr,omitempty"` Cap string `xml:"cap,attr,omitempty"` Cmpd string `xml:"cmpd,attr,omitempty"` W int `xml:"w,attr,omitempty"` NoFill string `xml:"a:noFill,omitempty"` Round string `xml:"a:round,omitempty"` SolidFill *aSolidFill `xml:"a:solidFill"` } // 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"` LstStyle string `xml:"a:lstStyle,omitempty"` P aP `xml:"a:p,omitempty"` } // aEndParaRPr (End Paragraph Run Properties) directly maps the a:endParaRPr // element. This element specifies the text run properties that are to be used // if another run is inserted after the last run specified. This effectively // saves the run property state so that it can be applied when the user enters // additional text. If this element is omitted, then the application can // determine which default properties to apply. It is recommended that this // element be specified at the end of the list of text runs within the paragraph // so that an orderly list is maintained. type aEndParaRPr struct { Lang string `xml:"lang,attr"` AltLang string `xml:"altLang,attr,omitempty"` Sz int `xml:"sz,attr,omitempty"` } // cAutoTitleDeleted (Auto Title Is Deleted) directly maps the // 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 view3D element. This element // specifies the 3-D view of the chart. type cView3D struct { RotX *attrValInt `xml:"rotX"` RotY *attrValInt `xml:"rotY"` RAngAx *attrValInt `xml:"rAngAx"` DepthPercent *attrValInt `xml:"depthPercent"` Perspective *attrValInt `xml:"perspective"` ExtLst *xlsxExtLst `xml:"extLst"` } // cPlotArea directly maps the plotArea element. This element specifies the // plot area of the chart. type cPlotArea struct { Layout *string `xml:"layout"` AreaChart *cCharts `xml:"areaChart"` Area3DChart *cCharts `xml:"area3DChart"` BarChart *cCharts `xml:"barChart"` Bar3DChart *cCharts `xml:"bar3DChart"` BubbleChart *cCharts `xml:"bubbleChart"` DoughnutChart *cCharts `xml:"doughnutChart"` LineChart *cCharts `xml:"lineChart"` PieChart *cCharts `xml:"pieChart"` Pie3DChart *cCharts `xml:"pie3DChart"` RadarChart *cCharts `xml:"radarChart"` ScatterChart *cCharts `xml:"scatterChart"` Surface3DChart *cCharts `xml:"surface3DChart"` SurfaceChart *cCharts `xml:"surfaceChart"` CatAx []*cAxs `xml:"catAx"` ValAx []*cAxs `xml:"valAx"` SerAx []*cAxs `xml:"serAx"` SpPr *cSpPr `xml:"spPr"` } // cCharts specifies the common element of the chart. type cCharts struct { BarDir *attrValString `xml:"barDir"` BubbleScale *attrValFloat `xml:"bubbleScale"` Grouping *attrValString `xml:"grouping"` RadarStyle *attrValString `xml:"radarStyle"` ScatterStyle *attrValString `xml:"scatterStyle"` VaryColors *attrValBool `xml:"varyColors"` Wireframe *attrValBool `xml:"wireframe"` Ser *[]cSer `xml:"ser"` DLbls *cDLbls `xml:"dLbls"` Shape *attrValString `xml:"shape"` 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:"axId"` Scaling *cScaling `xml:"scaling"` Delete *attrValBool `xml:"delete"` AxPos *attrValString `xml:"axPos"` MajorGridlines *cChartLines `xml:"majorGridlines"` MinorGridlines *cChartLines `xml:"minorGridlines"` 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"` MajorUnit *attrValFloat `xml:"majorUnit"` MinorUnit *attrValFloat `xml:"minorUnit"` Auto *attrValBool `xml:"auto"` LblAlgn *attrValString `xml:"lblAlgn"` LblOffset *attrValInt `xml:"lblOffset"` TickLblSkip *attrValInt `xml:"tickLblSkip"` TickMarkSkip *attrValInt `xml:"tickMarkSkip"` NoMultiLvlLbl *attrValBool `xml:"noMultiLvlLbl"` } // cChartLines directly maps the chart lines content model. type cChartLines struct { SpPr *cSpPr `xml:"spPr"` } // cScaling directly maps the scaling element. This element contains // additional axis settings. type cScaling struct { Orientation *attrValString `xml:"orientation"` Max *attrValFloat `xml:"max"` Min *attrValFloat `xml:"min"` } // 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 ser element. This element specifies a series on a // chart. type cSer struct { 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"` BubbleSize *cVal `xml:"bubbleSize"` Bubble3D *attrValBool `xml:"bubble3D"` } // cMarker (Marker) directly maps the marker element. This element specifies a // data marker. type cMarker struct { Symbol *attrValString `xml:"symbol"` Size *attrValInt `xml:"size"` SpPr *cSpPr `xml:"spPr"` } // cDPt (Data Point) directly maps the dPt element. This element specifies a // single data point. type cDPt struct { IDx *attrValInt `xml:"idx"` Bubble3D *attrValBool `xml:"bubble3D"` SpPr *cSpPr `xml:"spPr"` } // 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:"strRef"` } // 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:"f"` StrCache *cStrCache `xml:"strCache"` } // 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:"pt"` PtCount *attrValInt `xml:"ptCount"` } // 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:"v"` } // 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:"numRef"` } // 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:"f"` NumCache *cNumCache `xml:"numCache"` } // 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:"formatCode"` Pt []*cPt `xml:"pt"` PtCount *attrValInt `xml:"ptCount"` } // 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:"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 legend element. This element specifies // the legend. type cLegend struct { Layout *string `xml:"layout"` LegendPos *attrValString `xml:"legendPos"` Overlay *attrValBool `xml:"overlay"` SpPr *cSpPr `xml:"spPr"` TxPr *cTxPr `xml:"txPr"` } // cPrintSettings directly maps the printSettings element. This element // specifies the print settings for the chart. type cPrintSettings struct { HeaderFooter *string `xml:"headerFooter"` PageMargins *cPageMargins `xml:"pageMargins"` PageSetup *string `xml:"pageSetup"` } // cPageMargins directly maps the pageMargins element. This element specifies // the page margins for a chart. type cPageMargins struct { B float64 `xml:"b,attr"` Footer float64 `xml:"footer,attr"` Header float64 `xml:"header,attr"` L float64 `xml:"l,attr"` R float64 `xml:"r,attr"` T float64 `xml:"t,attr"` } // formatChartAxis directly maps the format settings of the chart axis. type formatChartAxis struct { Crossing string `json:"crossing"` MajorGridlines bool `json:"major_grid_lines"` MinorGridlines bool `json:"minor_grid_lines"` MajorTickMark string `json:"major_tick_mark"` MinorTickMark string `json:"minor_tick_mark"` MinorUnitType string `json:"minor_unit_type"` MajorUnit float64 `json:"major_unit"` MajorUnitType string `json:"major_unit_type"` TickLabelSkip int `json:"tick_label_skip"` DisplayUnits string `json:"display_units"` DisplayUnitsVisible bool `json:"display_units_visible"` DateAxis bool `json:"date_axis"` ReverseOrder bool `json:"reverse_order"` Maximum float64 `json:"maximum"` Minimum float64 `json:"minimum"` NumFormat string `json:"num_format"` NumFont struct { Color string `json:"color"` Bold bool `json:"bold"` Italic bool `json:"italic"` Underline bool `json:"underline"` } `json:"num_font"` NameLayout formatLayout `json:"name_layout"` } type formatChartDimension struct { Width int `json:"width"` Height int `json:"height"` } // formatChart directly maps the format settings of the chart. type formatChart struct { Type string `json:"type"` Series []formatChartSeries `json:"series"` Format formatPicture `json:"format"` Dimension formatChartDimension `json:"dimension"` Legend formatChartLegend `json:"legend"` Title formatChartTitle `json:"title"` XAxis formatChartAxis `json:"x_axis"` YAxis formatChartAxis `json:"y_axis"` Chartarea struct { Border struct { None bool `json:"none"` } `json:"border"` Fill struct { Color string `json:"color"` } `json:"fill"` Pattern struct { Pattern string `json:"pattern"` FgColor string `json:"fg_color"` BgColor string `json:"bg_color"` } `json:"pattern"` } `json:"chartarea"` Plotarea struct { ShowBubbleSize bool `json:"show_bubble_size"` ShowCatName bool `json:"show_cat_name"` ShowLeaderLines bool `json:"show_leader_lines"` ShowPercent bool `json:"show_percent"` ShowSerName bool `json:"show_series_name"` ShowVal bool `json:"show_val"` Gradient struct { Colors []string `json:"colors"` } `json:"gradient"` Border struct { Color string `json:"color"` Width int `json:"width"` DashType string `json:"dash_type"` } `json:"border"` Fill struct { Color string `json:"color"` } `json:"fill"` Layout formatLayout `json:"layout"` } `json:"plotarea"` ShowBlanksAs string `json:"show_blanks_as"` ShowHiddenData bool `json:"show_hidden_data"` SetRotation int `json:"set_rotation"` SetHoleSize int `json:"set_hole_size"` } // formatChartLegend directly maps the format settings of the chart legend. type formatChartLegend struct { None bool `json:"none"` DeleteSeries []int `json:"delete_series"` Font formatFont `json:"font"` Layout formatLayout `json:"layout"` Position string `json:"position"` ShowLegendEntry bool `json:"show_legend_entry"` ShowLegendKey bool `json:"show_legend_key"` } // formatChartSeries directly maps the format settings of the chart series. type formatChartSeries struct { Name string `json:"name"` Categories string `json:"categories"` Values string `json:"values"` Line struct { None bool `json:"none"` Color string `json:"color"` Width float64 `json:"width"` } `json:"line"` Marker struct { Type string `json:"type"` Size int `json:"size"` Width float64 `json:"width"` Border struct { Color string `json:"color"` None bool `json:"none"` } `json:"border"` Fill struct { Color string `json:"color"` None bool `json:"none"` } `json:"fill"` } `json:"marker"` } // formatChartTitle directly maps the format settings of the chart title. type formatChartTitle struct { None bool `json:"none"` Name string `json:"name"` Overlay bool `json:"overlay"` Layout formatLayout `json:"layout"` } // formatLayout directly maps the format settings of the element layout. type formatLayout struct { X float64 `json:"x"` Y float64 `json:"y"` Width float64 `json:"width"` Height float64 `json:"height"` }