json-as-xlsx 2.5.8 → 2.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,13 +1,42 @@
1
1
  # json-as-xlsx
2
2
 
3
- This is a tool that helps to build an excel from a json and it depends only on `xlsx` library
3
+ [![npm version](https://img.shields.io/npm/v/json-as-xlsx.svg)](https://www.npmjs.com/package/json-as-xlsx)
4
+ [![npm downloads](https://img.shields.io/npm/dm/json-as-xlsx.svg)](https://www.npmjs.com/package/json-as-xlsx)
5
+ [![Test suites](https://github.com/LuisEnMarroquin/json-as-xlsx/actions/workflows/tests.yml/badge.svg)](https://github.com/LuisEnMarroquin/json-as-xlsx/actions/workflows/tests.yml)
6
+ [![license](https://img.shields.io/npm/l/json-as-xlsx.svg)](LICENSE)
4
7
 
5
- You can see a live example of it working on any of this sites (there are many just in case):
8
+ Build an Excel (`.xlsx`) file straight from JSON. It is a thin, typed wrapper
9
+ around the SheetJS-compatible [`@e965/xlsx`](https://www.npmjs.com/package/@e965/xlsx)
10
+ library, so it works both in the **browser** (downloads the file) and in
11
+ **Node.js** (can return a buffer when configured).
12
+
13
+ You can see a live demo on any of these sites (there are several, just in case):
6
14
 
7
15
  - [xlsx.pages.dev](https://xlsx.pages.dev)
8
16
  - [xlsx.marroquin.dev](https://xlsx.marroquin.dev)
9
17
  - [xlsx.luismarroquin.com](https://xlsx.luismarroquin.com)
10
18
 
19
+ ## Features
20
+
21
+ - 📊 Turn an array of JSON sheets into a multi-sheet workbook.
22
+ - 🧭 Read deeply nested values (`"more.phone"`) or compute them with a function.
23
+ - 🎨 Per-column number, date, currency and hyperlink formatting.
24
+ - 🖌️ Opt-in cell styling for fonts, fills, borders, alignment and number formats.
25
+ - 📐 Automatic column widths (tunable with `extraLength`).
26
+ - ↔️ Right-to-left (RTL) sheet support.
27
+ - 🌐 Works in the browser (file download) and in Node.js (file or buffer output).
28
+ - 🟦 Written in TypeScript — ships with type definitions.
29
+
30
+ ## Installation
31
+
32
+ ```shell
33
+ npm install json-as-xlsx
34
+ # or
35
+ yarn add json-as-xlsx
36
+ # or
37
+ pnpm add json-as-xlsx
38
+ ```
39
+
11
40
  ## Usage
12
41
 
13
42
  ```js
@@ -17,35 +46,36 @@ let xlsx = require("json-as-xlsx")
17
46
 
18
47
  let data = [
19
48
  {
20
- sheet: "Adults",
49
+ sheet: "Employees",
21
50
  columns: [
22
- { label: "User", value: "user" }, // Top level data
23
- { label: "Age", value: (row) => row.age + " years" }, // Custom format
24
- { label: "Phone", value: (row) => (row.more ? row.more.phone || "" : "") }, // Run functions
51
+ { label: "Name", value: "name" }, // Top level data
52
+ { label: "Salary", value: (row) => row.salary + " USD" }, // Custom format
53
+ { label: "Email", value: (row) => (row.contact ? row.contact.email || "" : "") }, // Run functions
25
54
  ],
26
55
  content: [
27
- { user: "Andrea", age: 20, more: { phone: "11111111" } },
28
- { user: "Luis", age: 21, more: { phone: "12345678" } },
56
+ { name: "Ada Lovelace", salary: 5000, contact: { email: "ada@example.com" } },
57
+ { name: "Grace Hopper", salary: 6200, contact: { email: "grace@example.com" } },
29
58
  ],
30
59
  },
31
60
  {
32
- sheet: "Children",
61
+ sheet: "Products",
33
62
  columns: [
34
- { label: "User", value: "user" }, // Top level data
35
- { label: "Age", value: "age", format: '# "years"' }, // Column format
36
- { label: "Phone", value: "more.phone", format: "(###) ###-####" }, // Deep props and column format
63
+ { label: "Product", value: "product" }, // Top level data
64
+ { label: "Price", value: "price", format: "$#,##0.00" }, // Column format
65
+ { label: "Stock", value: "inventory.stock", format: "#,##0" }, // Deep props and column format
37
66
  ],
38
67
  content: [
39
- { user: "Manuel", age: 16, more: { phone: 9999999900 } },
40
- { user: "Ana", age: 17, more: { phone: 8765432135 } },
68
+ { product: "Keyboard", price: 29.99, inventory: { stock: 1200 } },
69
+ { product: "Monitor", price: 199.5, inventory: { stock: 340 } },
41
70
  ],
42
71
  },
43
72
  ]
44
73
 
45
74
  let settings = {
46
75
  fileName: "MySpreadsheet", // Name of the resulting spreadsheet
76
+ enableStyles: false, // Set to true to write cell styles (`s`) into the .xlsx file
47
77
  extraLength: 3, // A bigger number means that columns will be wider
48
- writeMode: "writeFile", // The available parameters are 'WriteFile' and 'write'. This setting is optional. Useful in such cases https://docs.sheetjs.com/docs/solutions/output#example-remote-file
78
+ writeMode: "writeFile", // The available parameters are 'writeFile' and 'write'. This setting is optional. Useful in such cases https://docs.sheetjs.com/docs/solutions/output#example-remote-file
49
79
  writeOptions: {}, // Style options from https://docs.sheetjs.com/docs/api/write-options
50
80
  RTL: true, // Display the columns from right-to-left (the default value is false)
51
81
  }
@@ -53,16 +83,57 @@ let settings = {
53
83
  xlsx(data, settings) // Will download the excel file
54
84
  ```
55
85
 
56
- If you want to trigger something after the file is downloaded, you can use the `callback` parameter:
86
+ ### Settings
87
+
88
+ | Option | Type | Default | Description |
89
+ | -------------- | --------------------- | --------------- | --------------------------------------------------------------------------------------------- |
90
+ | `enableStyles` | `boolean` | `false` | Write cell style objects into the `.xlsx` file. Only supported with `bookType: "xlsx"`. |
91
+ | `fileName` | `string` | `"Spreadsheet"` | Name of the resulting file (the `.xlsx` extension is added automatically). |
92
+ | `extraLength` | `number` | `1` | Extra characters added to every auto-calculated column width. |
93
+ | `writeMode` | `"writeFile"`/`"write"` | `"writeFile"` | `"writeFile"` downloads/writes the file; `"write"` returns the raw data (e.g. a Node buffer). |
94
+ | `writeOptions` | `object` | `{}` | Passed straight to SheetJS — see [write options](https://docs.sheetjs.com/docs/api/write-options). |
95
+ | `RTL` | `boolean` | `false` | Render every sheet right-to-left. |
96
+
97
+ ### Callback
98
+
99
+ If you want to inspect or post-process the workbook, pass a `callback` as the
100
+ third argument. It receives the generated [`WorkBook`](https://docs.sheetjs.com/docs/csf/book)
101
+ **right before** it is written, so you can read or mutate it:
57
102
 
58
103
  ```js
59
- let callback = function (sheet) {
60
- console.log("Download complete:", sheet)
104
+ let callback = function (workbook) {
105
+ console.log("Workbook ready:", workbook.SheetNames)
61
106
  }
62
107
 
63
108
  xlsx(data, settings, callback) // Will download the excel file
64
109
  ```
65
110
 
111
+ ### Use in Node.js (server-side)
112
+
113
+ Set `writeOptions.type` to `"buffer"` (or `writeMode: "write"`) to get the file
114
+ contents back instead of writing them to disk. This is handy for sending the
115
+ spreadsheet over HTTP:
116
+
117
+ ```js
118
+ import xlsx from "json-as-xlsx"
119
+
120
+ const settings = {
121
+ writeOptions: {
122
+ type: "buffer",
123
+ bookType: "xlsx",
124
+ },
125
+ }
126
+
127
+ app.get("/download", (_, res) => {
128
+ const buffer = xlsx(data, settings)
129
+ res.writeHead(200, {
130
+ "Content-Type": "application/octet-stream",
131
+ "Content-Disposition": "attachment; filename=MySheet.xlsx",
132
+ })
133
+ res.end(buffer)
134
+ })
135
+ ```
136
+
66
137
  ### Column formatting
67
138
 
68
139
  > **Note:** Cell formatting is type based, i.e. the format type and value type must match.
@@ -96,9 +167,104 @@ Examples
96
167
  "h:mm AM/PM" // 1:10 PM
97
168
  ```
98
169
 
170
+ #### Hyperlinks
171
+
172
+ Use the special `"hyperlink"` format to turn a column's text values into
173
+ clickable links:
174
+
175
+ ```js
176
+ columns: [{ label: "Website", value: "url", format: "hyperlink" }]
177
+ ```
178
+
179
+ ### Cell Styling
180
+
181
+ Cell styling is disabled by default to keep the regular export path unchanged.
182
+ Set `enableStyles: true` to write style objects into the generated `.xlsx` file.
183
+ Styled exports only support XLSX output; if you set `writeOptions.bookType`, keep
184
+ it as `"xlsx"`.
185
+
186
+ You can style headers, full columns, or individual cell values:
187
+
188
+ ```js
189
+ let data = [
190
+ {
191
+ sheet: "Styled employees",
192
+ columns: [
193
+ {
194
+ label: "Name",
195
+ value: "name",
196
+ headerStyle: {
197
+ fill: { fgColor: { rgb: "21A366" } },
198
+ font: { bold: true, color: { rgb: "FFFFFF" } },
199
+ },
200
+ cellStyle: {
201
+ alignment: { wrapText: true },
202
+ },
203
+ },
204
+ {
205
+ label: "Salary",
206
+ value: "salary",
207
+ format: "$#,##0.00",
208
+ cellStyle: {
209
+ font: { italic: true },
210
+ },
211
+ },
212
+ ],
213
+ content: [
214
+ {
215
+ name: {
216
+ v: "Ada\nLovelace",
217
+ t: "s",
218
+ s: { font: { bold: true, color: { rgb: "FF0000" } } },
219
+ },
220
+ salary: 5000,
221
+ },
222
+ ],
223
+ },
224
+ ]
225
+
226
+ xlsx(data, {
227
+ fileName: "StyledSpreadsheet",
228
+ enableStyles: true,
229
+ })
230
+ ```
231
+
232
+ Supported style groups are `alignment`, `border`, `fill`, `font`, and `numFmt`.
233
+ Column `format` values are also preserved as number formats when styles are
234
+ enabled.
235
+
236
+ ## TypeScript
237
+
238
+ The package is written in TypeScript and ships its own type definitions. The
239
+ public interfaces are exported for your convenience:
240
+
241
+ ```ts
242
+ import xlsx, { IJsonSheet, ISettings, IColumn, IContent, ICellStyle } from "json-as-xlsx"
243
+
244
+ const data: IJsonSheet[] = [
245
+ /* ... */
246
+ ]
247
+ const settings: ISettings = {
248
+ /* ... */
249
+ }
250
+
251
+ xlsx(data, settings)
252
+ ```
253
+
99
254
  ## Examples
100
255
 
101
- This are files used for development, please change imports from `../../src/index` to `json-as-xlsx`
256
+ These are the files used during development when copying them, change the
257
+ imports from `../../src/index` to `json-as-xlsx`.
102
258
 
103
259
  - [Express with TypeScript](https://github.com/LuisEnMarroquin/json-as-xlsx/blob/main/packages/demo-express)
104
260
  - [ReactJS with TypeScript](https://github.com/LuisEnMarroquin/json-as-xlsx/blob/main/packages/demo-reactjs)
261
+
262
+ ## Contributing
263
+
264
+ Contributions are welcome! Please read the [contributing guide](CONTRIBUTING.md)
265
+ and the [code of conduct](CODE_OF_CONDUCT.md) before opening a pull request. To
266
+ report a security issue, see the [security policy](SECURITY.md).
267
+
268
+ ## License
269
+
270
+ [MIT](LICENSE) © [LuisEnMarroquin](https://github.com/LuisEnMarroquin)
package/dist/index.d.ts CHANGED
@@ -1,11 +1,16 @@
1
1
  import { utils, WorkBook, WorkSheet, WritingOptions } from "@e965/xlsx";
2
+ import { ICellStyle, IStyledCell } from "./styles";
3
+ export { IBorderStyle, ICellStyle, ICellStyleColor, ICellType, IStyledCell } from "./styles";
2
4
  export interface IColumn {
3
5
  label: string;
4
- value: string | ((value: IContent) => string | number | boolean | Date | IContent | null);
6
+ value: string | ((value: IContent) => IContentValue);
7
+ cellStyle?: ICellStyle;
5
8
  format?: string;
9
+ headerStyle?: ICellStyle;
6
10
  }
11
+ export type IContentValue = string | number | boolean | Date | IContent | IStyledCell | null;
7
12
  export interface IContent {
8
- [key: string]: string | number | boolean | Date | IContent | null;
13
+ [key: string]: IContentValue;
9
14
  }
10
15
  export interface IJsonSheet {
11
16
  sheet?: string;
@@ -13,6 +18,7 @@ export interface IJsonSheet {
13
18
  content: IContent[];
14
19
  }
15
20
  export interface ISettings {
21
+ enableStyles?: boolean;
16
22
  extraLength?: number;
17
23
  fileName?: string;
18
24
  writeOptions?: WritingOptions;
@@ -20,17 +26,39 @@ export interface ISettings {
20
26
  RTL?: boolean;
21
27
  }
22
28
  export interface IJsonSheetRow {
23
- [key: string]: string | number | boolean | Date | IContent | null;
29
+ [key: string]: IContentValue;
24
30
  }
25
31
  export interface IWorksheetColumnWidth {
26
32
  width: number;
27
33
  }
28
34
  export type IWorkbookCallback = (workbook: WorkBook) => void;
29
35
  export { utils, WorkBook, WorkSheet };
30
- export declare const getContentProperty: (content: IContent, property: string) => string | number | boolean | Date | IContent;
36
+ export declare const getContentProperty: (content: IContent, property: string) => string | number | boolean | Date | IContent | IStyledCell;
31
37
  export declare const getJsonSheetRow: (content: IContent, columns: IColumn[]) => IJsonSheetRow;
32
38
  export declare const getWorksheetColumnWidths: (worksheet: WorkSheet, extraLength?: number) => IWorksheetColumnWidth[];
33
- declare const writeWorkbook: (workbook: WorkBook, settings?: ISettings) => Buffer | undefined;
34
- export declare const xlsx: (jsonSheets: IJsonSheet[], settings?: ISettings, workbookCallback?: IWorkbookCallback) => ReturnType<typeof writeWorkbook>;
39
+ export declare function xlsx(jsonSheets: IJsonSheet[], settings: ISettings & {
40
+ writeMode: "write";
41
+ writeOptions: WritingOptions & {
42
+ type: "array";
43
+ };
44
+ }, workbookCallback?: IWorkbookCallback): ArrayBuffer | undefined;
45
+ export declare function xlsx(jsonSheets: IJsonSheet[], settings: ISettings & {
46
+ writeMode: "write";
47
+ writeOptions: WritingOptions & {
48
+ type: "base64" | "binary" | "string";
49
+ };
50
+ }, workbookCallback?: IWorkbookCallback): string | undefined;
51
+ export declare function xlsx(jsonSheets: IJsonSheet[], settings: ISettings & {
52
+ writeMode: "write";
53
+ writeOptions: WritingOptions & {
54
+ type: "buffer";
55
+ };
56
+ }, workbookCallback?: IWorkbookCallback): Buffer | undefined;
57
+ export declare function xlsx(jsonSheets: IJsonSheet[], settings: ISettings & {
58
+ writeOptions: WritingOptions & {
59
+ type: "buffer";
60
+ };
61
+ }, workbookCallback?: IWorkbookCallback): Buffer | undefined;
62
+ export declare function xlsx(jsonSheets: IJsonSheet[], settings?: ISettings, workbookCallback?: IWorkbookCallback): Buffer | undefined;
35
63
  export default xlsx;
36
64
  export declare const libraryName = "json-as-xlsx";
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.libraryName=exports.xlsx=exports.getWorksheetColumnWidths=exports.getJsonSheetRow=exports.getContentProperty=exports.utils=void 0;const xlsx_1=require("@e965/xlsx");Object.defineProperty(exports,"utils",{enumerable:true,get:function(){return xlsx_1.utils}});const getContentProperty=(content,property)=>{const accessContentProperties=(content,properties)=>{const value=content[properties[0]];if(properties.length===1){return value!==null&&value!==void 0?value:""}if(value===undefined||value===null||typeof value==="string"||typeof value==="boolean"||typeof value==="number"||value instanceof Date){return""}return accessContentProperties(value,properties.slice(1))};const properties=property.split(".");return accessContentProperties(content,properties)};exports.getContentProperty=getContentProperty;const getJsonSheetRow=(content,columns)=>{const jsonSheetRow={};columns.forEach(column=>{if(typeof column.value==="function"){jsonSheetRow[column.label]=column.value(content)}else{jsonSheetRow[column.label]=(0,exports.getContentProperty)(content,column.value)}});return jsonSheetRow};exports.getJsonSheetRow=getJsonSheetRow;const applyColumnFormat=(worksheet,columnIds,columnFormats)=>{var _a;for(let i=0;i<columnIds.length;i+=1){const columnFormat=columnFormats[i];if(!columnFormat){continue}const column=xlsx_1.utils.decode_col(columnIds[i]);const range=xlsx_1.utils.decode_range((_a=worksheet["!ref"])!==null&&_a!==void 0?_a:"");for(let row=range.s.r+1;row<=range.e.r;++row){const ref=xlsx_1.utils.encode_cell({r:row,c:column});if(worksheet[ref]){switch(columnFormat){case"hyperlink":worksheet[ref].l={Target:worksheet[ref].v};break;default:worksheet[ref].z=columnFormat}}}}};const getWorksheetColumnIds=worksheet=>{var _a;const columnRange=xlsx_1.utils.decode_range((_a=worksheet["!ref"])!==null&&_a!==void 0?_a:"");const columnIds=[];for(let C=columnRange.s.c;C<=columnRange.e.c;C++){const address=xlsx_1.utils.encode_col(C);columnIds.push(address)}return columnIds};const getObjectLength=object=>{if(typeof object==="string"){return Math.max(...object.split("\n").map(string=>string.length))}if(typeof object==="number"){return object.toString().length}if(typeof object==="boolean"){return object?"true".length:"false".length}if(object instanceof Date){return object.toString().length}return 0};const getWorksheetColumnWidths=(worksheet,extraLength=1)=>{const columnLetters=getWorksheetColumnIds(worksheet);return columnLetters.map(column=>{const columnCells=Object.keys(worksheet).filter(cell=>{return cell.replace(/[0-9]/g,"")===column});const maxWidthCell=columnCells.reduce((maxWidth,cellId)=>{const cell=worksheet[cellId];const cellContentLength=getObjectLength(cell.v);if(!cell.z){return Math.max(maxWidth,cellContentLength)}const cellFormatLength=cell.z.length;const largestWidth=Math.max(cellContentLength,cellFormatLength);return Math.max(maxWidth,largestWidth)},0);return{width:maxWidthCell+extraLength}})};exports.getWorksheetColumnWidths=getWorksheetColumnWidths;const getWorksheet=(jsonSheet,settings)=>{let jsonSheetRows;if(jsonSheet.content.length>0){jsonSheetRows=jsonSheet.content.map(contentItem=>{return(0,exports.getJsonSheetRow)(contentItem,jsonSheet.columns)})}else{jsonSheetRows=jsonSheet.columns.map(column=>({[column.label]:""}))}const worksheet=xlsx_1.utils.json_to_sheet(jsonSheetRows);const worksheetColumnIds=getWorksheetColumnIds(worksheet);const worksheetColumnFormats=jsonSheet.columns.map(jsonSheetColumn=>{var _a;return(_a=jsonSheetColumn.format)!==null&&_a!==void 0?_a:null});applyColumnFormat(worksheet,worksheetColumnIds,worksheetColumnFormats);worksheet["!cols"]=(0,exports.getWorksheetColumnWidths)(worksheet,settings.extraLength);return worksheet};const writeWorkbook=(workbook,settings={})=>{var _a,_b,_c,_d;var _e;const RTL=Boolean(settings.RTL);(_a=workbook.Workbook)!==null&&_a!==void 0?_a:workbook.Workbook={};(_b=(_e=workbook.Workbook).Views)!==null&&_b!==void 0?_b:_e.Views=[{}];workbook.Workbook.Views.forEach(view=>{view.RTL=RTL});const filename=`${(_c=settings.fileName)!==null&&_c!==void 0?_c:"Spreadsheet"}.xlsx`;const writeOptions=(_d=settings.writeOptions)!==null&&_d!==void 0?_d:{};if(settings.writeMode==="write"){return(0,xlsx_1.write)(workbook,writeOptions)}else if(settings.writeMode==="writeFile"){(0,xlsx_1.writeFile)(workbook,filename,writeOptions);return}else if(writeOptions.type==="buffer"){return(0,xlsx_1.write)(workbook,writeOptions)}else{(0,xlsx_1.writeFile)(workbook,filename,writeOptions);return}};const xlsx=(jsonSheets,settings={},workbookCallback=()=>{})=>{if(jsonSheets.length===0)return;const workbook=xlsx_1.utils.book_new();jsonSheets.forEach((actualSheet,actualIndex)=>{var _a;const worksheet=getWorksheet(actualSheet,settings);const worksheetName=(_a=actualSheet.sheet)!==null&&_a!==void 0?_a:`Sheet ${actualIndex+1}`;xlsx_1.utils.book_append_sheet(workbook,worksheet,worksheetName)});workbookCallback(workbook);return writeWorkbook(workbook,settings)};exports.xlsx=xlsx;exports.default=exports.xlsx;exports.libraryName="json-as-xlsx";module.exports=exports.xlsx;module.exports.getContentProperty=exports.getContentProperty;module.exports.getJsonSheetRow=exports.getJsonSheetRow;module.exports.getWorksheetColumnWidths=exports.getWorksheetColumnWidths;module.exports.utils=xlsx_1.utils;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.libraryName=exports.getWorksheetColumnWidths=exports.getJsonSheetRow=exports.getContentProperty=exports.utils=void 0;exports.xlsx=xlsx;const xlsx_1=require("@e965/xlsx");Object.defineProperty(exports,"utils",{enumerable:true,get:function(){return xlsx_1.utils}});const styles_1=require("./styles");const getContentProperty=(content,property)=>{const accessContentProperties=(content,properties)=>{const value=content[properties[0]];if(properties.length===1){return value!==null&&value!==void 0?value:""}if(value===undefined||value===null||typeof value==="string"||typeof value==="boolean"||typeof value==="number"||value instanceof Date){return""}return accessContentProperties(value,properties.slice(1))};const properties=property.split(".");return accessContentProperties(content,properties)};exports.getContentProperty=getContentProperty;const getJsonSheetRow=(content,columns)=>{const jsonSheetRow={};columns.forEach(column=>{if(typeof column.value==="function"){jsonSheetRow[column.label]=column.value(content)}else{jsonSheetRow[column.label]=(0,exports.getContentProperty)(content,column.value)}});return jsonSheetRow};exports.getJsonSheetRow=getJsonSheetRow;const applyColumnFormat=(worksheet,columnIds,columnFormats)=>{var _a;for(let i=0;i<columnIds.length;i+=1){const columnFormat=columnFormats[i];if(!columnFormat){continue}const column=xlsx_1.utils.decode_col(columnIds[i]);const range=xlsx_1.utils.decode_range((_a=worksheet["!ref"])!==null&&_a!==void 0?_a:"");for(let row=range.s.r+1;row<=range.e.r;++row){const ref=xlsx_1.utils.encode_cell({r:row,c:column});if(worksheet[ref]){switch(columnFormat){case"hyperlink":worksheet[ref].l={Target:worksheet[ref].v};break;default:worksheet[ref].z=columnFormat}}}}};const applyHeaderStyles=(worksheet,columnIds,headerStyles)=>{for(let i=0;i<columnIds.length;i+=1){const headerStyle=headerStyles[i];if(!headerStyle){continue}const column=xlsx_1.utils.decode_col(columnIds[i]);const ref=xlsx_1.utils.encode_cell({r:0,c:column});if(worksheet[ref]){applyCellStyles(worksheet[ref],headerStyle)}}};const applyColumnStyles=(worksheet,columnIds,columnStyles)=>{var _a;for(let i=0;i<columnIds.length;i+=1){const columnStyle=columnStyles[i];if(!columnStyle){continue}const column=xlsx_1.utils.decode_col(columnIds[i]);const range=xlsx_1.utils.decode_range((_a=worksheet["!ref"])!==null&&_a!==void 0?_a:"");for(let row=range.s.r+1;row<=range.e.r;++row){const ref=xlsx_1.utils.encode_cell({r:row,c:column});if(worksheet[ref]){applyCellStyles(worksheet[ref],columnStyle)}}}};const getWorksheetColumnIds=worksheet=>{var _a;const columnRange=xlsx_1.utils.decode_range((_a=worksheet["!ref"])!==null&&_a!==void 0?_a:"");const columnIds=[];for(let C=columnRange.s.c;C<=columnRange.e.c;C++){const address=xlsx_1.utils.encode_col(C);columnIds.push(address)}return columnIds};const getObjectLength=object=>{if(isStyledCell(object)){return getObjectLength(object.v)}if(typeof object==="string"){return Math.max(...object.split("\n").map(string=>string.length))}if(typeof object==="number"){return object.toString().length}if(typeof object==="boolean"){return object?"true".length:"false".length}if(object instanceof Date){return object.toString().length}return 0};const getWorksheetColumnWidths=(worksheet,extraLength=1)=>{const columnLetters=getWorksheetColumnIds(worksheet);return columnLetters.map(column=>{const columnCells=Object.keys(worksheet).filter(cell=>{return cell.replace(/[0-9]/g,"")===column});const maxWidthCell=columnCells.reduce((maxWidth,cellId)=>{const cell=worksheet[cellId];const cellContentLength=getObjectLength(cell.v);if(!cell.z){return Math.max(maxWidth,cellContentLength)}const cellFormatLength=cell.z.length;const largestWidth=Math.max(cellContentLength,cellFormatLength);return Math.max(maxWidth,largestWidth)},0);return{width:maxWidthCell+extraLength}})};exports.getWorksheetColumnWidths=getWorksheetColumnWidths;const getWorksheet=(jsonSheet,settings)=>{let jsonSheetRows;if(jsonSheet.content.length>0){jsonSheetRows=jsonSheet.content.map(contentItem=>{return(0,exports.getJsonSheetRow)(contentItem,jsonSheet.columns)})}else{jsonSheetRows=jsonSheet.columns.map(column=>({[column.label]:""}))}const worksheet=xlsx_1.utils.json_to_sheet(jsonSheetRows);const worksheetColumnIds=getWorksheetColumnIds(worksheet);const worksheetColumnFormats=jsonSheet.columns.map(jsonSheetColumn=>{var _a;return(_a=jsonSheetColumn.format)!==null&&_a!==void 0?_a:null});applyColumnFormat(worksheet,worksheetColumnIds,worksheetColumnFormats);if(settings.enableStyles){const worksheetHeaderStyles=jsonSheet.columns.map(jsonSheetColumn=>{var _a;return(_a=jsonSheetColumn.headerStyle)!==null&&_a!==void 0?_a:null});const worksheetColumnStyles=jsonSheet.columns.map(jsonSheetColumn=>{var _a;return(_a=jsonSheetColumn.cellStyle)!==null&&_a!==void 0?_a:null});applyHeaderStyles(worksheet,worksheetColumnIds,worksheetHeaderStyles);applyColumnStyles(worksheet,worksheetColumnIds,worksheetColumnStyles)}worksheet["!cols"]=(0,exports.getWorksheetColumnWidths)(worksheet,settings.extraLength);return worksheet};const applyCellStyles=(cell,...styles)=>{const existingStyle=(0,styles_1.isCellStyleObject)(cell.s)?cell.s:undefined;const mergedStyle=(0,styles_1.mergeCellStyles)(...styles,existingStyle);if(Object.keys(mergedStyle).length>0){cell.s=mergedStyle}};const validCellTypes=new Set(["b","n","e","s","d","z","str"]);const styleKeys=new Set(["alignment","border","fill","font","numFmt"]);const hasStyleKeys=style=>{return(0,styles_1.isCellStyleObject)(style)&&Object.keys(style).some(key=>styleKeys.has(key))};const isCellLink=value=>{return Boolean(value)&&typeof value==="object"&&!Array.isArray(value)&&typeof value.Target==="string"};const isStyledCell=value=>{if(!value||typeof value!=="object"||Array.isArray(value)){return false}const cell=value;return"v"in cell&&(validCellTypes.has(String(cell.t))||hasStyleKeys(cell.s)||typeof cell.z==="string"||isCellLink(cell.l))};const writeWorkbook=(workbook,settings={})=>{var _a,_b,_c,_d,_e,_f;var _g;const RTL=Boolean(settings.RTL);(_a=workbook.Workbook)!==null&&_a!==void 0?_a:workbook.Workbook={};(_b=(_g=workbook.Workbook).Views)!==null&&_b!==void 0?_b:_g.Views=[{}];workbook.Workbook.Views.forEach(view=>{view.RTL=RTL});const filename=`${(_c=settings.fileName)!==null&&_c!==void 0?_c:"Spreadsheet"}.xlsx`;const writeOptions=(_d=settings.writeOptions)!==null&&_d!==void 0?_d:{};const writeType=(_e=writeOptions.type)!==null&&_e!==void 0?_e:"buffer";if(settings.enableStyles){const bookType=(_f=writeOptions.bookType)!==null&&_f!==void 0?_f:"xlsx";if(bookType!=="xlsx"){throw new Error("enableStyles only supports the xlsx book type")}const rawWorkbook=(0,xlsx_1.write)(workbook,Object.assign(Object.assign({},writeOptions),{bookType:bookType,type:"array"}));const styledWorkbook=(0,styles_1.patchStyledWorkbook)(workbook,rawWorkbook);if(settings.writeMode==="write"){return(0,styles_1.toStyledOutput)(styledWorkbook,writeType)}else if(settings.writeMode==="writeFile"){(0,styles_1.saveXlsxOutput)(styledWorkbook,filename);return}else if(writeOptions.type==="buffer"){return(0,styles_1.toStyledOutput)(styledWorkbook,writeOptions.type)}else{(0,styles_1.saveXlsxOutput)(styledWorkbook,filename);return}}if(settings.writeMode==="write"){return(0,xlsx_1.write)(workbook,Object.assign(Object.assign({},writeOptions),{type:writeType}))}else if(settings.writeMode==="writeFile"){(0,xlsx_1.writeFile)(workbook,filename,writeOptions);return}else if(writeOptions.type==="buffer"){return(0,xlsx_1.write)(workbook,writeOptions)}else{(0,xlsx_1.writeFile)(workbook,filename,writeOptions);return}};function xlsx(jsonSheets,settings={},workbookCallback=()=>{}){if(jsonSheets.length===0)return;const workbook=xlsx_1.utils.book_new();jsonSheets.forEach((actualSheet,actualIndex)=>{var _a;const worksheet=getWorksheet(actualSheet,settings);const worksheetName=(_a=actualSheet.sheet)!==null&&_a!==void 0?_a:`Sheet ${actualIndex+1}`;xlsx_1.utils.book_append_sheet(workbook,worksheet,worksheetName)});workbookCallback(workbook);return writeWorkbook(workbook,settings)}exports.default=xlsx;exports.libraryName="json-as-xlsx";module.exports=xlsx;module.exports.getContentProperty=exports.getContentProperty;module.exports.getJsonSheetRow=exports.getJsonSheetRow;module.exports.getWorksheetColumnWidths=exports.getWorksheetColumnWidths;module.exports.utils=xlsx_1.utils;
@@ -0,0 +1,85 @@
1
+ export interface ICellStyleColor {
2
+ rgb?: string;
3
+ theme?: number;
4
+ tint?: number;
5
+ indexed?: string | number;
6
+ auto?: boolean;
7
+ }
8
+ export type IBorderStyle = "dashDot" | "dashDotDot" | "dashed" | "dotted" | "hair" | "medium" | "mediumDashDot" | "mediumDashDotDot" | "mediumDashed" | "slantDashDot" | "thick" | "thin";
9
+ export interface ICellStyle {
10
+ alignment?: {
11
+ horizontal?: "left" | "center" | "right";
12
+ vertical?: "top" | "center" | "bottom";
13
+ indent?: number;
14
+ readingOrder?: number;
15
+ textRotation?: number;
16
+ wrapText?: boolean;
17
+ };
18
+ border?: {
19
+ top?: {
20
+ color?: ICellStyleColor;
21
+ style?: IBorderStyle;
22
+ };
23
+ bottom?: {
24
+ color?: ICellStyleColor;
25
+ style?: IBorderStyle;
26
+ };
27
+ left?: {
28
+ color?: ICellStyleColor;
29
+ style?: IBorderStyle;
30
+ };
31
+ right?: {
32
+ color?: ICellStyleColor;
33
+ style?: IBorderStyle;
34
+ };
35
+ diagonal?: {
36
+ color?: ICellStyleColor;
37
+ style?: IBorderStyle;
38
+ diagonalUp?: boolean;
39
+ diagonalDown?: boolean;
40
+ };
41
+ };
42
+ fill?: {
43
+ bgColor?: ICellStyleColor;
44
+ fgColor?: ICellStyleColor;
45
+ patternType?: "solid" | "none" | "gray125";
46
+ };
47
+ font?: {
48
+ bold?: boolean;
49
+ color?: ICellStyleColor;
50
+ italic?: boolean;
51
+ name?: string;
52
+ outline?: boolean;
53
+ shadow?: boolean;
54
+ strike?: boolean;
55
+ sz?: number;
56
+ underline?: boolean;
57
+ vertAlign?: "superscript" | "subscript";
58
+ };
59
+ numFmt?: string | number;
60
+ }
61
+ export type ICellType = "b" | "n" | "e" | "s" | "d" | "z" | "str";
62
+ export interface IStyledCell {
63
+ v?: string | number | boolean | Date;
64
+ t?: ICellType;
65
+ s?: ICellStyle;
66
+ z?: string;
67
+ l?: {
68
+ Target: string;
69
+ Tooltip?: string;
70
+ };
71
+ }
72
+ interface IWorksheetLike {
73
+ [key: string]: unknown;
74
+ }
75
+ interface IWorkbookLike {
76
+ SheetNames: string[];
77
+ Sheets: Record<string, IWorksheetLike>;
78
+ }
79
+ export type IStyledOutput = ArrayBuffer | Buffer | Uint8Array | string;
80
+ export declare const mergeCellStyles: (...styles: Array<ICellStyle | undefined>) => ICellStyle;
81
+ export declare const isCellStyleObject: (style: unknown) => style is ICellStyle;
82
+ export declare const patchStyledWorkbook: (workbook: IWorkbookLike, workbookData: ArrayBuffer | Uint8Array) => Uint8Array;
83
+ export declare const toStyledOutput: (data: Uint8Array, type?: string) => IStyledOutput;
84
+ export declare const saveXlsxOutput: (data: ArrayBuffer | Uint8Array, filename: string) => void;
85
+ export {};
package/dist/styles.js ADDED
@@ -0,0 +1,566 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.saveXlsxOutput = exports.toStyledOutput = exports.patchStyledWorkbook = exports.isCellStyleObject = exports.mergeCellStyles = void 0;
4
+ const fflate_1 = require("fflate");
5
+ class XmlNode {
6
+ constructor(tagName, attributes = {}, children = []) {
7
+ this.tagName = tagName;
8
+ this.prefixText = "";
9
+ this.attributes = attributes;
10
+ this.childNodes = children;
11
+ }
12
+ append(node) {
13
+ this.childNodes.push(node);
14
+ return this;
15
+ }
16
+ attr(attr, value) {
17
+ if (typeof attr === "string") {
18
+ if (value === undefined) {
19
+ delete this.attributes[attr];
20
+ }
21
+ else {
22
+ this.attributes[attr] = value;
23
+ }
24
+ return this;
25
+ }
26
+ Object.keys(attr).forEach((key) => {
27
+ const attributeValue = attr[key];
28
+ if (attributeValue !== undefined) {
29
+ this.attributes[key] = attributeValue;
30
+ }
31
+ });
32
+ return this;
33
+ }
34
+ prefix(prefix) {
35
+ this.prefixText = prefix;
36
+ return this;
37
+ }
38
+ children() {
39
+ return this.childNodes;
40
+ }
41
+ toXml() {
42
+ const attributes = Object.keys(this.attributes)
43
+ .map((key) => ` ${key}="${escapeXmlAttribute(String(this.attributes[key]))}"`)
44
+ .join("");
45
+ if (this.childNodes.length === 0) {
46
+ return `${this.prefixText}<${this.tagName}${attributes}/>`;
47
+ }
48
+ return `${this.prefixText}<${this.tagName}${attributes}>${this.childNodes.map((node) => node.toXml()).join("")}</${this.tagName}>`;
49
+ }
50
+ }
51
+ // Adapted from xlsx-js-style (Apache-2.0), which in turn credits SheetJS,
52
+ // sheetjs-style, and sheetjs-style-v2 for the original style-writing approach.
53
+ class StyleBuilder {
54
+ constructor(defaultCellStyle = {}) {
55
+ this.customNumFmtId = 164;
56
+ // Full-style dedup, plus per-component dedup so that distinct styles sharing a
57
+ // font/fill/border/numFmt reuse one entry instead of bloating styles.xml.
58
+ this.hashIndex = new Map();
59
+ this.fontHashIndex = new Map();
60
+ this.fillHashIndex = new Map();
61
+ this.borderHashIndex = new Map();
62
+ this.numFmtHashIndex = new Map();
63
+ this.fonts = new XmlNode("fonts").attr("count", 0).attr("x14ac:knownFonts", "1");
64
+ this.fills = new XmlNode("fills").attr("count", 0);
65
+ this.borders = new XmlNode("borders").attr("count", 0);
66
+ this.numFmts = new XmlNode("numFmts").attr("count", 0);
67
+ // cellStyleXfs and cellStyles always hold exactly one entry here; emit the
68
+ // matching count="1" so stricter OOXML readers don't reject the file.
69
+ this.cellStyleXfs = new XmlNode("cellStyleXfs").attr("count", 1);
70
+ this.cellXfs = new XmlNode("cellXfs").attr("count", 0);
71
+ this.cellStyles = new XmlNode("cellStyles").attr("count", 1).append(new XmlNode("cellStyle").attr("name", "Normal").attr("xfId", 0).attr("builtinId", 0));
72
+ this.dxfs = new XmlNode("dxfs").attr("count", 0);
73
+ this.tableStyles = new XmlNode("tableStyles").attr("count", 0).attr("defaultTableStyle", "TableStyleMedium9").attr("defaultPivotStyle", "PivotStyleMedium4");
74
+ this.styles = new XmlNode("styleSheet")
75
+ .attr("xmlns:mc", "http://schemas.openxmlformats.org/markup-compatibility/2006")
76
+ .attr("xmlns:x14ac", "http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac")
77
+ .attr("xmlns", "http://schemas.openxmlformats.org/spreadsheetml/2006/main")
78
+ .attr("mc:Ignorable", "x14ac")
79
+ .prefix('<?xml version="1.0" encoding="UTF-8" standalone="yes"?>');
80
+ this.defaultStyle = (0, exports.mergeCellStyles)({
81
+ border: {},
82
+ fill: { patternType: "none" },
83
+ font: { name: "Calibri", sz: 11 },
84
+ numFmt: 0,
85
+ }, defaultCellStyle);
86
+ this.styles
87
+ .append(this.numFmts)
88
+ .append(this.fonts)
89
+ .append(this.fills)
90
+ .append(this.borders)
91
+ .append(this.cellStyleXfs.append(new XmlNode("xf").attr("numFmtId", 0).attr("fontId", 0).attr("fillId", 0).attr("borderId", 0)))
92
+ .append(this.cellXfs)
93
+ .append(this.cellStyles)
94
+ .append(this.dxfs)
95
+ .append(this.tableStyles);
96
+ this.addStyle(this.defaultStyle);
97
+ this.addStyle(Object.assign(Object.assign({}, this.defaultStyle), { fill: { patternType: "gray125" } }));
98
+ }
99
+ addStyle(style) {
100
+ const hashKey = stableStringify(style);
101
+ const existingIndex = this.hashIndex.get(hashKey);
102
+ if (existingIndex !== undefined) {
103
+ return existingIndex;
104
+ }
105
+ const index = this.addXf(style);
106
+ this.hashIndex.set(hashKey, index);
107
+ return index;
108
+ }
109
+ toXml() {
110
+ return this.styles.toXml();
111
+ }
112
+ addXf(style) {
113
+ const fontId = this.addFont(style.font);
114
+ const fillId = this.addFill(style.fill);
115
+ const borderId = this.addBorder(style.border);
116
+ const numFmtId = this.addNumFmt(style.numFmt);
117
+ const xf = new XmlNode("xf").attr("numFmtId", numFmtId).attr("fontId", fontId).attr("fillId", fillId).attr("borderId", borderId).attr("xfId", 0);
118
+ if (fontId > 0)
119
+ xf.attr("applyFont", 1);
120
+ if (fillId > 0)
121
+ xf.attr("applyFill", 1);
122
+ if (borderId > 0)
123
+ xf.attr("applyBorder", 1);
124
+ if (Number(numFmtId) > 0)
125
+ xf.attr("applyNumberFormat", 1);
126
+ if (style.alignment) {
127
+ const alignment = new XmlNode("alignment");
128
+ Object.keys(style.alignment).forEach((key) => {
129
+ var _a;
130
+ const value = (_a = style.alignment) === null || _a === void 0 ? void 0 : _a[key];
131
+ if (value !== undefined)
132
+ alignment.attr(key, value);
133
+ });
134
+ xf.append(alignment).attr("applyAlignment", 1);
135
+ }
136
+ this.cellXfs.append(xf).attr("count", this.cellXfs.children().length);
137
+ return this.cellXfs.children().length - 1;
138
+ }
139
+ addFont(font) {
140
+ var _a, _b, _c, _d, _e, _f;
141
+ if (!font)
142
+ return 0;
143
+ const key = stableStringify(font);
144
+ const cached = this.fontHashIndex.get(key);
145
+ if (cached !== undefined)
146
+ return cached;
147
+ const fontNode = new XmlNode("font")
148
+ .append(new XmlNode("sz").attr("val", (_c = (_a = font.sz) !== null && _a !== void 0 ? _a : (_b = this.defaultStyle.font) === null || _b === void 0 ? void 0 : _b.sz) !== null && _c !== void 0 ? _c : 11))
149
+ .append(new XmlNode("name").attr("val", (_f = (_d = font.name) !== null && _d !== void 0 ? _d : (_e = this.defaultStyle.font) === null || _e === void 0 ? void 0 : _e.name) !== null && _f !== void 0 ? _f : "Calibri"));
150
+ if (font.bold)
151
+ fontNode.append(new XmlNode("b"));
152
+ if (font.underline)
153
+ fontNode.append(new XmlNode("u"));
154
+ if (font.italic)
155
+ fontNode.append(new XmlNode("i"));
156
+ if (font.strike)
157
+ fontNode.append(new XmlNode("strike"));
158
+ if (font.outline)
159
+ fontNode.append(new XmlNode("outline"));
160
+ if (font.shadow)
161
+ fontNode.append(new XmlNode("shadow"));
162
+ if (font.vertAlign)
163
+ fontNode.append(new XmlNode("vertAlign").attr("val", font.vertAlign));
164
+ if (font.color)
165
+ fontNode.append(colorNode("color", font.color, false));
166
+ this.fonts.append(fontNode).attr("count", this.fonts.children().length);
167
+ const id = this.fonts.children().length - 1;
168
+ this.fontHashIndex.set(key, id);
169
+ return id;
170
+ }
171
+ addNumFmt(numFmt) {
172
+ if (numFmt === undefined || numFmt === null || numFmt === "")
173
+ return 0;
174
+ if (typeof numFmt === "number") {
175
+ // Numeric numFmt values are OOXML built-in ids only. Custom ids (>= 164)
176
+ // need a matching <numFmt formatCode="..."> entry, and a number alone
177
+ // does not provide that format code. Require callers to pass custom
178
+ // formats as strings so we can write valid, self-contained styles.xml.
179
+ if (!Number.isInteger(numFmt) || numFmt < 0 || numFmt > maxBuiltInNumFmtId) {
180
+ throw new Error(`Numeric numFmt values must be built-in IDs between 0 and ${maxBuiltInNumFmtId}; use a string format code for custom formats.`);
181
+ }
182
+ return numFmt;
183
+ }
184
+ const builtInId = builtInNumberFormats[numFmt];
185
+ if (builtInId !== undefined) {
186
+ return builtInId;
187
+ }
188
+ // A bare integer string with no leading zeros that falls in the built-in id
189
+ // range is treated as a built-in numFmtId. Anything else (e.g. "00000" zip
190
+ // codes, or ids >= 164 which need their own entry) is a custom format code.
191
+ if (/^[1-9][0-9]*$/.test(numFmt) && Number(numFmt) <= maxBuiltInNumFmtId) {
192
+ return Number(numFmt);
193
+ }
194
+ const cached = this.numFmtHashIndex.get(numFmt);
195
+ if (cached !== undefined)
196
+ return cached;
197
+ const id = ++this.customNumFmtId;
198
+ this.numFmts.append(new XmlNode("numFmt").attr("numFmtId", id).attr("formatCode", numFmt)).attr("count", this.numFmts.children().length);
199
+ this.numFmtHashIndex.set(numFmt, id);
200
+ return id;
201
+ }
202
+ addFill(fill) {
203
+ var _a;
204
+ if (!fill)
205
+ return 0;
206
+ const key = stableStringify(fill);
207
+ const cached = this.fillHashIndex.get(key);
208
+ if (cached !== undefined)
209
+ return cached;
210
+ const patternFill = new XmlNode("patternFill").attr("patternType", (_a = fill.patternType) !== null && _a !== void 0 ? _a : "solid");
211
+ if (fill.fgColor && hasColor(fill.fgColor)) {
212
+ patternFill.append(colorNode("fgColor", fill.fgColor, true));
213
+ if (!fill.bgColor) {
214
+ patternFill.append(new XmlNode("bgColor").attr("indexed", 64));
215
+ }
216
+ }
217
+ if (fill.bgColor && hasColor(fill.bgColor)) {
218
+ patternFill.append(colorNode("bgColor", fill.bgColor, false));
219
+ }
220
+ this.fills.append(new XmlNode("fill").append(patternFill)).attr("count", this.fills.children().length);
221
+ const id = this.fills.children().length - 1;
222
+ this.fillHashIndex.set(key, id);
223
+ return id;
224
+ }
225
+ addBorder(border) {
226
+ if (!border)
227
+ return 0;
228
+ const key = stableStringify(border);
229
+ const cached = this.borderHashIndex.get(key);
230
+ if (cached !== undefined)
231
+ return cached;
232
+ const diagonal = border.diagonal;
233
+ const borderNode = new XmlNode("border").attr("diagonalUp", diagonal === null || diagonal === void 0 ? void 0 : diagonal.diagonalUp).attr("diagonalDown", diagonal === null || diagonal === void 0 ? void 0 : diagonal.diagonalDown);
234
+ ["left", "right", "top", "bottom", "diagonal"].forEach((direction) => {
235
+ borderNode.append(borderPartNode(direction, border[direction]));
236
+ });
237
+ this.borders.append(borderNode).attr("count", this.borders.children().length);
238
+ const id = this.borders.children().length - 1;
239
+ this.borderHashIndex.set(key, id);
240
+ return id;
241
+ }
242
+ }
243
+ const builtInNumberFormats = {
244
+ General: 0,
245
+ "0": 1,
246
+ "0.00": 2,
247
+ "#,##0": 3,
248
+ "#,##0.00": 4,
249
+ "0%": 9,
250
+ "0.00%": 10,
251
+ "0.00E+00": 11,
252
+ "# ?/?": 12,
253
+ "# ??/??": 13,
254
+ "m/d/yy": 14,
255
+ "d-mmm-yy": 15,
256
+ "d-mmm": 16,
257
+ "mmm-yy": 17,
258
+ "h:mm AM/PM": 18,
259
+ "h:mm:ss AM/PM": 19,
260
+ "h:mm": 20,
261
+ "h:mm:ss": 21,
262
+ "m/d/yy h:mm": 22,
263
+ "#,##0 ;(#,##0)": 37,
264
+ "#,##0 ;[Red](#,##0)": 38,
265
+ "#,##0.00;(#,##0.00)": 39,
266
+ "#,##0.00;[Red](#,##0.00)": 40,
267
+ "mm:ss": 45,
268
+ "[h]:mm:ss": 46,
269
+ "mmss.0": 47,
270
+ "##0.0E+0": 48,
271
+ "@": 49,
272
+ '"上午/下午 "hh"時"mm"分"ss"秒 "': 56,
273
+ };
274
+ const maxBuiltInNumFmtId = 163;
275
+ const mergeCellStyles = (...styles) => {
276
+ return styles.reduce((mergedStyle, style) => {
277
+ if (!style)
278
+ return mergedStyle;
279
+ return deepMerge(mergedStyle, style);
280
+ }, {});
281
+ };
282
+ exports.mergeCellStyles = mergeCellStyles;
283
+ const isCellStyleObject = (style) => {
284
+ // Only treat plain objects as styles. Excluding arrays and Date instances
285
+ // keeps non-style values (e.g. a Date used as a cell value) from being merged
286
+ // and hashed as styles, which would bloat or corrupt styles.xml.
287
+ return Boolean(style) && typeof style === "object" && !Array.isArray(style) && !(style instanceof Date);
288
+ };
289
+ exports.isCellStyleObject = isCellStyleObject;
290
+ const hasMeaningfulValue = (value) => value !== undefined && value !== null && value !== "" && value !== false;
291
+ const hasEffectiveAlignment = (alignment) => {
292
+ return Boolean(alignment) && Object.values(alignment).some(hasMeaningfulValue);
293
+ };
294
+ const hasEffectiveFont = (font) => {
295
+ return Boolean(font &&
296
+ (font.bold ||
297
+ font.italic ||
298
+ font.outline ||
299
+ font.shadow ||
300
+ font.strike ||
301
+ font.underline ||
302
+ hasMeaningfulValue(font.name) ||
303
+ hasMeaningfulValue(font.sz) ||
304
+ hasMeaningfulValue(font.vertAlign) ||
305
+ (font.color && hasColor(font.color))));
306
+ };
307
+ const hasEffectiveFill = (fill) => {
308
+ return Boolean(fill &&
309
+ (fill.patternType === "solid" ||
310
+ fill.patternType === "gray125" ||
311
+ (fill.fgColor && hasColor(fill.fgColor)) ||
312
+ (fill.bgColor && hasColor(fill.bgColor))));
313
+ };
314
+ const hasEffectiveBorderSide = (side) => {
315
+ return Boolean(side && (side.style || (side.color && hasColor(side.color))));
316
+ };
317
+ const hasEffectiveBorder = (border) => {
318
+ var _a, _b;
319
+ return Boolean(border &&
320
+ (hasEffectiveBorderSide(border.top) ||
321
+ hasEffectiveBorderSide(border.bottom) ||
322
+ hasEffectiveBorderSide(border.left) ||
323
+ hasEffectiveBorderSide(border.right) ||
324
+ hasEffectiveBorderSide(border.diagonal) ||
325
+ ((_a = border.diagonal) === null || _a === void 0 ? void 0 : _a.diagonalUp) ||
326
+ ((_b = border.diagonal) === null || _b === void 0 ? void 0 : _b.diagonalDown)));
327
+ };
328
+ const hasEffectiveNumFmt = (numFmt) => {
329
+ return numFmt !== undefined && numFmt !== null && numFmt !== "" && numFmt !== 0 && numFmt !== "General";
330
+ };
331
+ const hasEffectiveCellStyle = (style) => {
332
+ if (!(0, exports.isCellStyleObject)(style))
333
+ return false;
334
+ // Empty/no-op style objects must not write s="..." markers. They are common
335
+ // when callers build cell objects conditionally, and treating them as real
336
+ // styles bloats styles.xml without changing the rendered workbook.
337
+ return (hasEffectiveAlignment(style.alignment) ||
338
+ hasEffectiveBorder(style.border) ||
339
+ hasEffectiveFill(style.fill) ||
340
+ hasEffectiveFont(style.font) ||
341
+ hasEffectiveNumFmt(style.numFmt));
342
+ };
343
+ const patchStyledWorkbook = (workbook, workbookData) => {
344
+ const styleBuilder = new StyleBuilder();
345
+ const sheetStyles = workbook.SheetNames.map((sheetName) => {
346
+ const worksheet = workbook.Sheets[sheetName];
347
+ const stylesByRef = new Map();
348
+ Object.keys(worksheet).forEach((cellRef) => {
349
+ if (!isCellRef(cellRef))
350
+ return;
351
+ const cell = worksheet[cellRef];
352
+ const style = getCellStyle(cell);
353
+ if (!style)
354
+ return;
355
+ stylesByRef.set(cellRef, styleBuilder.addStyle(style));
356
+ });
357
+ return stylesByRef;
358
+ });
359
+ const zip = (0, fflate_1.unzipSync)(toUint8Array(workbookData));
360
+ zip["xl/styles.xml"] = (0, fflate_1.strToU8)(styleBuilder.toXml());
361
+ sheetStyles.forEach((stylesByRef, index) => {
362
+ const path = `xl/worksheets/sheet${index + 1}.xml`;
363
+ const worksheetXml = zip[path];
364
+ if (!worksheetXml)
365
+ return;
366
+ zip[path] = (0, fflate_1.strToU8)(patchWorksheetXml((0, fflate_1.strFromU8)(worksheetXml), stylesByRef));
367
+ });
368
+ return (0, fflate_1.zipSync)(zip);
369
+ };
370
+ exports.patchStyledWorkbook = patchStyledWorkbook;
371
+ const toArrayBuffer = (data) => {
372
+ const output = new ArrayBuffer(data.byteLength);
373
+ new Uint8Array(output).set(data);
374
+ return output;
375
+ };
376
+ const toStyledOutput = (data, type) => {
377
+ switch (type) {
378
+ case "array":
379
+ return toArrayBuffer(data);
380
+ // "string" and "binary" both yield a binary string, matching the string
381
+ // return type the xlsx() overloads advertise for those write types.
382
+ case "string":
383
+ case "binary":
384
+ return uint8ToBinaryString(data);
385
+ case "base64":
386
+ return uint8ToBase64(data);
387
+ case "buffer":
388
+ default:
389
+ return typeof Buffer !== "undefined" ? Buffer.from(data) : data;
390
+ }
391
+ };
392
+ exports.toStyledOutput = toStyledOutput;
393
+ const saveXlsxOutput = (data, filename) => {
394
+ var _a;
395
+ if (typeof document !== "undefined" && typeof Blob !== "undefined" && typeof URL !== "undefined" && URL.createObjectURL) {
396
+ const bytes = toUint8Array(data);
397
+ const blobData = bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength);
398
+ const blob = new Blob([blobData], { type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" });
399
+ const url = URL.createObjectURL(blob);
400
+ const link = document.createElement("a");
401
+ link.href = url;
402
+ link.download = filename;
403
+ link.rel = "noopener";
404
+ link.style.display = "none";
405
+ ((_a = document.body) !== null && _a !== void 0 ? _a : document.documentElement).appendChild(link);
406
+ link.click();
407
+ setTimeout(() => {
408
+ var _a;
409
+ (_a = link.parentNode) === null || _a === void 0 ? void 0 : _a.removeChild(link);
410
+ URL.revokeObjectURL(url);
411
+ }, 100);
412
+ return;
413
+ }
414
+ const fs = loadNodeFs();
415
+ if (!fs) {
416
+ throw new Error("Unable to write workbook file in this environment");
417
+ }
418
+ fs.writeFileSync(filename, Buffer.from(toUint8Array(data)));
419
+ };
420
+ exports.saveXlsxOutput = saveXlsxOutput;
421
+ // Resolve Node's "fs" module across runtimes. Prefer process.getBuiltinModule
422
+ // (Node >= 22.3), and fall back to the CommonJS module require for older Node
423
+ // versions. module.require (rather than the bare require global) keeps bundlers
424
+ // from trying to statically resolve "fs" in browser builds.
425
+ const loadNodeFs = () => {
426
+ if (typeof process === "undefined")
427
+ return undefined;
428
+ const runtime = process;
429
+ try {
430
+ if (typeof runtime.getBuiltinModule === "function") {
431
+ return runtime.getBuiltinModule("fs");
432
+ }
433
+ if (typeof module !== "undefined" && typeof module.require === "function") {
434
+ return module.require("fs");
435
+ }
436
+ }
437
+ catch (_a) {
438
+ return undefined;
439
+ }
440
+ return undefined;
441
+ };
442
+ const getCellStyle = (cell) => {
443
+ if (!cell)
444
+ return undefined;
445
+ const styles = [];
446
+ if (hasEffectiveCellStyle(cell.s))
447
+ styles.push(cell.s);
448
+ if (cell.z)
449
+ styles.push({ numFmt: cell.z });
450
+ if (styles.length === 0)
451
+ return undefined;
452
+ const style = (0, exports.mergeCellStyles)(...styles);
453
+ return hasEffectiveCellStyle(style) ? style : undefined;
454
+ };
455
+ const patchWorksheetXml = (xml, stylesByRef) => {
456
+ return xml.replace(/<c\b[^>]*>/g, (cellTag) => {
457
+ const refMatch = cellTag.match(/\br=(["'])(.*?)\1/);
458
+ if (!refMatch)
459
+ return cellTag;
460
+ const styleIndex = stylesByRef.get(refMatch[2]);
461
+ const withoutStyle = cellTag.replace(/\s+s=(["']).*?\1/, "");
462
+ if (styleIndex === undefined) {
463
+ return withoutStyle;
464
+ }
465
+ const end = withoutStyle.endsWith("/>") ? "/>" : ">";
466
+ return `${withoutStyle.slice(0, -end.length)} s="${styleIndex}"${end}`;
467
+ });
468
+ };
469
+ const borderPartNode = (direction, spec) => {
470
+ const directionNode = new XmlNode(direction);
471
+ if (!spec)
472
+ return directionNode;
473
+ const colored = Boolean(spec.color) && hasColor(spec.color);
474
+ // A border side only renders when it has a style. Honor an explicit style;
475
+ // otherwise default to "thin" when a color was given, and emit nothing for an
476
+ // empty/color-less spec instead of forcing a "medium" border.
477
+ if (spec.style) {
478
+ directionNode.attr("style", spec.style);
479
+ }
480
+ else if (colored) {
481
+ directionNode.attr("style", "thin");
482
+ }
483
+ if (colored)
484
+ directionNode.append(colorNode("color", spec.color, false));
485
+ return directionNode;
486
+ };
487
+ const colorNode = (tagName, color, withAlpha) => {
488
+ const node = new XmlNode(tagName);
489
+ if (color.auto !== undefined)
490
+ node.attr("auto", color.auto ? 1 : 0);
491
+ if (color.indexed !== undefined)
492
+ node.attr("indexed", color.indexed);
493
+ if (color.theme !== undefined)
494
+ node.attr("theme", color.theme);
495
+ if (color.tint !== undefined)
496
+ node.attr("tint", color.tint);
497
+ if (color.rgb)
498
+ node.attr("rgb", withAlpha && color.rgb.length === 6 ? `FF${color.rgb}` : color.rgb);
499
+ return node;
500
+ };
501
+ const hasColor = (color) => {
502
+ return color.auto !== undefined || color.indexed !== undefined || color.theme !== undefined || color.tint !== undefined || Boolean(color.rgb);
503
+ };
504
+ const escapeXmlAttribute = (value) => {
505
+ return value.replace(/&/g, "&amp;").replace(/"/g, "&quot;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/'/g, "&apos;");
506
+ };
507
+ const isCellRef = (value) => /^[A-Z]+[0-9]+$/.test(value);
508
+ const toUint8Array = (data) => {
509
+ return data instanceof Uint8Array ? data : new Uint8Array(data);
510
+ };
511
+ const binaryStringChunkSize = 0x8000;
512
+ const uint8ToBinaryString = (data) => {
513
+ if (typeof Buffer !== "undefined") {
514
+ return Buffer.from(data).toString("binary");
515
+ }
516
+ const chunks = [];
517
+ for (let index = 0; index < data.length; index += binaryStringChunkSize) {
518
+ chunks.push(String.fromCharCode(...data.subarray(index, index + binaryStringChunkSize)));
519
+ }
520
+ return chunks.join("");
521
+ };
522
+ const uint8ToBase64 = (data) => {
523
+ if (typeof Buffer !== "undefined") {
524
+ return Buffer.from(data).toString("base64");
525
+ }
526
+ return btoa(uint8ToBinaryString(data));
527
+ };
528
+ const stableStringify = (value) => {
529
+ if (!isPlainObject(value)) {
530
+ return JSON.stringify(value);
531
+ }
532
+ const entries = Object.keys(value)
533
+ .filter((key) => value[key] !== undefined)
534
+ .sort()
535
+ .map((key) => `"${key}":${stableStringify(value[key])}`);
536
+ return `{${entries.join(",")}}`;
537
+ };
538
+ const deepMerge = (base, override) => {
539
+ if (!isPlainObject(base) || !isPlainObject(override)) {
540
+ return cloneValue(override);
541
+ }
542
+ const result = Object.assign({}, base);
543
+ Object.keys(override).forEach((key) => {
544
+ const overrideValue = override[key];
545
+ if (overrideValue === undefined)
546
+ return;
547
+ result[key] = key in result ? deepMerge(result[key], overrideValue) : cloneValue(overrideValue);
548
+ });
549
+ return result;
550
+ };
551
+ const cloneValue = (value) => {
552
+ if (Array.isArray(value))
553
+ return value.map(cloneValue);
554
+ if (isPlainObject(value)) {
555
+ const clone = {};
556
+ Object.keys(value).forEach((key) => {
557
+ clone[key] = cloneValue(value[key]);
558
+ });
559
+ return clone;
560
+ }
561
+ return value;
562
+ };
563
+ const isPlainObject = (value) => {
564
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value) && !(value instanceof Date);
565
+ };
566
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3R5bGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3N0eWxlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtQ0FBK0Q7QUFzRi9ELE1BQU0sT0FBTztJQUtYLFlBQW9CLE9BQWUsRUFBRSxhQUE0QixFQUFFLEVBQUUsV0FBc0IsRUFBRTtRQUF6RSxZQUFPLEdBQVAsT0FBTyxDQUFRO1FBRjNCLGVBQVUsR0FBRyxFQUFFLENBQUE7UUFHckIsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUE7UUFDNUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxRQUFRLENBQUE7SUFDNUIsQ0FBQztJQUVELE1BQU0sQ0FBQyxJQUFhO1FBQ2xCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQzFCLE9BQU8sSUFBSSxDQUFBO0lBQ2IsQ0FBQztJQUVELElBQUksQ0FBQyxJQUE0QixFQUFFLEtBQWlDO1FBQ2xFLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDN0IsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ3hCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQTtZQUM5QixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUE7WUFDL0IsQ0FBQztZQUNELE9BQU8sSUFBSSxDQUFBO1FBQ2IsQ0FBQztRQUVELE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDaEMsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQ2hDLElBQUksY0FBYyxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUNqQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLGNBQWMsQ0FBQTtZQUN2QyxD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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "json-as-xlsx",
3
- "version": "2.5.8",
3
+ "version": "2.6.0",
4
4
  "license": "MIT",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -16,7 +16,8 @@
16
16
  "test": "jest --coverage"
17
17
  },
18
18
  "dependencies": {
19
- "@e965/xlsx": "^0.20.3"
19
+ "@e965/xlsx": "^0.20.3",
20
+ "fflate": "^0.8.3"
20
21
  },
21
22
  "devDependencies": {
22
23
  "@types/jest": "^30.0.0",