/* index.d.ts (C) 2015-present SheetJS and contributors */
// TypeScript Version: 2.2
// import * as CFB from "cfb";
// import * as SSF from "ssf";

/** Version string */
export const version: string;

/** Style version string [xlsx-js-style] */
export const style_version: string;

/** SSF Formatter Library */
// export { SSF };
export const SSF: any;

/** CFB Library */
// export { CFB };
export const CFB: any;

/** Set internal `fs` instance */
export function set_fs(fs: any): void;
/** Set internal codepage tables */
export function set_cptable(cptable: any): void;

/** NODE ONLY! Attempts to read filename and parse */
export function readFile(filename: string, opts?: ParsingOptions): WorkBook;
/** Attempts to parse data */
export function read(data: any, opts?: ParsingOptions): WorkBook;
/** Attempts to write or download workbook data to file */
export function writeFile(data: WorkBook, filename: string, opts?: WritingOptions): void;
/** Attempts to write or download workbook data to XLSX file */
export function writeFileXLSX(data: WorkBook, filename: string, opts?: WritingOptions): void;
/** Attempts to write or download workbook data to file asynchronously */
type CBFunc = () => void;
export function writeFileAsync(filename: string, data: WorkBook, opts: WritingOptions | CBFunc, cb?: CBFunc): void;
/** Attempts to write the workbook data */
export function write(data: WorkBook, opts: WritingOptions): any;
/** Attempts to write the workbook data as XLSX */
export function writeXLSX(data: WorkBook, opts: WritingOptions): any;

/** Utility Functions */
export const utils: XLSX$Utils;
/** Stream Utility Functions */
export const stream: StreamUtils;

/** Number Format (either a string or an index to the format table) */
export type NumberFormat = string | number;

/** Worksheet specifier (string, number, worksheet) */
export type WSSpec = string | number | WorkSheet;

/** Range specifier (string or range or cell), single-cell lifted to range */
export type RangeSpec = string | Range | CellAddress;

/** Basic File Properties */
export interface Properties {
	/** Summary tab "Title" */
	Title?: string;
	/** Summary tab "Subject" */
	Subject?: string;
	/** Summary tab "Author" */
	Author?: string;
	/** Summary tab "Manager" */
	Manager?: string;
	/** Summary tab "Company" */
	Company?: string;
	/** Summary tab "Category" */
	Category?: string;
	/** Summary tab "Keywords" */
	Keywords?: string;
	/** Summary tab "Comments" */
	Comments?: string;
	/** Statistics tab "Last saved by" */
	LastAuthor?: string;
	/** Statistics tab "Created" */
	CreatedDate?: Date;
}

/** Other supported properties */
export interface FullProperties extends Properties {
	ModifiedDate?: Date;
	Application?: string;
	AppVersion?: string;
	DocSecurity?: string;
	HyperlinksChanged?: boolean;
	SharedDoc?: boolean;
	LinksUpToDate?: boolean;
	ScaleCrop?: boolean;
	Worksheets?: number;
	SheetNames?: string[];
	ContentStatus?: string;
	LastPrinted?: string;
	Revision?: string | number;
	Version?: string;
	Identifier?: string;
	Language?: string;
}

export interface CommonOptions {
	/**
	 * If true, throw errors when features are not understood
	 * @default false
	 */
	WTF?: boolean;

	/**
	 * When reading a file with VBA macros, expose CFB blob to `vbaraw` field
	 * When writing BIFF8/XLSB/XLSM, reseat `vbaraw` and export to file
	 * @default false
	 */
	bookVBA?: boolean;

	/**
	 * When reading a file, store dates as type d (default is n)
	 * When writing XLSX/XLSM file, use native date (default uses date codes)
	 * @default false
	 */
	cellDates?: boolean;

	/**
	 * Create cell objects for stub cells
	 * @default false
	 */
	sheetStubs?: boolean;

	/**
	 * When reading a file, save style/theme info to the .s field
	 * When writing a file, export style/theme info
	 * @default false
	 */
	cellStyles?: boolean;

	/**
	 * If defined and file is encrypted, use password
	 * @default ''
	 */
	password?: string;
}

export interface DateNFOption {
	/** Use specified date format */
	dateNF?: NumberFormat;
}

export interface UTCOption {
	/**
	 * For plaintext formats, interpret ambiguous datetimes in UTC
	 * If explicitly set to `false`, dates will be parsed in local time.
	 *
	 * The `true` option is consistent with spreadsheet application export.
	 *
	 * @default true
	 */
	UTC?: boolean;
}

export interface DenseOption {
	/** If true, generate dense-mode worksheets */
	dense?: boolean;
}

/** Options for read and readFile */
export interface ParsingOptions extends UTCOption, CommonOptions, DenseOption {
	/** Input data encoding */
	type?: 'base64' | 'binary' | 'buffer' | 'file' | 'array' | 'string';

	/**
	 * Default codepage for legacy files
	 *
	 * This requires encoding support to be loaded.  It is automatically loaded
	 * in `xlsx.full.min.js` and in CommonJS / Extendscript, but an extra step
	 * is required in React / Angular / Webpack ESM deployments.
	 *
	 * Check the relevant guide https://docs.sheetjs.com/docs/getting-started/
	 */
	codepage?: number;

	/**
	 * Save formulae to the .f field
	 * @default true
	 */
	cellFormula?: boolean;

	/**
	 * Parse rich text and save HTML to the .h field
	 * @default true
	 */
	cellHTML?: boolean;

	/**
	 * Save number format string to the .z field
	 * @default false
	 */
	cellNF?: boolean;

	/**
	 * Generate formatted text to the .w field
	 * @default true
	 */
	cellText?: boolean;

	/** Override default date format (code 14) */
	dateNF?: string;

	/** Field Separator ("Delimiter" override) */
	FS?: string;

	/**
	 * If >0, read the first sheetRows rows
	 * @default 0
	 */
	sheetRows?: number;

	/**
	 * If true, parse calculation chains
	 * @default false
	 */
	bookDeps?: boolean;

	/**
	 * If true, add raw files to book object
	 * @default false
	 */
	bookFiles?: boolean;

	/**
	 * If true, only parse enough to get book metadata
	 * @default false
	 */
	bookProps?: boolean;

	/**
	 * If true, only parse enough to get the sheet names
	 * @default false
	 */
	bookSheets?: boolean;

	/** If specified, only parse the specified sheets or sheet names */
	sheets?: number | string | Array<number | string>;

	/** If true, plaintext parsing will not parse values */
	raw?: boolean;

	/** If true, ignore "dimensions" records and guess range using every cell */
	nodim?: boolean;

	/** If true, preserve _xlfn. prefixes in formula function names */
	xlfn?: boolean;

	/**
	 * For single-sheet formats (including CSV), override the worksheet name
	 * @default "Sheet1"
	 */
	sheet?: string;

	PRN?: boolean;
}


/** Options for write and writeFile */
export interface WritingOptions extends CommonOptions {
	/** Output data encoding */
	type?: 'base64' | 'binary' | 'buffer' | 'file' | 'array' | 'string';

	/**
	 * Generate Shared String Table
	 * @default false
	 */
	bookSST?: boolean;

	/**
	 * File format of generated workbook
	 * @default 'xlsx'
	 */
	bookType?: BookType;

	/**
	 * Use ZIP compression for ZIP-based formats
	 * @default false
	 */
	compression?: boolean;

	/** Override theme XML when exporting to XLSX/XLSM/XLSB */
	themeXLSX?: string;

	/**
	 * Suppress "number stored as text" errors in generated files
	 * @default true
	 */
	ignoreEC?: boolean;

	/** Override workbook properties on save */
	Props?: Properties;

	/**
	 * Desired codepage for legacy file formats
	 *
	 * This requires encoding support to be loaded.  It is automatically loaded
	 * in `xlsx.full.min.js` and in CommonJS / Extendscript, but an extra step
	 * is required in React / Angular / Webpack / ESM deployments.
	 *
	 * Check the relevant guide https://docs.sheetjs.com/docs/getting-started/
	 */
	codepage?: number;

	/** Base64 encoding of NUMBERS base for exports */
	numbers?: string;

	/**
	 * For single-sheet formats, export the specified worksheet.
	 *
	 * The property must be a string (sheet name) or number (`SheetNames` index).
	 *
	 * If this option is omitted, the first worksheet will be exported.
	 */
	sheet?: string | number;

	/** Field Separator ("delimiter") for CSV / Text output */
	FS?: string;

	/** Record Separator ("row separator") for CSV / Text output */
	RS?: string;

	/** Skip certain validity checks (NOTE: generated files may not open in Excel) */
	unsafe?: boolean;
}

/** Workbook Object */
export interface WorkBook {
	/**
	 * A dictionary of the worksheets in the workbook.
	 * Use SheetNames to reference these.
	 */
	Sheets: { [sheet: string]: WorkSheet };

	/** Ordered list of the sheet names in the workbook */
	SheetNames: string[];

	/** Standard workbook Properties */
	Props?: FullProperties;

	/** Custom workbook Properties */
	Custprops?: object;

	Workbook?: WBProps;

	vbaraw?: any;

	/** Original file type (when parsed with `read` or `readFile`) */
	bookType?: BookType;
}

export interface SheetProps {
	/** Name of Sheet */
	name?: string;

	/** Sheet Visibility (0=Visible 1=Hidden 2=VeryHidden) */
	Hidden?: 0 | 1 | 2;

	/** Name of Document Module in associated VBA Project */
	CodeName?: string;
}

/** Defined Name Object */
export interface DefinedName {
	/** Name */
	Name: string;

	/** Reference */
	Ref: string;

	/** Scope (undefined for workbook scope) */
	Sheet?: number;

	/** Name comment */
	Comment?: string;
}

/** Workbook-Level Attributes */
export interface WBProps {
	/** Sheet Properties */
	Sheets?: SheetProps[];

	/** Defined Names */
	Names?: DefinedName[];

	/** Workbook Views */
	Views?: WBView[];

	/** Other Workbook Properties */
	WBProps?: WorkbookProperties;
}

/** Workbook View */
export interface WBView {
	/** Right-to-left mode */
	RTL?: boolean;
}

/** Other Workbook Properties */
export interface WorkbookProperties {
	/** Worksheet Epoch (1904 if true, 1900 if false) */
	date1904?: boolean;

	/** Warn or strip personally identifying info on save */
	filterPrivacy?: boolean;

	/** Name of Document Module in associated VBA Project */
	CodeName?: string;
}

/** DBF Field Header */
export interface DBFField {
	/** Original Field Name */
	name?: string;

	/** Field Type */
	type?: string;

	/** Field Length */
	len?: number;

	/** Field Decimal Count */
	dec?: number;
}

/** Column Properties Object */
export interface ColInfo {
	/* --- visibility --- */

	/** if true, the column is hidden */
	hidden?: boolean;

	/* --- column width --- */

	/** width in Excel's "Max Digit Width", width*256 is integral */
	width?: number;

	/** width in screen pixels */
	wpx?: number;

	/** width in "characters" */
	wch?: number;

	/** outline / group level */
	level?: number;

	/** Excel's "Max Digit Width" unit, always integral */
	MDW?: number;

	/** DBF Field Header */
	DBF?: DBFField;
}

/** Row Properties Object */
export interface RowInfo {
	/* --- visibility --- */

	/** if true, the column is hidden */
	hidden?: boolean;

	/* --- row height --- */

	/** height in screen pixels */
	hpx?: number;

	/** height in points */
	hpt?: number;

	/** outline / group level */
	level?: number;
}

/**
 * Write sheet protection properties.
 */
export interface ProtectInfo {
	/**
	 * The password for formats that support password-protected sheets
	 * (XLSX/XLSB/XLS). The writer uses the XOR obfuscation method.
	 */
	password?: string;
	/**
	 * Select locked cells
	 * @default: true
	 */
	selectLockedCells?: boolean;
	/**
	 * Select unlocked cells
	 * @default: true
	 */
	selectUnlockedCells?: boolean;
	/**
	 * Format cells
	 * @default: false
	 */
	formatCells?: boolean;
	/**
	 * Format columns
	 * @default: false
	 */
	formatColumns?: boolean;
	/**
	 * Format rows
	 * @default: false
	 */
	formatRows?: boolean;
	/**
	 * Insert columns
	 * @default: false
	 */
	insertColumns?: boolean;
	/**
	 * Insert rows
	 * @default: false
	 */
	insertRows?: boolean;
	/**
	 * Insert hyperlinks
	 * @default: false
	 */
	insertHyperlinks?: boolean;
	/**
	 * Delete columns
	 * @default: false
	 */
	deleteColumns?: boolean;
	/**
	 * Delete rows
	 * @default: false
	 */
	deleteRows?: boolean;
	/**
	 * Sort
	 * @default: false
	 */
	sort?: boolean;
	/**
	 * Filter
	 * @default: false
	 */
	autoFilter?: boolean;
	/**
	 * Use PivotTable reports
	 * @default: false
	 */
	pivotTables?: boolean;
	/**
	 * Edit objects
	 * @default: true
	 */
	objects?: boolean;
	/**
	 * Edit scenarios
	 * @default: true
	 */
	scenarios?: boolean;
}

/** Page Margins -- see Excel Page Setup .. Margins diagram for explanation */
export interface MarginInfo {
	/** Left side margin (inches) */
	left?: number;
	/** Right side margin (inches) */
	right?: number;
	/** Top side margin (inches) */
	top?: number;
	/** Bottom side margin (inches) */
	bottom?: number;
	/** Header top margin (inches) */
	header?: number;
	/** Footer bottom height (inches) */
	footer?: number;
}
export type SheetType = 'sheet' | 'chart';
export type SheetKeys = string | MarginInfo | SheetType;
/** General object representing a Sheet (worksheet or chartsheet) */
export interface Sheet {
	/**
	 * Sparse-mode store cells with keys corresponding to A1-style address
	 * Dense-mode  store cells in the '!data' key
	 * Special keys start with '!'
	 */
	[cell: string]: CellObject | DenseSheetData | SheetKeys | any;

	/**
	 * Dense-mode worksheets store data in an array of arrays
	 *
	 * Cells are accessed with sheet['!data'][R][C] (where R and C are 0-indexed)
	 */
	'!data'?: DenseSheetData;

	/** Sheet type */
	'!type'?: SheetType;

	/** Sheet Range (A1-style) */
	'!ref'?: string;

	/** Page Margins */
	'!margins'?: MarginInfo;
}
/** General object representing a dense Sheet (worksheet or chartsheet) */
export interface DenseSheet extends Sheet {
	/**
	 * Special keys start with '!'
	 * Dense-mode worksheets store data in the '!data' key
	 */
	[cell: string]: DenseSheetData | SheetKeys | any;

	/**
	 * Dense-mode worksheets store data in an array of arrays
	 *
	 * Cells are accessed with sheet['!data'][R][C] (where R and C are 0-indexed)
	 */
	'!data': DenseSheetData;
}
export type DenseSheetData = ((CellObject|undefined)[]|undefined)[];
/** General object representing a sparse Sheet (worksheet or chartsheet) */
export interface SparseSheet extends Sheet {
	/**
	 * Sparse-mode store cells with keys corresponding to A1-style address
	 * Cells are accessed with sheet[addr]
	 */
	'!data': never;
}


/** AutoFilter properties */
export interface AutoFilterInfo {
	/** Range of the AutoFilter table */
	ref: string;
}

export type WSKeys = SheetKeys | ColInfo[] | RowInfo[] | Range[] | ProtectInfo | AutoFilterInfo;

/** Worksheet Object */
export interface WorkSheet extends Sheet {
	/**
	 * Indexing with a cell address string maps to a cell object
	 * Special keys start with '!'
	 */
	[cell: string]: CellObject | WSKeys | any;

	/** Column Info */
	'!cols'?: ColInfo[];

	/** Row Info */
	'!rows'?: RowInfo[];

	/** Merge Ranges */
	'!merges'?: Range[];

	/** Worksheet Protection info */
	'!protect'?: ProtectInfo;

	/** AutoFilter info */
	'!autofilter'?: AutoFilterInfo;
}
/** Dense Worksheet Object */
export interface DenseWorkSheet extends DenseSheet {}

/**
 * Worksheet Object with CellObject type
 *
 * The normal Worksheet type uses indexer of type `any` -- this enforces CellObject
 */
export interface StrictWS { [addr: string]: CellObject; }

/**
 * The Excel data type for a cell.
 * b Boolean, n Number, e error, s String, d Date, z Stub
 */
export type ExcelDataType = 'b' | 'n' | 'e' | 's' | 'd' | 'z';

/**
 * Type of generated workbook
 * @default 'xlsx'
 */
export type BookType = 'xlsx' | 'xlsm' | 'xlsb' | 'xls' | 'xla' | 'biff8' | 'biff5' | 'biff2' | 'xlml' | 'ods' | 'fods' | 'csv' | 'txt' | 'sylk' | 'slk' | 'html' | 'dif' | 'rtf' | 'prn' | 'eth' | 'dbf' | 'numbers';

/** Comment element */
export interface Comment {
	/** Author of the comment block */
	a?: string;

	/** Plaintext of the comment */
	t: string;

	/** If true, mark the comment as a part of a thread */
	T?: boolean;
}

/** Cell comments */
export interface Comments extends Array<Comment> {
	/** Hide comment by default */
	hidden?: boolean;
}

/** Link object */
export interface Hyperlink {
	/** Target of the link (HREF) */
	Target: string;

	/** Plaintext tooltip to display when mouse is over cell */
	Tooltip?: string;
}

/** Worksheet Cell Object */
export interface CellObject {
	/** The raw value of the cell.  Can be omitted if a formula is specified */
	v?: string | number | boolean | Date;

	/** Formatted text (if applicable) */
	w?: string;

	/**
	 * The Excel Data Type of the cell.
	 * b Boolean, n Number, e Error, s String, d Date, z Empty
	 */
	t: ExcelDataType;

	/** Cell formula (if applicable) */
	f?: string;

	/** Range of enclosing array if formula is array formula (if applicable) */
	F?: string;

	/** If true, cell is a dynamic array formula (for supported file formats) */
	D?: boolean;

	/** Rich text encoding (if applicable) */
	r?: any;

	/** HTML rendering of the rich text (if applicable) */
	h?: string;

	/** Comments associated with the cell */
	c?: Comments;

	/** Number format string associated with the cell (if requested) */
	z?: NumberFormat;

	/** Cell hyperlink object (.Target holds link, .tooltip is tooltip) */
	l?: Hyperlink;

	/** The style/theme of the cell (if applicable) */
	s?: any;
}

/** Simple Cell Address */
export interface CellAddress {
	/** Column number */
	c: number;
	/** Row number */
	r: number;
}

/** Range object (representing ranges like "A1:B2") */
export interface Range {
	/** Starting cell */
	s: CellAddress;
	/** Ending cell */
	e: CellAddress;
}

export interface Sheet2CSVOpts extends DateNFOption {
	/** Field Separator ("delimiter") */
	FS?: string;

	/** Record Separator ("row separator") */
	RS?: string;

	/** Remove trailing field separators in each record */
	strip?: boolean;

	/** Include blank lines in the CSV output */
	blankrows?: boolean;

	/** Skip hidden rows and columns in the CSV output */
	skipHidden?: boolean;

	/** Force quotes around fields */
	forceQuotes?: boolean;

	/** if true, return raw numbers; if false, return formatted numbers */
	rawNumbers?: boolean;
}

export interface OriginOption {
	/** Top-Left cell for operation (CellAddress or A1 string or row) */
	origin?: number | string | CellAddress;
}

export interface Sheet2HTMLOpts {
	/** TABLE element id attribute */
	id?: string;

	/** Add contenteditable to every cell */
	editable?: boolean;

	/** Header HTML */
	header?: string;

	/** Footer HTML */
	footer?: string;
}

export interface Sheet2JSONOpts extends DateNFOption {
	/** Output format */
    header?: "A"|number|string[];

	/** Override worksheet range */
	range?: any;

	/** Include or omit blank lines in the output */
	blankrows?: boolean;

	/** Default value for null/undefined values */
	defval?: any;

	/** if true, return raw data; if false, return formatted text */
	raw?: boolean;

	/** if true, skip hidden rows and columns */
	skipHidden?: boolean;

	/** if true, return raw numbers; if false, return formatted numbers */
	rawNumbers?: boolean;

	/**
	 * If true, return dates whose UTC interpretation is correct
	 * By default, return dates whose local interpretation is correct
	 *
	 * @default false
	 */
	UTC?: boolean;
}

export interface Sheet2FormulaOpts {
	/**
	 * If false, only export cells with formulae.
	 * By default, synthetic formulae are generated for each cell.
	 */
	values?: boolean;
}

export interface UTCDateOption {
	/**
	 * If true, dates are interpreted using the UTC methods
	 * By default, dates are interpreted in the local timezone
	 *
	 * @default false
	 */
	UTC?: boolean;
}

export interface AOA2SheetOpts extends CommonOptions, UTCDateOption, DateNFOption, DenseOption {
	/**
	 * Create cell objects for stub cells
	 * @default false
	 */
	sheetStubs?: boolean;
}

export interface SheetAOAOpts extends AOA2SheetOpts, OriginOption {}

export interface JSON2SheetOpts extends CommonOptions, UTCDateOption, DateNFOption, OriginOption, DenseOption {
	/** Use specified column order */
	header?: string[];

	/** Skip header row in generated sheet */
	skipHeader?: boolean;
}

export interface Table2SheetOpts extends CommonOptions, DateNFOption, OriginOption {
	/** If true, plaintext parsing will not parse values */
	raw?: boolean;

	/**
	 * If >0, read the first sheetRows rows
	 * @default 0
	 */
	sheetRows?: number;

	/** If true, hidden rows and cells will not be parsed */
	display?: boolean;

	/**
	 * Override the worksheet name
	 * @default "Sheet1"
	 */
	sheet?: string;

	/**
	 * If true, interpret date strings as if they are UTC.
	 * By default, date strings are interpreted in the local timezone.
	 *
	 * @default false
	 */
	UTC?: boolean;
}

export interface Table2BookOpts extends Table2SheetOpts {
	/**
	 * Override the worksheet name
	 * @default "Sheet1"
	 */
	sheet?: string;
}

/** General utilities */
export interface XLSX$Utils {
	/* --- Import Functions --- */

	/** Converts an array of arrays of JS data to a worksheet. */
	aoa_to_sheet<T>(data: T[][], opts?: AOA2SheetOpts): WorkSheet;
	aoa_to_sheet(data: any[][], opts?: AOA2SheetOpts): WorkSheet;

	/** Converts an array of JS objects to a worksheet. */
	json_to_sheet<T>(data: T[], opts?: JSON2SheetOpts): WorkSheet;
	json_to_sheet(data: any[], opts?: JSON2SheetOpts): WorkSheet;

	/** BROWSER ONLY! Converts a TABLE DOM element to a worksheet. */
    table_to_sheet(data: any,  opts?: Table2SheetOpts): WorkSheet;
    table_to_book(data: any,  opts?: Table2BookOpts): WorkBook;
	sheet_add_dom(ws: WorkSheet, data: any, opts?: Table2SheetOpts): WorkSheet;

	/* --- Export Functions --- */

	/** Converts a worksheet object to an array of JSON objects */
	sheet_to_json<T>(worksheet: WorkSheet, opts?: Sheet2JSONOpts): T[];
	sheet_to_json(worksheet: WorkSheet, opts?: Sheet2JSONOpts): any[][];
	sheet_to_json(worksheet: WorkSheet, opts?: Sheet2JSONOpts): any[];

	/** Generates delimiter-separated-values output */
	sheet_to_csv(worksheet: WorkSheet, options?: Sheet2CSVOpts): string;

	/** Generates UTF16 Formatted Text */
	sheet_to_txt(worksheet: WorkSheet, options?: Sheet2CSVOpts): string;

	/** Generates HTML */
	sheet_to_html(worksheet: WorkSheet, options?: Sheet2HTMLOpts): string;

	/** Generates a list of the formulae (with value fallbacks) */
	sheet_to_formulae(worksheet: WorkSheet, options?: Sheet2FormulaOpts): string[];

	/* --- Cell Address Utilities --- */

	/** Converts 0-indexed cell address to A1 form */
	encode_cell(cell: CellAddress): string;

	/** Converts 0-indexed row to A1 form */
	encode_row(row: number): string;

	/** Converts 0-indexed column to A1 form */
	encode_col(col: number): string;

	/** Converts 0-indexed range to A1 form */
	encode_range(s: CellAddress, e: CellAddress): string;
	encode_range(r: Range): string;

	/** Converts A1 cell address to 0-indexed form */
	decode_cell(address: string): CellAddress;

	/** Converts A1 row to 0-indexed form */
	decode_row(row: string): number;

	/** Converts A1 column to 0-indexed form */
	decode_col(col: string): number;

	/** Converts A1 range to 0-indexed form */
	decode_range(range: string): Range;

	/** Format cell */
	format_cell(cell: CellObject, v?: any, opts?: any): string;

	/* --- General Utilities --- */

	/** Create a new workbook */
	book_new(ws?: WorkSheet, wsname?: string): WorkBook;

	/** Create a new worksheet */
	sheet_new(opts?: DenseOption): WorkSheet;

	/** Append a worksheet to a workbook, returns new worksheet name */
	book_append_sheet(workbook: WorkBook, worksheet: WorkSheet, name?: string, roll?: boolean): string;

	/** Set sheet visibility (visible/hidden/very hidden) */
    book_set_sheet_visibility(workbook: WorkBook, sheet: number|string, visibility: number): void;

	/** Set number format for a cell */
    cell_set_number_format(cell: CellObject, fmt: string|number): CellObject;

	/** Set hyperlink for a cell */
	cell_set_hyperlink(cell: CellObject, target: string, tooltip?: string): CellObject;

	/** Set internal link for a cell */
	cell_set_internal_link(cell: CellObject, target: string, tooltip?: string): CellObject;

	/** Add comment to a cell */
	cell_add_comment(cell: CellObject, text: string, author?: string): void;

	/** Assign an Array Formula to a range */
    sheet_set_array_formula(ws: WorkSheet, range: Range|string, formula: string, dynamic?: boolean): WorkSheet;

	/** Add an array of arrays of JS data to a worksheet */
	sheet_add_aoa<T>(ws: WorkSheet, data: T[][], opts?: SheetAOAOpts): WorkSheet;
	sheet_add_aoa(ws: WorkSheet, data: any[][], opts?: SheetAOAOpts): WorkSheet;

	/** Add an array of JS objects to a worksheet */
	sheet_add_json(ws: WorkSheet, data: any[], opts?: JSON2SheetOpts): WorkSheet;
	sheet_add_json<T>(ws: WorkSheet, data: T[], opts?: JSON2SheetOpts): WorkSheet;


	consts: XLSX$Consts;
}

export interface XLSX$Consts {
	/* --- Sheet Visibility --- */

	/** Visibility: Visible */
	SHEET_VISIBLE: 0;

	/** Visibility: Hidden */
	SHEET_HIDDEN: 1;

	/** Visibility: Very Hidden */
	SHEET_VERYHIDDEN: 2;
}

export interface StrideOption {
	/** Number of rows to write per step */
	stride?: number;
}

export interface XLMLStreamOpts extends WritingOptions, StrideOption {}

/**
 * Streaming write methods
 *
 * These methods are directly compatible with NodeJS `stream.Readable` API
 *
 * Web Streams (modern browsers) can play nice with NodeJS streams. See the Web
 * Demo at https://docs.sheetjs.com/docs/demos/bigdata/worker#streaming-write
 *
 * NOTE: These methods are not included in the `xlsx.mini.min.js` build!
 */
export interface StreamUtils {
	/** Set `Readable` (for environments that do not support NodeJS Streams) */
	set_readable(Readable: any): void;

	/* --- Worksheet writers --- */

	/** CSV output stream, generate one line at a time */
	to_csv(sheet: WorkSheet, opts?: Sheet2CSVOpts): any;
	/** HTML output stream, generate one line at a time */
	to_html(sheet: WorkSheet, opts?: Sheet2HTMLOpts): any;
	/** JSON object stream, generate one row at a time */
	to_json(sheet: WorkSheet, opts?: Sheet2JSONOpts): any;

	/* --- Workbook writers --- */

	/** XLML output string stream (bookType `xlml`) */
	to_xlml(data: WorkBook, opts?: XLMLStreamOpts): any;
}

/** Style-Color object [xlsx-js-style] */
export interface CellStyleColor {
	/**
	 * RGB color value
	 * @example 'FF0000' // 100% red
	 */
	rgb?: string;
	/**
	 * Theme color index
	 * - optinally, include a `tint` value
	 * - range 0-n
	 * @example 4 // Theme color index 4 ("Blue, Accent 1")
	 */
	theme?: number;
	/**
	 * Theme color tint percent
	 * - only works when used with `theme`
	 * - range: -1.0 to 1.0
	 * @example 0.4 // tint lighter by 40% ("Blue, Accent 1, Lighter 40%")
	 * @example -0.5 // tint darker by 50% ("Blue, Accent 1, Darker 50%")
	 */
	tint?: number;
}

/** Style-border object [xlsx-js-style] */
export type BorderType =
	| "dashDot"
	| "dashDotDot"
	| "dashed"
	| "dotted"
	| "hair"
	| "medium"
	| "mediumDashDot"
	| "mediumDashDotDot"
	| "mediumDashed"
	| "slantDashDot"
	| "thick"
	| "thin";

/** Style object [xlsx-js-style] */
export interface CellStyle {
	alignment?: {
		/**
		 * Horizontal alignment
		 * @default 'left'
		 */
		horizontal?: "left" | "center" | "right";
		/**
		 * Vertical alignment
		 * @default 'bottom'
		 */
		vertical?: "top" | "center" | "bottom";
		/**
		 * Rotate text
		 * - range `0` to `180`
		 * - or `255` // `255` is a special value that aligns vertically
		 * @example 180 // rotated down 180 degrees
		 */
		textRotation?: number;
		/**
		 * Wrap text
		 * @default false
		 */
		wrapText?: boolean;
	};
	border?: {
		top?: { color: CellStyleColor; style?: BorderType };
		bottom?: { color: CellStyleColor; style?: BorderType };
		left?: { color: CellStyleColor; style?: BorderType };
		right?: { color: CellStyleColor; style?: BorderType };
		diagonal?: { color: CellStyleColor; style?: BorderType; diagonalUp?: boolean; diagonalDown?: boolean };
	};
	fill?: {
		/**
		 * background color
		 */
		bgColor?: CellStyleColor;
		/**
		 * foreground color
		 */
		fgColor?: CellStyleColor;
		/**
		 * Fill pattern
		 * - `"none"` prevents fill regardless of color selection
		 * @default 'solid'
		 */
		patternType?: "solid" | "none";
	};
	font?: {
		/**
		 * bold font?
		 * @default false
		 */
		bold?: boolean;
		/**
		 * font color
		 * @example {rgb: 'FF0000'} // red color
		 */
		color?: CellStyleColor;
		/**
		 * italic font?
		 * @default false
		 */
		italic?: boolean;
		/**
		 * font face
		 * @default 'Calibri'
		 */
		name?: string;
		/**
		 * font size (points)
		 * @default 11
		 */
		sz?: number;
		/**
		 * font > effect > strikethrough
		 * @default false
		 */
		strike?: boolean;
		/**
		 * underline font?
		 * @default false
		 */
		underline?: boolean;
		/**
		 * font > effect > subscript/subscript
		 * - values: "subscript" | "superscript"
		 * @default null
		 */
		vertAlign?: "superscript" | "subscript";
	};
	/**
	 * Number format
	 * @example "0" // integer index to built in formats, see StyleBuilder.SSF property                     |
	 * @example "0.00%" // string matching a built-in format, see StyleBuilder.SSF                          |
	 * @example "0.0%" // string specifying a custom format                                                 |
	 * @example "0.00%;\\(0.00%\\);\\-;@" // string specifying a custom format, escaping special characters |
	 * @example "m/dd/yy" // string a date format using Excel's format notation                             |
	 * @default '0'
	 */
	numFmt?: string;
}
