We are pleased to announce the release of version 2.7.0. Featured are a handful of new areas of functionality and numerous bug fixes.
A summary of changes is available in the [Release Notes](https://github.com/xuri/excelize/releases/tag/v2.7.0). A full list of changes is available in the [changelog](https://github.com/xuri/excelize/compare/v2.6.1...v2.7.0).
Release Notes
------------
The most notable changes in this release are:
Breaking Change
* Upgrade requirements Go language version is 1.16 or later, for migration of deprecation package `ioutil`
* Checking and return error for invalid sheet name instead of trim invalid characters
* The `GetCellStyle` function no longer return master cell style of the merge cell range
* Rename 5 exported data types and error constant:
* Rename `PivotTableOption` to `PivotTableOptions`
* Rename `FormatHeaderFooter` to `HeaderFooterOptions`
* Rename `FormatSheetProtection` to `SheetProtectionOptions`
* Rename `SparklineOption` to `SparklineOptions`
* Rename `ErrExistsWorksheet` to `ErrExistsSheet`
* Remove 54 exported types: `AutoPageBreaks`, `BaseColWidth`, `BlackAndWhite`, `CodeName`, `CustomHeight`, `Date1904`, `DefaultColWidth`, `DefaultGridColor`, `DefaultRowHeight`, `EnableFormatConditionsCalculation`, `FilterPrivacy`, `FirstPageNumber`, `FitToHeight`, `FitToPage`, `FitToWidth`, `OutlineSummaryBelow`, `PageLayoutOption`, `PageLayoutOptionPtr`, `PageLayoutOrientation`, `PageLayoutPaperSize`, `PageLayoutScale`, `PageMarginBottom`, `PageMarginFooter`, `PageMarginHeader`, `PageMarginLeft`, `PageMarginRight`, `PageMarginsOptions`, `PageMarginsOptionsPtr`, `PageMarginTop`, `Published`, `RightToLeft`, `SheetFormatPrOptions`, `SheetFormatPrOptionsPtr`, `SheetPrOption`, `SheetPrOptionPtr`, `SheetViewOption`, `SheetViewOptionPtr`, `ShowFormulas`, `ShowGridLines`, `ShowRowColHeaders`, `ShowRuler`, `ShowZeros`, `TabColorIndexed`, `TabColorRGB`, `TabColorTheme`, `TabColorTint`, `ThickBottom`, `ThickTop`, `TopLeftCell`, `View`, `WorkbookPrOption`, `WorkbookPrOptionPtr`, `ZeroHeight` and `ZoomScale`
* Remove 2 exported constants: `OrientationPortrait` and `OrientationLandscape`
* Change 21 functions signature:
* Change the `func (f *File) SetPageLayout(sheet string, opts ...PageLayoutOption) error` to `func (f *File) SetPageLayout(sheet string, opts *PageLayoutOptions) error`
* Change the `func (f *File) GetPageLayout(sheet string, opts ...PageLayoutOptionPtr) error` to `func (f *File) GetPageLayout(sheet string) (PageLayoutOptions, error)`
* Change the `func (f *File) SetPageMargins(sheet string, opts ...PageMarginsOptions) error` to `func (f *File) SetPageMargins(sheet string, opts *PageLayoutMarginsOptions) error`
* Change the `func (f *File) GetPageMargins(sheet string, opts ...PageMarginsOptionsPtr) error` to `func (f *File) GetPageMargins(sheet string) (PageLayoutMarginsOptions, error)`
* Change the `func (f *File) GetSheetIndex(sheet string) int` to `func (f *File) GetSheetIndex(sheet string) (int, error)`
* Change the `func (f *File) SetSheetName(source, target string)` to `func (f *File) SetSheetName(source, target string) error`
* Change the `func (f *File) GetSheetVisible(sheet string) bool` to `func (f *File) GetSheetVisible(sheet string) (bool, error)`
* Change the `func (f *File) DeleteSheet(sheet string)` to `func (f *File) DeleteSheet(sheet string) error`
* Change the `func (f *File) NewSheet(sheet string) int` to `func (f *File) NewSheet(sheet string) (int, error)`
* Change the `func (f *File) NewConditionalStyle(style string) (int, error)` to `func (f *File) NewConditionalStyle(style *Style) (int, error)`
* Change the `func (f *File) NewStyle(style interface{}) (int, error)` to `func (f *File) NewStyle(style *Style) (int, error)`
* Change the `func (f *File) AddChart(sheet, cell, opts string, combo ...string) error` to `func (f *File) AddChart(sheet, cell string, chart *ChartOptions, combo ...*ChartOptions) error`
* Change the `func (f *File) AddChartSheet(sheet, opts string, combo ...string) error` to `func (f *File) AddChartSheet(sheet string, chart *ChartOptions, combo ...*ChartOptions) error`
* Change the `func (f *File) AddShape(sheet, cell, opts string) error` to `func (f *File) AddShape(sheet, cell string, opts *Shape) error`
* Change the `func (f *File) AddPicture(sheet, cell, picture, format string) error` to `func (f *File) AddPicture(sheet, cell, picture string, opts *GraphicOptions) error`
* Change the `func (f *File) AddPictureFromBytes(sheet, cell, opts, name, extension string, file []byte) error` to `func (f *File) AddPictureFromBytes(sheet, cell, name, extension string, file []byte, opts *GraphicOptions) error`
* Change the `func (f *File) AddTable(sheet, hCell, vCell, opts string) error` to `func (f *File) AddTable(sheet, rangeRef string, opts *TableOptions) error`
* Change the `func (sw *StreamWriter) AddTable(hCell, vCell, opts string) error` to `func (sw *StreamWriter) AddTable(rangeRef string, opts *TableOptions) error`
* Change the `func (f *File) AutoFilter(sheet, hCell, vCell, opts string) error` to `func (f *File) AutoFilter(sheet, rangeRef string, opts *AutoFilterOptions) error`
* Change the `func (f *File) SetPanes(sheet, panes string) error` to `func (f *File) SetPanes(sheet string, panes *Panes) error`
* Change the `func (f *File) SetConditionalFormat(sheet, reference, opts string) error` to `func (f *File) SetConditionalFormat(sheet, rangeRef string, opts []ConditionalFormatOptions) error`
* Introduce new function to instead of existing functions:
* Use `SetSheetProps` instead of `SetSheetPrOptions` and `SetSheetFormatPr`
* Use `GetSheetProps` instead of `GetSheetPrOptions` and `GetSheetFormatPr`
* Use `SetSheetView` instead of `SetSheetViewOptions`
* Use `GetSheetView` instead of `GetSheetViewOptions`
* Use `SetWorkbookProps` instead of `SetWorkbookPrOptions`
* Use `GetWorkbookProps` instead of `GetWorkbookPrOptions`
* Use `InsertRows` instead of `InsertRow` for support inserting multiple rows at once
* Use `InsertCols` instead of `InsertCol` for support inserting multiple columns at once
* Add `CellTypeFormula`, `CellTypeInlineString`, `CellTypeSharedString` and remove `CellTypeString` in `CellType` enumeration
* The parameter has been changed for the `AddComment` function, support create rich-text in comments, related issue [1204](https://github.com/xuri/excelize/issues/1204)
* Remove internal error log print, an error will be returned when XML deserialize error, add error return value for the `GetComments`, `GetDefaultFont` and `SetDefaultFont` functions
Notable Features
* Add new functions `GetDataValidations` and `GetConditionalFormats` for get data validations and conditional formats, related issue [827](https://github.com/xuri/excelize/issues/827)
* Add new functions `ProtectWorkbook` and `UnprotectWorkbook` for workbook protection supports
* Add new function `SetSheetCol` for set worksheet column cells, related issue [1247](https://github.com/xuri/excelize/issues/1247)
* Add new function `GetColStyle` for get column styles, related issue [1293](https://github.com/xuri/excelize/issues/1293)
* Add new function `SetSheetBackgroundFromBytes` for set background picture by given image data, related issue [1405](https://github.com/xuri/excelize/issues/1405)
* Add new export variable `IndexedColorMapping`
* Add 20 export types: `AutoFilterListOptions`, `AutoFilterOptions`, `Chart`, `ChartAxis`, `ChartDimension`, `ChartLegend`, `ChartLine`, `ChartMarker`, `ChartPlotArea`, `ChartSeries`, `ChartTitle`, `ConditionalFormatOptions`, `PaneOptions`, `Panes`, `GraphicOptions`, `Shape`, `ShapeColor`, `ShapeLine`, `ShapeParagraph` and `TableOptions`
* New support 2 formula functions: AGGREGATE and SUBTOTAL
* The `Save`, `Write` and `WriteTo` function now accept saving options, related issue [744](https://github.com/xuri/excelize/issues/744)
* The `AddChart` function support specify if smooth line of the line chart, related issue [1290](https://github.com/xuri/excelize/issues/1290)
* The `AddChart` function support set custom line color in the charts, related issue [1345](https://github.com/xuri/excelize/issues/1345)
* The `AddChart` function support custom chart axis font style, related issue [320](https://github.com/xuri/excelize/issues/320)
* The `AddChart` function support create 3D line chart
* The functions `SetColWidth`, `GetColWidth`, `SetColVisible`, `GetColVisible`, `SetColStyle` and `GetColStyle` now support concurrency safe
* An error will be returned when set the not exist style ID, related issue [1323](https://github.com/xuri/excelize/issues/1323)
* An error will be returned when setting the stream row without ascending row numbers, to avoid potential mistakes, related issue [1139](https://github.com/xuri/excelize/issues/1139)
* The stream writer will be apply style in `RowOpts` for each cell, related issue [1354](https://github.com/xuri/excelize/issues/1354)
* The stream writer support to set panes, related issue [1047](https://github.com/xuri/excelize/issues/1047)
* The stream writer support to set inline rich text cell
* The stream writer support to insert the page break
* New 7 exported errors: `ErrUnprotectWorkbook`, `ErrUnprotectWorkbookPassword`, `ErrStreamSetPanes`, `ErrSheetNameBlank`, `ErrSheetNameInvalid`, `ErrSheetNameLength` and `ErrSheetNameSingleQuote` has been added
* Introduce 5 new export data types: `HeaderFooterOptions`, `PageLayoutMarginsOptions`, `PageLayoutOptions`, `SheetPropsOptions`, and `ViewOptions`
* Support to set summary columns to appear to the right of detail in an outline
* Support to set and get font color with theme and tint, related issue [1369](https://github.com/xuri/excelize/issues/1369)
* Support get cell value which contains a date in the ISO 8601 format
* Support set and get font color with indexed color
* Support update column style when inserting or deleting columns
* The workbook `Close` function now support cleanup stream writer temporary files
* The `AddPicture` function now allowing insert SVG format images
Improve the Compatibility
* Stream writer writes inline string type for string cell value, related issue [1377](https://github.com/xuri/excelize/issues/1377)
* Skip empty rows when saving the spreadsheet to reduce file size, related issue [1383](https://github.com/xuri/excelize/issues/1383)
Bug Fixes
* Fix decimal number format round issue with build-in number format, resolve issue [1328](https://github.com/xuri/excelize/issues/1328), [#1368](https://github.com/xuri/excelize/issues/1368) and [#1373](https://github.com/xuri/excelize/issues/1373)
* Fix apply AM/PM number format issue in some case, resolve issue [1338](https://github.com/xuri/excelize/issues/1338)
* Fix the panic when delete comments caused by slice bounds out of range, resolve issue [1343](https://github.com/xuri/excelize/issues/1343)
* Fix the panic when get cell value in some case, resolve issue [1384](https://github.com/xuri/excelize/issues/1384) and [#1415](https://github.com/xuri/excelize/issues/1415)
* Fix default number format parse issue with a long string of digits, resolve issue [1360](https://github.com/xuri/excelize/issues/1360)
* Fix creating a sheet with an empty name cause a corrupted file, resolve issue [1361](https://github.com/xuri/excelize/issues/1361)
* Fix get image content was empty after inserting image
* Fix generate workbook corruption after insert columns/rows in some case
* Delete shared formula in calc chain when writing a formula cell, to fix generate workbook corruption in some case
* Normalize the sheet name to fix behavior regression between 2.6.0 & 2.6.1, resolve issue [1365](https://github.com/xuri/excelize/issues/1365)
* Fix the formula calculation result issue of the `OR` function
* Fix error on inserting columns or rows on the worksheet which contains one cell merged cell range
* Fix error on getting the range of merged cells on the worksheet which contains one cell merged cell range
* Fix getting incomplete rich text cell value in some cases
* Escape XML characters for stream writer to avoid with corrupt file, resolve issue [1391](https://github.com/xuri/excelize/issues/1391)
* Fix formula function ADDRESS result error with empty worksheet name, resolve issue [1396](https://github.com/xuri/excelize/issues/1396)
* Fix insert picture problem in some cases, resolve issue [1404](https://github.com/xuri/excelize/issues/1404)
Performance
* Improve performance for stream writer merging cells, time cost decrease over 90% and reduce memory usage by about 86% at most
* Improving performance for stream writer `SetRow` function, reduces memory usage over and speedup about 19%
Miscellaneous
* The dependencies module has been updated
* Unit tests and godoc updated
* Using the specialized name in variables and functions
* [Documentation website](https://xuri.me/excelize) with multilingual: Arabic, German, Spanish, English, French, Russian, Chinese, Japanese, and Korean, which has been updated
Thank you
Thanks for all the contributors to Excelize. Below is a list of contributors that have code contributions in this version:
* cdenicola (Cooper de Nicola)
* chenliu1993
* davidborry
* patsak (Kostya Privezentsev)
* dafengge0913
* Beeb0p (Artem Tarasenko)
* invzhi
* zhangzitao (Zitao)
* jtwatson (Joseph Watson)
* carbin-gun (charles.deng)
* harrison3000 (Harrison)
* strivek (GaoFei)
* gonghaibinx
* martinmr (Martin Martinez Rivera)
* zclark (Zach Clark)
* March0715 (March)
* renxiaotu
* devloppper
* jianxinhou
* nesstord
* Bayzet (Bayzet Tlyupov)
* guoweikuang (郭伟匡)
* qinyuguang (Gin)
* liron-l (Liron Levin)