diff --git a/src/xlsx-types.ts b/src/xlsx-types.ts deleted file mode 100644 index f6e3d1c..0000000 --- a/src/xlsx-types.ts +++ /dev/null @@ -1,879 +0,0 @@ -// duplicated from https://deno.land/x/sheetjs@v0.17.0/types/index.d.ts - -export type XLSX = { - /** NODE ONLY! Attempts to read filename and parse */ - readFile: (filename: string, opts?: ParsingOptions) => WorkBook; - /** Attempts to parse data */ - read: (data: any, opts?: ParsingOptions) => WorkBook; - /** Attempts to write or download workbook data to file */ - writeFile: (data: WorkBook, filename: string, opts?: WritingOptions) => any; - /** Attempts to write the workbook data */ - write: (data: WorkBook, opts?: WritingOptions) => any; - /** Utility Functions */ - utils: XLSX$Utils; - /** Stream Utility Functions */ - 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; -} - -/** Options for read and readFile */ -export interface ParsingOptions extends CommonOptions { - /** Input data encoding */ - type?: "base64" | "binary" | "buffer" | "file" | "array" | "string"; - - /** Default codepage */ - 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; - - /** - * 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; - - /** If true, plaintext parsing will not parse values */ - raw?: boolean; - - dense?: 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; - - /** - * Name of Worksheet (for single-sheet formats) - * @default '' - */ - sheet?: string; - - /** - * Use ZIP compression for ZIP-based formats - * @default false - */ - compression?: boolean; - - /** - * Suppress "number stored as text" errors in generated files - * @default true - */ - ignoreEC?: boolean; - - /** Override workbook properties on save */ - Props?: Properties; -} - -/** 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; -} - -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; -} - -/** 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; - - /** Excel's "Max Digit Width" unit, always integral */ - MDW?: number; -} - -/** 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 { - /** - * Indexing with a cell address string maps to a cell object - * Special keys start with '!' - */ - [cell: string]: CellObject | SheetKeys | any; - - /** Sheet type */ - "!type"?: SheetType; - - /** Sheet Range */ - "!ref"?: string; - - /** Page Margins */ - "!margins"?: MarginInfo; -} - -/** 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; -} - -/** - * 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" - | "html" - | "dif" - | "rtf" - | "prn" - | "eth"; - -/** Comment element */ -export interface Comment { - /** Author of the comment block */ - a?: string; - - /** Plaintext of the comment */ - t: string; -} - -/** Cell comments */ -export interface Comments extends Array { - /** 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; - - /** 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, return raw numbers; if false, return formatted numbers */ - rawNumbers?: boolean; -} - -export interface AOA2SheetOpts extends CommonOptions, DateNFOption { - /** - * Create cell objects for stub cells - * @default false - */ - sheetStubs?: boolean; -} - -export interface SheetAOAOpts extends AOA2SheetOpts, OriginOption {} - -export interface JSON2SheetOpts extends CommonOptions, DateNFOption { - /** Use specified column order */ - header?: string[]; - - /** Skip header row in generated sheet */ - skipHeader?: boolean; -} - -export interface SheetJSONOpts extends JSON2SheetOpts, OriginOption {} - -export interface Table2SheetOpts extends CommonOptions, DateNFOption { - /** 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; -} - -/** General utilities */ -export interface XLSX$Utils { - /* --- Import Functions --- */ - - /** Converts an array of arrays of JS data to a worksheet. */ - aoa_to_sheet(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(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?: Table2SheetOpts): 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(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): string[]; - - /** Generates DIF */ - sheet_to_dif(worksheet: WorkSheet, options?: Sheet2HTMLOpts): string; - - /** Generates SYLK (Symbolic Link) */ - sheet_to_slk(worksheet: WorkSheet, options?: Sheet2HTMLOpts): string; - - /** Generates ETH */ - sheet_to_eth(worksheet: WorkSheet, options?: Sheet2HTMLOpts): 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 --- */ - - /** Creates a new workbook */ - book_new(): WorkBook; - - /** Append a worksheet to a workbook */ - book_append_sheet( - workbook: WorkBook, - worksheet: WorkSheet, - name?: string - ): void; - - /** 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 - ): WorkSheet; - - /** Add an array of arrays of JS data to a worksheet */ - sheet_add_aoa(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?: SheetJSONOpts): WorkSheet; - sheet_add_json(ws: WorkSheet, data: T[], opts?: SheetJSONOpts): 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; -} - -/** NODE ONLY! these return Readable Streams */ -export interface StreamUtils { - /** 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; -} diff --git a/src/xlsx.ts b/src/xlsx.ts index 5521085..8820166 100644 --- a/src/xlsx.ts +++ b/src/xlsx.ts @@ -1,14 +1,14 @@ -import xlsxlib from 'https://jspm.dev/xlsx@0.17.4' -import { XLSX } from "./xlsx-types.ts"; -const xlsx = xlsxlib as XLSX; +// @deno-types="https://deno.land/x/sheetjs/types/index.d.ts" +import * as xlsx from 'https://deno.land/x/sheetjs@v0.18.3/xlsx.mjs'; +import * as cptable from 'https://deno.land/x/sheetjs@v0.18.3/dist/cpexcel.full.mjs'; +xlsx.set_cptable(cptable); // read more about the library here: https://github.com/SheetJS/sheetjs - -export { xlsx } // export the right types for this lib +export { xlsx } // returns a Workbook export async function readXLSX(path: string) { - const rawText = await Deno.readFile(path) - const workbook = await xlsx.read(rawText, { type: 'buffer' }) + const data = await Deno.readFile(path) + const workbook = xlsx.read(data) return workbook } \ No newline at end of file diff --git a/tests/image-test.ts b/tests/image-test.ts index 982d986..f30ad8a 100644 --- a/tests/image-test.ts +++ b/tests/image-test.ts @@ -1,9 +1,10 @@ import { assertEquals } from "https://deno.land/std@0.92.0/testing/asserts.ts" import { readImageFromURL } from '../src/image.ts' -const url = 'https://api.creativecommons.engineering/v1/thumbs/c8fe5f5b-cc1a-4794-91c5-7488c60f4914' +const url = 'https://sheetjs.com/sketch128.png' Deno.test("loads an image", async () => { const image = await readImageFromURL(url) - assertEquals(image.bytes.length, 76507) + assertEquals(image.bytes.length, 23325) + assertEquals(image.name, 'sketch128.png') }) \ No newline at end of file diff --git a/tests/xlsx-test.ts b/tests/xlsx-test.ts index 6caf8a7..e807b1a 100644 --- a/tests/xlsx-test.ts +++ b/tests/xlsx-test.ts @@ -7,7 +7,7 @@ Deno.test("xlsx library contains keys and functions", () => { assertEquals(typeof xlsx.utils.sheet_to_csv, "function") }) -Deno.test("unzips a folder", async () => { +Deno.test("reads a XLSX file", async () => { const workbook = await readXLSX(xlsxReadPath) const sheetData = workbook.Sheets[workbook.SheetNames[0]] const csvString = await xlsx.utils.sheet_to_csv(sheetData)