@sheetxl/models
Version:
Models - A Headless javascript spreadsheet library.
1,049 lines (1,048 loc) • 37.4 kB
TypeScript
import { RemoveListener, CartesianDirection, Bounds, CellCoords, CellRangeCoords, SetOptions, EditMode } from "@sheetxl/common";
import { TransactionStore, ITransactionStack } from "../transaction";
import { SerializableProperties } from "../primitives";
import { AdjustedColor } from "../color";
import { IListenerSource } from "../listener";
import { CellRangeCoordsAddress, MergeType, ClearType, RangeSortOptions, AutoFillRange, RangeAutoFillOptions, ICellRange, SetCellOptions, CellUpdateValue, CellJSON, CellCoordsAddress, CellAddressValuePair, CoordsValuePair, ModificationVerifier, CellUpdate, CellVisitor, CellVisitorOptions, AutoFitOptions, OverflowedCell, CopyCellsOptions, RangeUpdateValue, IRowHeader, IColumnHeader, RowHeaderJSON, ColumnHeaderJSON, RowHeaderUpdate, ColumnHeaderUpdate, ICellHeader, CellHeaderVisitor, CellHeaderVisitorOptions, ICellModel, ISheetStyle, SheetStyleJSON } from "../cell";
import { IDrawingModel, IDrawingContainer, DrawingAnchorJSON, IDrawingImageModel, AddDrawingImageOptions, DrawingContainerEvent } from "../drawing";
import { ITableModel, TableModelValues, UpdateTableModelOptions } from "../table";
import { ISheetView, ISheetViewListener, CellSelection } from "./ISheetView";
import { ISheetHeadersModel, SetHeaderOptions } from "./ISheetHeadersModel";
import { ISharedResourceCollection, SharedResourceJSON, AddSharedResourceOptions, ISharedResource } from "../resource";
/** @hidden */
export declare const MESSAGE_ERROR_PROTECTION = "This sheet is protected. To make a change, unprotect the sheet. You might be requested to enter a password.";
/** @hidden */
export declare const MESSAGE_ERROR_OOB = "The range is outside of the sheet bounds.";
/**
* Used when the ISheetRange arguments want to be used as a single parameter. The
* notable use-case is in the WorkbookConstructor
*/
export interface ISheetRangeUpdate {
/**
* The values to update. These can spill outside of the range.
* If they are smaller than the range they will be repeated.
*/
values: RangeUpdateValue;
/**
* Additional options see @SetCellOptions
*/
options?: SetCellOptions;
}
/**
* A logically rectangular shape of cells to that can be read
* or operated on.
*/
export interface ISheetRange extends ICellRange {
/**
* Provides a convenient method for setting values with a range of calls.
* @remarks
* If an array is passed the values will be in row-major order and will
* repeat if the range is larger than the array
*/
update(values: RangeUpdateValue, options?: SetCellOptions): void;
/**
* @see {@link ISheetModel.sort}
*/
sort(options?: RangeSortOptions): void;
/**
* @see {@link ISheetModel.clear}
*/
clear(clearType?: ClearType): CellRangeCoords | null;
/**
* @see {@link ISheetModel.merge}
*/
merge(mergeType?: MergeType): CellRangeCoords | null;
/**
* @see {@link ISheetModel.unmerge}
*/
unmerge(): CellRangeCoords | null;
/**
* @see {@link ISheetModel.insertCells}
*/
insertCells(direction?: CartesianDirection.Down | CartesianDirection.Right, options?: SetOptions): void;
/**
* @see {@link ISheetModel.removeCells}
*/
removeCells(direction?: CartesianDirection.Up | CartesianDirection.Left, options?: SetOptions): void;
/**
* @see {@link ISheetModel.hideRows}
*/
hideRows(options?: SetOptions): void;
/**
* @see {@link ISheetModel.hideColumns}
*/
hideColumns(options?: SetOptions): void;
/**
* @see {@link ISheetModel.unhideRows}
*/
unhideRows(options?: SetOptions): void;
/**
* @see {@link ISheetModel.unhideColumns}
*/
unhideColumns(options?: SetOptions): void;
/**
* @see {@link ISheetModel.autoFitRows}
*/
autoFitRows(options?: AutoFitOptions): void;
/**
* @see {@link ISheetModel.autoFitColumns}
*/
autoFitColumns(options?: AutoFitOptions): void;
/**
* @see {@link ISheetModel.autoFitColumns}
*/
autoFit(options?: AutoFitOptions): void;
/**
* Copy current range to a new location
* @See {@link ISheetModel.copyCells}
*/
copyTo(range: ISheetRange, options?: CopyCellsOptions): void;
/**
* Provides a convenient method for setting values with a range of calls.
* @see {@link ISheetHeadersModel.update}
* @remarks
* If an array is passed the values will be in row-major order and will
* repeat if the range is larger than the array
*/
updateColumns(values: ICellHeader | ColumnHeaderUpdate | null, options?: SetHeaderOptions): void;
/**
* Provides a convenient method for updating rows.
* @see {@link ISheetHeadersModel.update}
* @remarks
* If an array is passed the values will be in row-major order and will
* repeat if the range is larger than the array
*/
updateRows(values: ICellHeader | RowHeaderUpdate | null, options?: SetHeaderOptions): void;
/**
* If the range is readonly only.
*/
isReadOnly(): boolean;
/**
* Return the ISheetModel
*/
sheet(): ISheetModel;
/**
* For runtime type identification.
*/
readonly isSheetRange: true;
}
export interface SheetRangeEvent {
/**
* The source of the event
*/
getSheet(): ISheetModel;
/**
* The range that the event is for.
*/
getRange(): ISheetRange;
/**
* The type of event.
*/
readonly trigger: string;
}
/**
* A callback for when a range or sheet has been modified
* @remarks
* A range can be invalid if the rows/columns or sheet have been deleted
*/
export type ISheetRangeListener = (event: SheetRangeEvent) => void;
/**
* Range listeners are used to listen to changes to a range.
*/
export interface RangeListenerOptions {
/**
* Ignore cell updates. This will fire events if the range has
* shifted but will not fire events for cells updates
* @defaultValue false
*/
ignoreCellUpdates?: boolean;
ignoreStyleUpdates?: boolean;
/**
* The actual range can also change due to insert/removes or delete of a sheet.
* Setting absoluteCoords to true will ignore shifts in the range.
* @defaultValue false
*/
absolute?: boolean;
/**
* Range listeners are always part of the transaction stack.
* This means that the range listener will not be called on undo events before
* it was added.
* The within transaction flag will allow the listener to be called on all incremental changes.
*
* This is useful for operations that want to write with the same transaction.
* This has several implications.
* 1. The listener will be fired for all incremental changes during the transaction.
* 2. The range operators can be written too.
* 3. Listeners will not be fired on undo as these are handled by transaction state.
*
* @remarks
* @defaultValue false
*/
withinTransaction?: boolean;
/**
* If true then the listener will be weakly held.
* @defaultValue false
*/
weakly?: boolean;
/**
* Used for undo notification. If provided this will also fire a range event on add.
*/
fromEvent?: SheetRangeEvent;
}
/**
* Sheets may contain complex objects such as tables, drawings, images, listeners or other items.
* These can be copied from one sheet to another via a callback.
*/
export interface CopyableSheetItem {
/**
* Called when the item is copied to a new sheet.
* // TODO - generalize the drawing
*/
copyToSheet(sheet: ISheetModel, range: CellRangeCoords, options?: CopyCellsOptions): void;
/**
* Called on paste
*/
onPaste?(sheet: ISheetModel, sheetView: ISheetView): Promise<void> | void;
/**
* For runtime introspection.
*/
readonly isCopyableSheetItem: true;
/**
* The range that bounds the current item.
*/
range?(): CellRangeCoords;
/**
* Allow items to be copied as text.
*/
toText?(): string;
/**
* Allow items to be copied as html.
*/
toHtml?(): string;
/**
* Allow items to be copied as an image Blob.
*/
toImage?(): Promise<Blob> | Blob;
}
/**
* Useful for when we are not copying from the current sheet.
* This abstraction exists to allow for custom sources such as a clipboard.
*
* @remarks
* There is a default implementation CopySheetSource that can be used
* to copy between sheets.
*/
export interface CopySheetSource {
/**
* The name of a the copy source. Useful for user interactions.
* @remarks
* CopySheetSource uses the sheet name to detect intersections.
*/
name?(): string;
/**
* The source range
*/
rangeFrom(): CellRangeCoords;
/**
* Scan the values of the source range
* @param visitor
* @param options
*/
scanCells(visitor: CellVisitor, options?: CellVisitorOptions): void;
/**
* Scan any rows.
* @param visitor
* @param options
*/
scanRowHeaders?(visitor: CellHeaderVisitor, options?: CellHeaderVisitorOptions): void;
/**
* Scan any columns.
* @param visitor
* @param options
*/
scanColHeaders?(visitor: CellHeaderVisitor, options?: CellHeaderVisitorOptions): void;
/**
* Return copyable items that are not cells.
* @remarks
*/
getCopyableItems?(): CopyableSheetItem[];
/**
* Flag to indicate if the operation is expected to be a cut.
* @defaultValue false
*/
isCut?(): boolean;
/**
* This is called when the copy has read the source
* If copy should not be allowed (for example a read only sheet) then return false
*/
onCopy?(): boolean;
/**
* Notify when the paste operation is complete.
*/
onPaste?(): Promise<boolean> | boolean;
/**
* Notify when the paste operation is cancelled.
*/
onCancel?(): void;
/**
* EditMode
*/
editMode?(): EditMode;
/**
* For runtime introspection.
*/
readonly isCopySheetSource: true;
}
export interface ModifyTableSetOptions extends UpdateTableModelOptions {
clearFormatting?: boolean;
}
/**
* If the SheetProtection is present then everything is readonly.
* Setting any of the attributes allows these types of changes to be done.
*/
export interface SheetProtection {
autoFilter: boolean;
deleteColumns: boolean;
deleteRows: boolean;
formatCells: boolean;
formatColumns: boolean;
formatRows: boolean;
insertColumns: boolean;
insertHyperlinks: boolean;
insertRows: boolean;
objects: boolean;
pivotTables: boolean;
scenarios: boolean;
selectLockedCells: boolean;
selectUnlockedCells: boolean;
sheet: boolean;
sort: boolean;
/**
* If this is specified then a password will be requested to unlock
*/
verifier: ModificationVerifier;
}
export interface RangeProtection {
/**
* Must be unique across all RangeProtections but is not related to the sheet range
*/
name: string;
/**
* The range that is protected
*/
range: CellRangeCoords;
/**
* If this is specified then a password will be requested to unlock
*/
verifier?: ModificationVerifier;
}
export interface SheetModelEvent extends DrawingContainerEvent<ISheetModel> {
}
export declare enum SheetModelListenerType {
/**
* The tab color.
*/
TabColor = "tabColor",
/**
* Convenience method that listens to all changes on the style.
*/
Style = "style",
/**
* If any cell changes
* @remarks
* For specific changes use addRangeListener
*/
Cells = "cells",
/**
* If any merge changes
*/
Merges = "merges",
/**
* If the drawing collections changes.
* @remarks
* This does not notify of the individual drawing changes themselves. For this listen directly to the drawing.
*/
Drawings = "drawings",
/**
* If the row/column sizes have changed
*/
Layout = "layout",
/**
* If any protection changes
*/
Protection = "protection",
/**
* Called when delete is called.
*/
Delete = "delete",
/**
* Called when the sheet is closed
*/
Close = "close"
}
export interface ISheetModelListener extends ISheetViewListener {
/**
* Called when the sheet tab color changes
*/
onTabColorChange?(): void;
/**
* Convenience method that listens to all changes on the style.
*/
onStyleChange?(): void;
/**
* Called when a long running operation is started. This is useful to
* give the user feedback that the operation is still running.
* @remarks
* This must return a function or a promise to a function that can be called when the operation is complete
* This will not always be called as some operations may determine that they would be to 'quick'.
* @param operationName
*/
onOperation?: (operationName: string) => (Promise<() => void>) | (() => void);
/**
* If any cell changes
* @remarks
* For specific changes use addRangeListener
*/
onCellsChange?(): void;
/**
* If any merge changes
*/
onMergesChange?(): void;
/**
* If any drawing changes
*/
onDrawingsChange?(): void;
/**
* If the row/column sizes have changed
*/
onLayoutChange?(): void;
/**
* If any protection changes
*/
onProtectionChange?(): void;
/**
* Called when delete is called.
*/
onDelete?(model: ISheetModel): void;
/**
* Called when the sheet is closed
*/
onClose?(): void;
}
/**
* Options for the replace operation.
*/
export interface ReplaceCellOptions extends SetCellOptions {
findOptions: FindCellOptions;
isReplaceAll?: boolean;
onReplaceText?: (coord: CellCoords, text: string) => void;
}
export declare enum FindCellField {
Formula = "formula",
Value = "value",
Comment = "comment",
Note = "note"
}
/**
* Options for the find operation
*/
export interface FindCellOptions {
/**
* If the search is case sensitive
* @defaultValue false
*/
isMatchCase?: boolean;
isMatchEntireCell?: boolean;
isUseRegex?: boolean;
/**
* Search in reverse order
* @defaultValue false
*/
isReverse?: boolean;
isRowScan?: boolean;
/**
* The cell to start from
* @defaultValue. The next cell after the current selection
*/
from?: CellCoordsAddress;
/**
* The cell to end at
*/
to?: CellCoordsAddress;
/**
* Checks the from cell for a match
* @defaultValue false
*/
includeFrom?: boolean;
/**
* Determine if will wrap back to beginning
* @defaultValue false
*/
disableWrap?: boolean;
fields?: FindCellField[];
/**
* A bounds to limit the find by.
* @defaultValue 'This will use the current range bounds if there is a single bounds. Otherwise it will use the entire sheet'
*/
bounds?: CellRangeCoordsAddress;
/**
* Called on a found results.
* @remarks
* This will break unless an explicit false is returned.
*
*/
onFound?: (pair: CoordsValuePair<ICellModel>) => boolean | void;
}
export declare enum CountCellItemType {
Content = "content",
Style = "style",
Formula = "formula",
Comments = "comments",
Error = "error",
Warnings = "errors"
}
/**
* Goto to the location.
*
* @remarks
* If the updateSelection is false it will only update the selection
* if the current location is not currently in the selection range.
* If preserverAnchor is false the anchor will always reset to the top left.
*
* @param location
* @param updateSelection Update the selection. @defaultValue true
* @param preserveAnchor Keep the anchor in current location. @defaultValue true
*/
export interface GotoOptions {
/**
* The range to goto.
*/
range?: ISheetRange | string;
/**
* If specified then will also attempt to focus the drawing.
*/
drawing?: IDrawingModel;
/**
* If true goto will update the selection.
* @defaultValue true
*/
updateSelection?: boolean;
/**
* If true goto will attempt to preserve the anchor.
* @defaultValue true
*/
preserveAnchor?: boolean;
}
/**
* Interface used to access the SheetModel API.
* When interactive the cells it is advisable to use {@link ISheetRange}
* that is returned from the {@link getRange} method.
* @see {@link getRange} @see {@link ISheetRange}
*/
export interface ISheetModel extends ITransactionStack, IDrawingContainer<ISheetModel>, IListenerSource<SheetModelEvent> {
/**
* Returns an immutable cell from the specified address.
* This can be either a CellCoord or a case insensitive 'a1' style string reference.
* If no address is specified then the current selection is used.
*
* @remarks
* Will never return null.
*
* @param address either a coord or an a1 string
*/
getCell(address?: CellCoordsAddress): ICellModel;
/**
* Set a single value. This is a convenience method that wraps setCellPairs
* to provide a simpler interface. For higher performance use @see {@link setCellPairs} directly.
*
* @remarks
* This operation also runs synchronously.
*/
setCell(address: CellCoordsAddress, value: CellUpdateValue, options?: SetCellOptions): ICellModel;
/**
* Returns a range of cells for the specified range.
* These allow for interaction with the cells.
* If no address is specified then this will use the intersection of the cell
* bounds and the selection bounds.
* @see {@link ISheetRange}
*/
getRange(address?: CellRangeCoordsAddress): ISheetRange;
/**
* Sets a collection of Cells in a single batch/transaction.
*
* This allows for an array of different values to be set as a single update.
* This is useful for non-contiguous updates and greatly improves performance
* over setting individually.
*
* @see {@link CellAddressValuePair}
* @param pairs
*/
setCellPairs(pairs: CellAddressValuePair[], options?: SetCellOptions): void;
/**
* Returns the active address as an A1 style reference
*/
getActiveAddressCoordsA1(): string;
/**
* Return the active address as a cell coord
*/
getActiveAddressCoords(): CellCoords;
/**
* Returns a single value for the found result or null if not found.
* @param options
*/
find(findText: string, options?: FindCellOptions): CoordsValuePair<ICellModel> | null;
/**
* Returns an array of merges that intersect the range coordinates.
*/
getMerges(addresses?: CellRangeCoordsAddress | CellRangeCoordsAddress[]): CellRangeCoords[];
/**
* Merges all cells within the selection ranges.
* If the ranges overlap then this operation will throw an exception
*
* @param addresses list of ranges @defaultValue to current selection
* @param mergeType @defaultValue MergeType.All
* @returns the intersection of all ranges applied
*/
merge(addresses?: CellRangeCoordsAddress | CellRangeCoordsAddress[], mergeType?: MergeType): CellRangeCoords | null;
/**
* UnMerges all cells within the selection ranges.
* If the ranges don't contain merges or the ranges overlap then this operation will throw an exception.
* @param addresses list of ranges @defaultValue to the current selection
* @returns the intersection of all ranges applied
*/
unmerge(addresses?: CellRangeCoordsAddress | CellRangeCoordsAddress[]): CellRangeCoords | null;
/**
* Returns an array of Tables are in the range.
* @remarks
* If no arguments are provided then this will return all tables in the Sheet.
*/
getTables(addresses?: CellRangeCoordsAddress | CellRangeCoordsAddress[], includeHidden?: boolean): ITableModel[];
/**
* Create a table at the given range. If the range is already a table then it will be updated.
* @remarks
*
* If no update is passed in then a default table will be create.
* If a ref is not specified then the range will be used as the ref.
* If a ref is specified then the rowStart of ref must match the range or an error will occur.
*/
upsertTable(address: CellRangeCoordsAddress, update?: SerializableProperties<TableModelValues>, options?: ModifyTableSetOptions): ITableModel;
/**
* Remove any tables within the range.
*
* @param address
*/
removeTables(address?: CellRangeCoordsAddress | CellRangeCoordsAddress[], options?: ModifyTableSetOptions): number;
/**
* Add an image to the current sheet.
* This will return an IDrawingImageModel that can be used to manipulate the image or remove it.
*
* @param image This can be either string to a url, a SharedResource or an AddSharedResourceOptions
* @param options AddDrawingImageOptions
*/
addImage(image: string | ISharedResource | AddSharedResourceOptions, options?: AddDrawingImageOptions): Promise<IDrawingImageModel>;
/**
* Hides the rows for the given ranges.
* If no range is provided the the current selection is used
* @param addresses
*/
hideRows(addresses?: CellRangeCoordsAddress | CellRangeCoordsAddress[], options?: SetOptions): void;
/**
* Hides the columns for the given ranges.
* If no range is provided the the current selection is used
* @param addresses
*/
hideColumns(addresses?: CellRangeCoordsAddress | CellRangeCoordsAddress[], options?: SetOptions): void;
/**
* Unhides the rows for the given ranges.
* If no range is provided the the current selection is used
* @param addresses
*/
unhideRows(addresses?: CellRangeCoordsAddress | CellRangeCoordsAddress[], options?: SetOptions): void;
/**
* Unhides the columns for the given ranges.
* If no range is provided the the current selection is used
* @param addresses
*/
unhideColumns(addresses?: CellRangeCoordsAddress | CellRangeCoordsAddress[], options?: SetOptions): void;
/**
* Adjust the row height to fit the content. If empty then will use the normal style height.
* @param addresses
* @param options
*/
autoFitRows(addresses?: CellRangeCoordsAddress | CellRangeCoordsAddress[], options?: AutoFitOptions): void;
/**
* Adjust the columns width to fit the content. If empty then will use an algo to fit 8.43 characters.
*
* @see {@link https://docs.microsoft.com/en-us/office/troubleshoot/excel/determine-column-widths}
* @param addresses
* @param options
*/
autoFitColumns(addresses?: CellRangeCoordsAddress | CellRangeCoordsAddress[], options?: AutoFitOptions): void;
/**
*Adjusts both the column widths and rows heights to fit the content.
*/
autoFit(addresses?: CellRangeCoordsAddress | CellRangeCoordsAddress[], options?: AutoFitOptions): void;
/**
* Sort the given range.
* @remarks
* The sorting of various data types has a default priority of of boolean > string > number and dates are treated as numbers.
*
* @param address
* @param options @see {@link RangeAutoFillOptions}
*/
sort(address?: CellRangeCoordsAddress, options?: RangeSortOptions): void;
/**
* Given the range extend the cells in a certain direction.
*
* Note - If the range contains merges then the amount must be a 'fill' dimension must a multiple of the initialRange 'fill' dimension.
*
* @param ranges @see {@link AutoFillRange}
* @param direction the direction to fill @see {@link CartesianDirection}
* @param options @see {@link RangeAutoFillOptions}
*
* @return Returns a function that provides the ability to see a setter for a given autofill offset.
* If this is negative then it will return a setter in the opposite of the direction
*/
autoFill(ranges: AutoFillRange[], direction: CartesianDirection, options?: RangeAutoFillOptions): (offset: number) => CellAddressValuePair;
/**
* Will copy cells into the range from the source ranges or from the CopyCellSource
*
* @param destination
* @param source
* @param options
*/
copyCells(destination: CellRangeCoordsAddress | CellRangeCoordsAddress[], source: CellRangeCoordsAddress | CellRangeCoordsAddress[] | CopySheetSource, options?: CopyCellsOptions): void;
/**
* insert cells at the range.
* By default the values will direction in whichever direction the selection shape is smaller.
* For example a selection with a 5 column by 1 row will direction Down (rows).
* Note - This will error if direction data will fall outsize of the max sheet size
*
* @param addresses A string or CellRangeCoords or an array of either.
* @param direction @defaultValue 'based on the selection shape'
*/
insertCells(addresses?: CellRangeCoordsAddress | CellRangeCoordsAddress[], direction?: CartesianDirection.Down | CartesianDirection.Right, options?: SetOptions): void;
/**
* Remove cells at a range.
* This is different than clearing cells in that it direction value up or left.
* @param addresses A string or CellRangeCoords or an array of either.
* @param direction @defaultValue 'based on the selection shape'
*/
removeCells(addresses?: CellRangeCoordsAddress | CellRangeCoordsAddress[], direction?: CartesianDirection.Up | CartesianDirection.Left, options?: SetOptions): void;
/**
* Clear the cells.
*
* @param addresses A string or CellRangeCoords or an array of either.
* @param clearType @defaultValue ClearType.Content
*/
clear(addresses?: CellRangeCoordsAddress | CellRangeCoordsAddress[], clearType?: ClearType): CellRangeCoords | null;
/**
* Returns all overflowed cells with the given range. If a null range is provided then all overflowed calls will be returned.
* @param address A string or CellRangeCoords.
* @param includeHidden defaults to false. If overflowed should also return hidden.
* TODO - This needs to be moved to view since it's dependant on scale
*/
getOverflows(address?: CellRangeCoordsAddress, includeHidden?: boolean): OverflowedCell[];
/**
* Returns the row headers managed by the Sheet.
*/
getRowHeaders(): ISheetHeadersModel<IRowHeader, RowHeaderJSON, RowHeaderUpdate>;
/**
* Returns the column headers managed by the Sheet.
*/
getColumnHeaders(): ISheetHeadersModel<IColumnHeader, ColumnHeaderJSON, ColumnHeaderUpdate>;
/**
* Defaults to null means that there is no customized color
* @defaultValue null
*/
getTabColor(): AdjustedColor;
/**
* See the tab color for the sheet.
* @remarks
* The tab color is not used by the sheet but rather by the workbook.
* @param color The color
*/
setTabColor(color: AdjustedColor | string): void;
/**
* If null then there is no protection
* @defaultValue null
*/
getProtection(): Readonly<SheetProtection> | null;
/**
* Set the protection. This will merge with existing protection.
*
* @remarks Pass null to clear all protections.
* @param protection
*/
setProtection(protection: Partial<SheetProtection> | null): void;
/**
* Returns an array of ProtectedRanges.
*/
getProtectedRanges(addresses?: CellRangeCoordsAddress | CellRangeCoordsAddress[]): RangeProtection[];
/**
* Protect a set of ranges.
*
* @param addresses list of ranges @defaultValue to current selection
* @param rangeProtection @defaultValue Simple protection
* @returns the intersection of all ranges applied
*/
protectRanges(addresses?: CellRangeCoordsAddress | CellRangeCoordsAddress[], rangeProtection?: RangeProtection): CellRangeCoords | null;
/**
* Unprotected all cells within the selection ranges.
* @param addresses list of ranges @defaultValue to the current selection
* @returns the intersection of all ranges applied
*/
unprotectRanges(addresses?: CellRangeCoordsAddress | CellRangeCoordsAddress[], password?: string): CellRangeCoords | null;
/**
* The view specific properties.
*/
getView(): ISheetView;
/**
* Set the view specific properties. This will merge with existing view.
*
* @param view This can not be mull
*/
setView(view: Partial<ISheetView>): void;
/**
* Returns the sheetStyle associated with the sheet.
*/
sheetStyle(): ISheetStyle;
/**
* Returns the current shared resources.
*/
sharedResources(): ISharedResourceCollection;
/**
* Returns the minimum bounds that includes all cell data.
* @remarks
* This is guaranteed to always return at least a single cell.
* This will returns cells that have either styling or a value.
*
* @param includeHeaders include custom headers in sizing. @defaultValue false
* @param includeHidden include cells in hidden headers. @defaultValue false
*/
getCellBounds(includeHeaders?: boolean, includeHidden?: boolean): CellRangeCoords;
/**
* Returns the minimum bounds that includes all cells selections.
*/
getSelectionBounds?(): CellRangeCoords;
/**
* The maximum cell bounds.
*/
getMaxCellRange?(): CellRangeCoords;
/**
* Returns the next coord in a given direction that has a value within the sheet.
* @remarks
* This will skip cells with styling but no value.
*/
findNextBoundary(currentCoords: CellCoords, direction: CartesianDirection, first?: boolean, limit?: number): number;
/**
* Returns a CellRangeCoords that represents the 'closest' contentful data
*/
findRegionBounds(selection?: CellSelection, expandIfSelected?: boolean, alwaysSelectAll?: boolean): CellRangeCoords;
/**
* Returns a list of items that can be copied to another sheet or to the clipboard.
* If null then nothing is returned.
* @param ranges
*/
getCopyableItems(ranges: CellRangeCoords[]): CopyableSheetItem[];
/**
* Returns a list of items for the given types. If no options is provided then it will return
* counts for the select range. If there given address is empty then this will return null.
* @param address
* @param types
*
* The types will be used to filter the results.
* If a number is provided this will be a max number
* If a boolean is provided this will be a statement to include/exclude
* @remarks
* Some uses cases for this are checking for data to delete a sheet, checking for multiple values
* for merges, or displaying stats.
*/
countItems(address?: CellCoordsAddress | CellRangeCoordsAddress, types?: Partial<Record<CountCellItemType, number | boolean>>): Record<CountCellItemType, number> | null;
/**
* Determine if dates should be 1904 instead of 1900 based
*/
is1904DateSystem(): boolean;
/**
* Returns the column width as a font unit. This is used as
* an informative tooltip
* @param pixelWidth
*/
getColumnWidthAsFontUnit(pixelWidth: number): number;
/**
* Returns the absolute bounds of a given address.
* @param address
*/
getBoundsFromRange(address: CellCoordsAddress | CellRangeCoordsAddress): Bounds;
/**
* Returns the ranges for a given bounds
* @param bounds
*/
getRangeFromBounds(bounds: Bounds): CellRangeCoords;
/**
* Creates a cell that is not including at a coordinate but adopts all rendering.
* Useful for previewing values such as tooltip. If the coords are passed it will return
* a disconnect cell update for that value.
*
* @remarks
*
* This does not add to the sheet but provides a standalone ICellModel.
*
* @param update
* @param coords
* @returns a detached ICellModel
*/
createCellTemplate(update: CellUpdate | ICellModel | null, coords?: CellCoords): ICellModel | null;
/**
* Return the empty Cell. useful for quick comparisons.
*/
emptyCell(): ICellModel;
/**
* All for listen to changes to the sheet. To remove listener call the returned function.
* @param listener
* @returns An unsubscribe function
*/
addListener: (listener: ISheetModelListener) => RemoveListener;
/**
* Add a listener for a specific range.
*
* @remarks
* By default insert/remove of headers will alter the range listener. To see the actually bounds
* use the range in the callback.
*
* @param address
* @param listener @see {@link ISheetRangeListener}
* @param options @see {@link RangeListenerOptions}
*
* If the sheet is cleared this will auto remove the listener.
*/
addRangeListener(address: CellRangeCoordsAddress, listener: ISheetRangeListener, options?: RangeListenerOptions): RemoveListener;
/**
* A display name for the sheet.
* @remarks
* This is readonly from the sheet and is set via the container, usually an IWorkbook.
*/
getName(): string;
/**
* This removes from a container if one is in use.
*/
delete(): void;
/**
* Returns a JSON representation of the sheet.
* This can be used with @see {@link fromJSON} to reload or passed
* into the constructor.
*/
toJSON(): Promise<SheetJSON>;
/**
* Load the @see {@link SheetJSON} state into memory. The current state will be lost.
* @param json
*/
fromJSON(json: SheetJSON): void;
/**
* Free all resources associated with the sheet and mark as read-only.
* @remarks
* This is called by workbooks when the workbook is is closed.
* This is different than delete which removes the sheet from the workbook.
* @see {@link ISheetModel.addListener} for closeEvent
*/
close(): void;
/**
* Returns true if the sheet has been closed.
*/
isClosed(): boolean;
/**
* Used for runtime reflection.
*/
readonly isISheetModel: true;
}
/**
* CellsJSON supports basic types too. An empty value is a stub
*/
export type CellsJSON = Record<string, CellsJSONValue>;
export type CellsJSONValue = CellJSON | {} | string | number;
export interface CellsRow {
r: number;
c?: CellsJSON;
}
export interface SheetJSON {
data?: CellsRow[] | undefined;
cols?: ColumnHeaderJSON[];
rows?: RowHeaderJSON[];
style?: SheetStyleJSON;
resources?: SharedResourceJSON[];
merged?: string[];
tables?: SerializableProperties<TableModelValues>[];
drawings?: DrawingAnchorJSON[];
tabColor?: SerializableProperties<AdjustedColor>;
protection?: SerializableProperties<SheetProtection>;
protectedRanges?: SerializableProperties<RangeProtection>[];
view?: SerializableProperties<ISheetView>;
comments?: any;
threadedComments?: any;
}
export interface CellSelectionJSON {
activeCoords?: string;
activeRangeIndex?: number;
ranges?: string[];
}
export interface ICellContainerOptions {
/***
* Set the maxRow size
* @defaultValue 1048576
*/
maxRows?: number;
/***
* Set the maxRow size
* @defaultValue 16384
*/
maxColumns?: number;
/**
* collection of shared styles.
* If not provided then workbook will create it's own.
*/
sheetStyle?: ISheetStyle;
/**
* collection of shared resources.
* If not provided then workbook will create it's own.
*/
sharedResources?: ISharedResourceCollection;
/**
* Determine if dates should be 1904 instead of 1900 based
* @defaultValue false
*/
isDate1904System?: boolean;
/**
* The store for all state changes. This is provided to enable versioning, undo/redo, distributed editing, etc.
* @defaultValue internal
*/
transactionStore?: TransactionStore;
}
/**
* Optional values passed to a sheet
*/
export interface ISheetModelOptions extends ICellContainerOptions {
/**
* A unique identifier used for identifying this sheet during operations (i.e. copy/paste).
* This must be unique for all in-memory instances of a sheet.
*
* Note - it is not saved as part of the persisted model @see {@link SheetJSON}.
* @param uid - unique identifier for in memory operations. If not provided a default one will be used.
*/
uid?: string;
/**
* Callback to provide a sheet with a logical name. This is used
* when a sheet name property is invoked.
* @remarks
* Sheets don't have a name by default but as a convenience we allow
* for the name to be called on a sheet
*/
getName?: (model: ISheetModel) => string | null;
/**
* Callback for delete before the sheet is deleted. If this throws an error then
* the delete will be aborted.
*
* @param model
*/
onBeforeDelete?: (model: ISheetModel) => void;
}
//# sourceMappingURL=ISheetModel.d.ts.map