2024-01-09 20:56:20 +08:00
// Copyright 2016 - 2024 The excelize Authors. All rights reserved. Use of
2019-03-20 15:13:41 +08:00
// this source code is governed by a BSD-style license that can be found in
// the LICENSE file.
//
2022-02-17 00:09:11 +08:00
// Package excelize providing a set of functions that allow you to write to and
// read from XLAM / XLSM / XLSX / XLTM / XLTX files. Supports reading and
// writing spreadsheet documents generated by Microsoft Excel™ 2007 and later.
// Supports complex components by high compatibility, and provided streaming
// API for generating or reading data from a worksheet with huge amounts of
2024-01-18 15:31:43 +08:00
// data. This library needs Go version 1.18 or later.
2019-03-20 15:13:41 +08:00
Huge refactorig for consistent col/row numbering (#356)
* Huge refactorig for consistent col/row numbering
Started from simply changing ToALphaString()/TitleToNumber() logic and related fixes.
But have to go deeper, do fixes, after do related fixes and again and again.
Major improvements:
1. Tests made stronger again (But still be weak).
2. "Empty" returns for incorrect input replaces with panic.
3. Check for correct col/row/cell naming & addressing by default.
4. Removed huge amount of duplicated code.
5. Removed ToALphaString(), TitleToNumber() and it helpers functions at all,
and replaced with SplitCellName(), JoinCellName(), ColumnNameToNumber(), ColumnNumberToName(), CellNameToCoordinates(), CoordinatesToCellName().
6. Minor fixes for internal variable naming for code readability (ex. col, row for input params, colIdx, rowIdx for slice indexes etc).
* Formatting fixes
2019-03-20 00:14:41 +08:00
package excelize
2021-05-10 00:09:24 +08:00
import (
"errors"
"fmt"
)
Huge refactorig for consistent col/row numbering (#356)
* Huge refactorig for consistent col/row numbering
Started from simply changing ToALphaString()/TitleToNumber() logic and related fixes.
But have to go deeper, do fixes, after do related fixes and again and again.
Major improvements:
1. Tests made stronger again (But still be weak).
2. "Empty" returns for incorrect input replaces with panic.
3. Check for correct col/row/cell naming & addressing by default.
4. Removed huge amount of duplicated code.
5. Removed ToALphaString(), TitleToNumber() and it helpers functions at all,
and replaced with SplitCellName(), JoinCellName(), ColumnNameToNumber(), ColumnNumberToName(), CellNameToCoordinates(), CoordinatesToCellName().
6. Minor fixes for internal variable naming for code readability (ex. col, row for input params, colIdx, rowIdx for slice indexes etc).
* Formatting fixes
2019-03-20 00:14:41 +08:00
2023-09-28 08:53:54 +08:00
var (
// ErrAddVBAProject defined the error message on add the VBA project in
// the workbook.
ErrAddVBAProject = errors . New ( "unsupported VBA project" )
// ErrAttrValBool defined the error message on marshal and unmarshal
// boolean type XML attribute.
ErrAttrValBool = errors . New ( "unexpected child of attrValBool" )
// ErrCellCharsLength defined the error message for receiving a cell
// characters length that exceeds the limit.
ErrCellCharsLength = fmt . Errorf ( "cell value must be 0-%d characters" , TotalCellChars )
// ErrCellStyles defined the error message on cell styles exceeds the limit.
ErrCellStyles = fmt . Errorf ( "the cell styles exceeds the %d limit" , MaxCellStyles )
// ErrColumnNumber defined the error message on receive an invalid column
// number.
ErrColumnNumber = fmt . Errorf ( "the column number must be greater than or equal to %d and less than or equal to %d" , MinColumns , MaxColumns )
// ErrColumnWidth defined the error message on receive an invalid column
// width.
ErrColumnWidth = fmt . Errorf ( "the width of the column must be less than or equal to %d characters" , MaxColumnWidth )
// ErrCoordinates defined the error message on invalid coordinates tuples
// length.
ErrCoordinates = errors . New ( "coordinates length must be 4" )
// ErrCustomNumFmt defined the error message on receive the empty custom number format.
ErrCustomNumFmt = errors . New ( "custom number format can not be empty" )
// ErrDataValidationFormulaLength defined the error message for receiving a
// data validation formula length that exceeds the limit.
ErrDataValidationFormulaLength = fmt . Errorf ( "data validation must be 0-%d characters" , MaxFieldLength )
// ErrDataValidationRange defined the error message on set decimal range
// exceeds limit.
ErrDataValidationRange = errors . New ( "data validation range exceeds limit" )
// ErrDefinedNameDuplicate defined the error message on the same name
// already exists on the scope.
ErrDefinedNameDuplicate = errors . New ( "the same name already exists on the scope" )
// ErrDefinedNameScope defined the error message on not found defined name
// in the given scope.
ErrDefinedNameScope = errors . New ( "no defined name on the scope" )
// ErrExistsSheet defined the error message on given sheet already exists.
ErrExistsSheet = errors . New ( "the same name sheet already exists" )
// ErrExistsTableName defined the error message on given table already exists.
ErrExistsTableName = errors . New ( "the same name table already exists" )
// ErrFontLength defined the error message on the length of the font
// family name overflow.
ErrFontLength = fmt . Errorf ( "the length of the font family name must be less than or equal to %d" , MaxFontFamilyLength )
// ErrFontSize defined the error message on the size of the font is invalid.
ErrFontSize = fmt . Errorf ( "font size must be between %d and %d points" , MinFontSize , MaxFontSize )
// ErrFormControlValue defined the error message for receiving a scroll
// value exceeds limit.
ErrFormControlValue = fmt . Errorf ( "scroll value must be between 0 and %d" , MaxFormControlValue )
// ErrGroupSheets defined the error message on group sheets.
ErrGroupSheets = errors . New ( "group worksheet must contain an active worksheet" )
// ErrImgExt defined the error message on receive an unsupported image
// extension.
ErrImgExt = errors . New ( "unsupported image extension" )
// ErrInvalidFormula defined the error message on receive an invalid
// formula.
ErrInvalidFormula = errors . New ( "formula not valid" )
// ErrMaxFilePathLength defined the error message on receive the file path
// length overflow.
ErrMaxFilePathLength = fmt . Errorf ( "file path length exceeds maximum limit %d characters" , MaxFilePathLength )
// ErrMaxRowHeight defined the error message on receive an invalid row
// height.
ErrMaxRowHeight = fmt . Errorf ( "the height of the row must be less than or equal to %d points" , MaxRowHeight )
// ErrMaxRows defined the error message on receive a row number exceeds maximum limit.
ErrMaxRows = errors . New ( "row number exceeds maximum limit" )
// ErrNameLength defined the error message on receiving the defined name or
// table name length exceeds the limit.
ErrNameLength = fmt . Errorf ( "the name length exceeds the %d characters limit" , MaxFieldLength )
// ErrOptionsUnzipSizeLimit defined the error message for receiving
// invalid UnzipSizeLimit and UnzipXMLSizeLimit.
ErrOptionsUnzipSizeLimit = errors . New ( "the value of UnzipSizeLimit should be greater than or equal to UnzipXMLSizeLimit" )
// ErrOutlineLevel defined the error message on receive an invalid outline
// level number.
ErrOutlineLevel = errors . New ( "invalid outline level" )
2024-11-08 16:59:07 +08:00
// ErrPageSetupAdjustTo defined the error message for receiving a page setup
// adjust to value exceeds limit.
ErrPageSetupAdjustTo = errors . New ( "adjust to value must be between 10 and 400" )
2023-09-28 08:53:54 +08:00
// ErrParameterInvalid defined the error message on receive the invalid
// parameter.
ErrParameterInvalid = errors . New ( "parameter is invalid" )
// ErrParameterRequired defined the error message on receive the empty
// parameter.
ErrParameterRequired = errors . New ( "parameter is required" )
// ErrPasswordLengthInvalid defined the error message on invalid password
// length.
ErrPasswordLengthInvalid = errors . New ( "password length invalid" )
2024-09-27 14:58:18 +08:00
// ErrPivotTableClassicLayout defined the error message on enable
// ClassicLayout and CompactData in the same time.
2024-09-21 15:39:36 +08:00
ErrPivotTableClassicLayout = errors . New ( "cannot enable ClassicLayout and CompactData in the same time" )
2023-09-28 08:53:54 +08:00
// ErrSave defined the error message for saving file.
ErrSave = errors . New ( "no path defined for file, consider File.WriteTo or File.Write" )
// ErrSheetIdx defined the error message on receive the invalid worksheet
// index.
ErrSheetIdx = errors . New ( "invalid worksheet index" )
// ErrSheetNameBlank defined the error message on receive the blank sheet
// name.
ErrSheetNameBlank = errors . New ( "the sheet name can not be blank" )
// ErrSheetNameInvalid defined the error message on receive the sheet name
// contains invalid characters.
ErrSheetNameInvalid = errors . New ( "the sheet can not contain any of the characters :\\/?*[or]" )
// ErrSheetNameLength defined the error message on receiving the sheet
// name length exceeds the limit.
ErrSheetNameLength = fmt . Errorf ( "the sheet name length exceeds the %d characters limit" , MaxSheetNameLength )
// ErrSheetNameSingleQuote defined the error message on the first or last
// character of the sheet name was a single quote.
ErrSheetNameSingleQuote = errors . New ( "the first or last character of the sheet name can not be a single quote" )
// ErrSparkline defined the error message on receive the invalid sparkline
// parameters.
ErrSparkline = errors . New ( "must have the same number of 'Location' and 'Range' parameters" )
// ErrSparklineLocation defined the error message on missing Location
// parameters
ErrSparklineLocation = errors . New ( "parameter 'Location' is required" )
// ErrSparklineRange defined the error message on missing sparkline Range
// parameters
ErrSparklineRange = errors . New ( "parameter 'Range' is required" )
// ErrSparklineStyle defined the error message on receive the invalid
// sparkline Style parameters.
ErrSparklineStyle = errors . New ( "parameter 'Style' must between 0-35" )
// ErrSparklineType defined the error message on receive the invalid
// sparkline Type parameters.
ErrSparklineType = errors . New ( "parameter 'Type' must be 'line', 'column' or 'win_loss'" )
// ErrStreamSetColWidth defined the error message on set column width in
// stream writing mode.
ErrStreamSetColWidth = errors . New ( "must call the SetColWidth function before the SetRow function" )
// ErrStreamSetPanes defined the error message on set panes in stream
// writing mode.
ErrStreamSetPanes = errors . New ( "must call the SetPanes function before the SetRow function" )
// ErrTotalSheetHyperlinks defined the error message on hyperlinks count
// overflow.
ErrTotalSheetHyperlinks = errors . New ( "over maximum limit hyperlinks in a worksheet" )
// ErrUnknownEncryptMechanism defined the error message on unsupported
// encryption mechanism.
ErrUnknownEncryptMechanism = errors . New ( "unknown encryption mechanism" )
// ErrUnprotectSheet defined the error message on worksheet has set no
// protection.
ErrUnprotectSheet = errors . New ( "worksheet has set no protect" )
// ErrUnprotectSheetPassword defined the error message on remove sheet
// protection with password verification failed.
ErrUnprotectSheetPassword = errors . New ( "worksheet protect password not match" )
// ErrUnprotectWorkbook defined the error message on workbook has set no
// protection.
ErrUnprotectWorkbook = errors . New ( "workbook has set no protect" )
// ErrUnprotectWorkbookPassword defined the error message on remove workbook
// protection with password verification failed.
ErrUnprotectWorkbookPassword = errors . New ( "workbook protect password not match" )
// ErrUnsupportedEncryptMechanism defined the error message on unsupported
// encryption mechanism.
ErrUnsupportedEncryptMechanism = errors . New ( "unsupported encryption mechanism" )
// ErrUnsupportedHashAlgorithm defined the error message on unsupported
// hash algorithm.
ErrUnsupportedHashAlgorithm = errors . New ( "unsupported hash algorithm" )
// ErrUnsupportedNumberFormat defined the error message on unsupported number format
// expression.
ErrUnsupportedNumberFormat = errors . New ( "unsupported number format token" )
// ErrWorkbookFileFormat defined the error message on receive an
// unsupported workbook file format.
ErrWorkbookFileFormat = errors . New ( "unsupported workbook file format" )
// ErrWorkbookPassword defined the error message on receiving the incorrect
// workbook password.
ErrWorkbookPassword = errors . New ( "the supplied open workbook password is not correct" )
)
// ErrSheetNotExist defined an error of sheet that does not exist.
type ErrSheetNotExist struct {
SheetName string
Huge refactorig for consistent col/row numbering (#356)
* Huge refactorig for consistent col/row numbering
Started from simply changing ToALphaString()/TitleToNumber() logic and related fixes.
But have to go deeper, do fixes, after do related fixes and again and again.
Major improvements:
1. Tests made stronger again (But still be weak).
2. "Empty" returns for incorrect input replaces with panic.
3. Check for correct col/row/cell naming & addressing by default.
4. Removed huge amount of duplicated code.
5. Removed ToALphaString(), TitleToNumber() and it helpers functions at all,
and replaced with SplitCellName(), JoinCellName(), ColumnNameToNumber(), ColumnNumberToName(), CellNameToCoordinates(), CoordinatesToCellName().
6. Minor fixes for internal variable naming for code readability (ex. col, row for input params, colIdx, rowIdx for slice indexes etc).
* Formatting fixes
2019-03-20 00:14:41 +08:00
}
2023-09-28 08:53:54 +08:00
// Error returns the error message on receiving the non existing sheet name.
func ( err ErrSheetNotExist ) Error ( ) string {
return fmt . Sprintf ( "sheet %s does not exist" , err . SheetName )
}
// newCellNameToCoordinatesError defined the error message on converts
// alphanumeric cell name to coordinates.
func newCellNameToCoordinatesError ( cell string , err error ) error {
return fmt . Errorf ( "cannot convert cell %q to coordinates: %v" , cell , err )
}
// newCoordinatesToCellNameError defined the error message on converts [X, Y]
// coordinates to alpha-numeric cell name.
func newCoordinatesToCellNameError ( col , row int ) error {
return fmt . Errorf ( "invalid cell reference [%d, %d]" , col , row )
}
// newFieldLengthError defined the error message on receiving the field length
// overflow.
func newFieldLengthError ( name string ) error {
return fmt . Errorf ( "field %s must be less than or equal to 255 characters" , name )
}
// newInvalidAutoFilterColumnError defined the error message on receiving the
// incorrect index of column.
func newInvalidAutoFilterColumnError ( col string ) error {
return fmt . Errorf ( "incorrect index of column %q" , col )
}
// newInvalidAutoFilterExpError defined the error message on receiving the
// incorrect number of tokens in criteria expression.
func newInvalidAutoFilterExpError ( exp string ) error {
return fmt . Errorf ( "incorrect number of tokens in criteria %q" , exp )
}
// newInvalidAutoFilterOperatorError defined the error message on receiving the
// incorrect expression operator.
func newInvalidAutoFilterOperatorError ( op , exp string ) error {
return fmt . Errorf ( "the operator %q in expression %q is not valid in relation to Blanks/NonBlanks" , op , exp )
Huge refactorig for consistent col/row numbering (#356)
* Huge refactorig for consistent col/row numbering
Started from simply changing ToALphaString()/TitleToNumber() logic and related fixes.
But have to go deeper, do fixes, after do related fixes and again and again.
Major improvements:
1. Tests made stronger again (But still be weak).
2. "Empty" returns for incorrect input replaces with panic.
3. Check for correct col/row/cell naming & addressing by default.
4. Removed huge amount of duplicated code.
5. Removed ToALphaString(), TitleToNumber() and it helpers functions at all,
and replaced with SplitCellName(), JoinCellName(), ColumnNameToNumber(), ColumnNumberToName(), CellNameToCoordinates(), CoordinatesToCellName().
6. Minor fixes for internal variable naming for code readability (ex. col, row for input params, colIdx, rowIdx for slice indexes etc).
* Formatting fixes
2019-03-20 00:14:41 +08:00
}
2022-01-08 10:32:13 +08:00
// newInvalidCellNameError defined the error message on receiving the invalid
// cell name.
Huge refactorig for consistent col/row numbering (#356)
* Huge refactorig for consistent col/row numbering
Started from simply changing ToALphaString()/TitleToNumber() logic and related fixes.
But have to go deeper, do fixes, after do related fixes and again and again.
Major improvements:
1. Tests made stronger again (But still be weak).
2. "Empty" returns for incorrect input replaces with panic.
3. Check for correct col/row/cell naming & addressing by default.
4. Removed huge amount of duplicated code.
5. Removed ToALphaString(), TitleToNumber() and it helpers functions at all,
and replaced with SplitCellName(), JoinCellName(), ColumnNameToNumber(), ColumnNumberToName(), CellNameToCoordinates(), CoordinatesToCellName().
6. Minor fixes for internal variable naming for code readability (ex. col, row for input params, colIdx, rowIdx for slice indexes etc).
* Formatting fixes
2019-03-20 00:14:41 +08:00
func newInvalidCellNameError ( cell string ) error {
return fmt . Errorf ( "invalid cell name %q" , cell )
}
2020-03-03 19:31:02 +08:00
2023-09-28 08:53:54 +08:00
// newInvalidColumnNameError defined the error message on receiving the
// invalid column name.
func newInvalidColumnNameError ( col string ) error {
return fmt . Errorf ( "invalid column name %q" , col )
2023-09-16 12:21:11 +08:00
}
2022-01-08 10:32:13 +08:00
// newInvalidExcelDateError defined the error message on receiving the data
// with negative values.
2020-03-03 19:31:02 +08:00
func newInvalidExcelDateError ( dateValue float64 ) error {
2021-08-15 00:06:40 +08:00
return fmt . Errorf ( "invalid date value %f, negative values are not supported" , dateValue )
2020-03-03 19:31:02 +08:00
}
2021-05-10 00:09:24 +08:00
2023-09-28 08:53:54 +08:00
// newInvalidLinkTypeError defined the error message on receiving the invalid
// hyper link type.
func newInvalidLinkTypeError ( linkType string ) error {
return fmt . Errorf ( "invalid link type %q" , linkType )
}
2023-04-21 08:51:04 +08:00
// newInvalidNameError defined the error message on receiving the invalid
// defined name or table name.
func newInvalidNameError ( name string ) error {
return fmt . Errorf ( "invalid name %q, the name should be starts with a letter or underscore, can not include a space or character, and can not conflict with an existing name in the workbook" , name )
2023-02-13 13:28:02 +08:00
}
2024-11-08 16:59:07 +08:00
// newInvalidPageLayoutValueError defined the error message on receiving the invalid
// page layout options value.
func newInvalidPageLayoutValueError ( name , value , msg string ) error {
return fmt . Errorf ( "invalid %s value %q, acceptable value should be one of %s" , name , value , msg )
}
2023-09-28 08:53:54 +08:00
// newInvalidRowNumberError defined the error message on receiving the invalid
// row number.
func newInvalidRowNumberError ( row int ) error {
return fmt . Errorf ( "invalid row number %d" , row )
2021-07-05 00:03:56 +08:00
}
2023-09-28 08:53:54 +08:00
// newInvalidSlicerNameError defined the error message on receiving the invalid
// slicer name.
func newInvalidSlicerNameError ( name string ) error {
return fmt . Errorf ( "invalid slicer name %q" , name )
2021-08-15 00:06:40 +08:00
}
2022-01-08 10:32:13 +08:00
// newInvalidStyleID defined the error message on receiving the invalid style
// ID.
2021-08-17 00:01:44 +08:00
func newInvalidStyleID ( styleID int ) error {
2022-09-01 00:41:52 +08:00
return fmt . Errorf ( "invalid style ID %d" , styleID )
2021-08-17 00:01:44 +08:00
}
2024-08-23 10:47:47 +08:00
// newNoExistSlicerError defined the error message on receiving the non existing
// slicer name.
func newNoExistSlicerError ( name string ) error {
return fmt . Errorf ( "slicer %s does not exist" , name )
}
2023-08-23 10:51:11 +08:00
// newNoExistTableError defined the error message on receiving the non existing
// table name.
func newNoExistTableError ( name string ) error {
return fmt . Errorf ( "table %s does not exist" , name )
2022-08-19 23:24:13 +08:00
}
// newNotWorksheetError defined the error message on receiving a sheet which
// not a worksheet.
func newNotWorksheetError ( name string ) error {
return fmt . Errorf ( "sheet %s is not a worksheet" , name )
}
2023-09-28 08:53:54 +08:00
// newPivotTableDataRangeError defined the error message on receiving the
// invalid pivot table data range.
func newPivotTableDataRangeError ( msg string ) error {
return fmt . Errorf ( "parameter 'DataRange' parsing error: %s" , msg )
}
// newPivotTableRangeError defined the error message on receiving the invalid
// pivot table range.
func newPivotTableRangeError ( msg string ) error {
return fmt . Errorf ( "parameter 'PivotTableRange' parsing error: %s" , msg )
}
2022-10-20 00:02:30 +08:00
// newStreamSetRowError defined the error message on the stream writer
// receiving the non-ascending row number.
func newStreamSetRowError ( row int ) error {
return fmt . Errorf ( "row %d has already been written" , row )
}
2023-06-08 09:50:38 +08:00
// newUnknownFilterTokenError defined the error message on receiving a unknown
// filter operator token.
func newUnknownFilterTokenError ( token string ) error {
return fmt . Errorf ( "unknown operator: %s" , token )
}
2023-09-28 08:53:54 +08:00
// newUnsupportedChartType defined the error message on receiving the chart
// type are unsupported.
func newUnsupportedChartType ( chartType ChartType ) error {
return fmt . Errorf ( "unsupported chart type %d" , chartType )
}
// newUnzipSizeLimitError defined the error message on unzip size exceeds the
// limit.
func newUnzipSizeLimitError ( unzipSizeLimit int64 ) error {
return fmt . Errorf ( "unzip size exceeds the %d bytes limit" , unzipSizeLimit )
}
// newViewIdxError defined the error message on receiving a invalid sheet view
// index.
func newViewIdxError ( viewIndex int ) error {
return fmt . Errorf ( "view index %d out of range" , viewIndex )
}