han-excel-builder 1.0.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 +286 -0
- package/dist/han-excel.cjs.js +2 -0
- package/dist/han-excel.cjs.js.map +1 -0
- package/dist/han-excel.es.js +1031 -0
- package/dist/han-excel.es.js.map +1 -0
- package/dist/index.d.ts +1568 -0
- package/package.json +93 -0
package/README.md
ADDED
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
# Han Excel Builder
|
|
2
|
+
|
|
3
|
+
๐ **Advanced Excel file generator with TypeScript support, comprehensive styling, and optimized performance**
|
|
4
|
+
|
|
5
|
+
A modern, fully-typed library for creating complex Excel reports with multiple worksheets, advanced styling, and high performance.
|
|
6
|
+
|
|
7
|
+
## โจ Features
|
|
8
|
+
|
|
9
|
+
- ๐ **Multiple Worksheets Support** - Create complex workbooks with multiple sheets
|
|
10
|
+
- ๐จ **Advanced Styling** - Full control over fonts, colors, borders, and cell formatting
|
|
11
|
+
- ๐ **Data Types** - Support for strings, numbers, dates, percentages, and custom formats
|
|
12
|
+
- ๐ง **TypeScript First** - Complete type safety with comprehensive interfaces
|
|
13
|
+
- โก **High Performance** - Optimized for large datasets with streaming support
|
|
14
|
+
- ๐งช **Fully Tested** - Comprehensive test suite with 100% coverage
|
|
15
|
+
- ๐ **Well Documented** - Complete API documentation with examples
|
|
16
|
+
- ๐ ๏ธ **Developer Friendly** - ESLint, Prettier, and modern tooling
|
|
17
|
+
|
|
18
|
+
## ๐ฆ Installation
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
npm install han-excel-builder
|
|
22
|
+
# or
|
|
23
|
+
yarn add han-excel-builder
|
|
24
|
+
# or
|
|
25
|
+
pnpm add han-excel-builder
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## ๐ Quick Start
|
|
29
|
+
|
|
30
|
+
```typescript
|
|
31
|
+
import { ExcelBuilder, CellType, NumberFormat, StyleBuilder } from 'han-excel-builder';
|
|
32
|
+
|
|
33
|
+
// Create a simple report
|
|
34
|
+
const builder = new ExcelBuilder();
|
|
35
|
+
|
|
36
|
+
const worksheet = builder.addWorksheet('Sales Report');
|
|
37
|
+
|
|
38
|
+
// Add headers
|
|
39
|
+
worksheet.addHeader({
|
|
40
|
+
key: 'title',
|
|
41
|
+
value: 'Monthly Sales Report',
|
|
42
|
+
type: CellType.STRING,
|
|
43
|
+
mergeCell: true,
|
|
44
|
+
styles: StyleBuilder.create()
|
|
45
|
+
.fontBold()
|
|
46
|
+
.fontSize(16)
|
|
47
|
+
.centerAlign()
|
|
48
|
+
.build()
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
// Add sub-headers
|
|
52
|
+
worksheet.addSubHeaders([
|
|
53
|
+
{
|
|
54
|
+
key: 'product',
|
|
55
|
+
value: 'Product',
|
|
56
|
+
type: CellType.STRING,
|
|
57
|
+
width: 20
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
key: 'sales',
|
|
61
|
+
value: 'Sales',
|
|
62
|
+
type: CellType.NUMBER,
|
|
63
|
+
width: 15,
|
|
64
|
+
numberFormat: NumberFormat.CURRENCY
|
|
65
|
+
}
|
|
66
|
+
]);
|
|
67
|
+
|
|
68
|
+
// Add data
|
|
69
|
+
worksheet.addRow([
|
|
70
|
+
{ key: 'product', value: 'Product A', type: CellType.STRING },
|
|
71
|
+
{ key: 'sales', value: 1500.50, type: CellType.NUMBER }
|
|
72
|
+
]);
|
|
73
|
+
|
|
74
|
+
// Generate and download
|
|
75
|
+
await builder.generateAndDownload('sales-report');
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## ๐ API Documentation
|
|
79
|
+
|
|
80
|
+
### Core Classes
|
|
81
|
+
|
|
82
|
+
#### `ExcelBuilder`
|
|
83
|
+
Main class for creating Excel workbooks.
|
|
84
|
+
|
|
85
|
+
```typescript
|
|
86
|
+
const builder = new ExcelBuilder({
|
|
87
|
+
author: 'Your Name',
|
|
88
|
+
company: 'Your Company',
|
|
89
|
+
created: new Date()
|
|
90
|
+
});
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
#### `Worksheet`
|
|
94
|
+
Represents a single worksheet in the workbook.
|
|
95
|
+
|
|
96
|
+
```typescript
|
|
97
|
+
const worksheet = builder.addWorksheet('Sheet Name', {
|
|
98
|
+
tabColor: '#FF0000',
|
|
99
|
+
defaultRowHeight: 20,
|
|
100
|
+
defaultColWidth: 15
|
|
101
|
+
});
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### Data Types
|
|
105
|
+
|
|
106
|
+
#### `CellType`
|
|
107
|
+
- `STRING` - Text values
|
|
108
|
+
- `NUMBER` - Numeric values
|
|
109
|
+
- `BOOLEAN` - True/false values
|
|
110
|
+
- `DATE` - Date values
|
|
111
|
+
- `PERCENTAGE` - Percentage values
|
|
112
|
+
- `CURRENCY` - Currency values
|
|
113
|
+
|
|
114
|
+
#### `NumberFormat`
|
|
115
|
+
- `GENERAL` - Default format
|
|
116
|
+
- `NUMBER` - Number with optional decimals
|
|
117
|
+
- `CURRENCY` - Currency format
|
|
118
|
+
- `PERCENTAGE` - Percentage format
|
|
119
|
+
- `DATE` - Date format
|
|
120
|
+
- `TIME` - Time format
|
|
121
|
+
- `CUSTOM` - Custom format string
|
|
122
|
+
|
|
123
|
+
### Styling
|
|
124
|
+
|
|
125
|
+
#### `StyleBuilder`
|
|
126
|
+
Fluent API for creating cell styles.
|
|
127
|
+
|
|
128
|
+
```typescript
|
|
129
|
+
const style = StyleBuilder.create()
|
|
130
|
+
.fontBold()
|
|
131
|
+
.fontSize(12)
|
|
132
|
+
.fontColor('#FF0000')
|
|
133
|
+
.backgroundColor('#FFFF00')
|
|
134
|
+
.border('thin', '#000000')
|
|
135
|
+
.centerAlign()
|
|
136
|
+
.verticalAlign('middle')
|
|
137
|
+
.wrapText()
|
|
138
|
+
.build();
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
## ๐ฏ Advanced Examples
|
|
142
|
+
|
|
143
|
+
### Complex Report with Multiple Worksheets
|
|
144
|
+
|
|
145
|
+
```typescript
|
|
146
|
+
import { ExcelBuilder, CellType, NumberFormat, StyleBuilder } from 'han-excel-builder';
|
|
147
|
+
|
|
148
|
+
const builder = new ExcelBuilder({
|
|
149
|
+
author: 'Report Generator',
|
|
150
|
+
company: 'Your Company'
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
// Summary worksheet
|
|
154
|
+
const summarySheet = builder.addWorksheet('Summary');
|
|
155
|
+
summarySheet.addHeader({
|
|
156
|
+
key: 'title',
|
|
157
|
+
value: 'Annual Report Summary',
|
|
158
|
+
type: CellType.STRING,
|
|
159
|
+
mergeCell: true,
|
|
160
|
+
styles: StyleBuilder.create().fontBold().fontSize(18).centerAlign().build()
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
// Detailed worksheet
|
|
164
|
+
const detailSheet = builder.addWorksheet('Details');
|
|
165
|
+
detailSheet.addSubHeaders([
|
|
166
|
+
{ key: 'date', value: 'Date', type: CellType.DATE, width: 12 },
|
|
167
|
+
{ key: 'category', value: 'Category', type: CellType.STRING, width: 15 },
|
|
168
|
+
{ key: 'amount', value: 'Amount', type: CellType.NUMBER, width: 12, numberFormat: NumberFormat.CURRENCY },
|
|
169
|
+
{ key: 'percentage', value: '%', type: CellType.PERCENTAGE, width: 8 }
|
|
170
|
+
]);
|
|
171
|
+
|
|
172
|
+
// Add data with alternating row colors
|
|
173
|
+
data.forEach((row, index) => {
|
|
174
|
+
const rowStyle = index % 2 === 0
|
|
175
|
+
? StyleBuilder.create().backgroundColor('#F0F0F0').build()
|
|
176
|
+
: undefined;
|
|
177
|
+
|
|
178
|
+
detailSheet.addRow([
|
|
179
|
+
{ key: 'date', value: row.date, type: CellType.DATE },
|
|
180
|
+
{ key: 'category', value: row.category, type: CellType.STRING },
|
|
181
|
+
{ key: 'amount', value: row.amount, type: CellType.NUMBER },
|
|
182
|
+
{ key: 'percentage', value: row.percentage, type: CellType.PERCENTAGE }
|
|
183
|
+
], rowStyle);
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
await builder.generateAndDownload('annual-report');
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
### Conditional Styling
|
|
190
|
+
|
|
191
|
+
```typescript
|
|
192
|
+
const style = StyleBuilder.create()
|
|
193
|
+
.conditionalFormat({
|
|
194
|
+
type: 'cellIs',
|
|
195
|
+
operator: 'greaterThan',
|
|
196
|
+
values: [1000],
|
|
197
|
+
style: StyleBuilder.create()
|
|
198
|
+
.backgroundColor('#90EE90')
|
|
199
|
+
.fontColor('#006400')
|
|
200
|
+
.build()
|
|
201
|
+
})
|
|
202
|
+
.build();
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
## ๐งช Testing
|
|
206
|
+
|
|
207
|
+
```bash
|
|
208
|
+
# Run tests
|
|
209
|
+
npm test
|
|
210
|
+
|
|
211
|
+
# Run tests with coverage
|
|
212
|
+
npm run test:coverage
|
|
213
|
+
|
|
214
|
+
# Run tests in watch mode
|
|
215
|
+
npm run test:watch
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
## ๐ ๏ธ Development
|
|
219
|
+
|
|
220
|
+
```bash
|
|
221
|
+
# Install dependencies
|
|
222
|
+
npm install
|
|
223
|
+
|
|
224
|
+
# Start development server
|
|
225
|
+
npm run dev
|
|
226
|
+
|
|
227
|
+
# Build for production
|
|
228
|
+
npm run build
|
|
229
|
+
|
|
230
|
+
# Run linting
|
|
231
|
+
npm run lint
|
|
232
|
+
|
|
233
|
+
# Format code
|
|
234
|
+
npm run format
|
|
235
|
+
|
|
236
|
+
# Generate documentation
|
|
237
|
+
npm run docs
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
## ๐ Migration from legacy-excel
|
|
241
|
+
|
|
242
|
+
If you're migrating from the legacy version, here's a quick comparison:
|
|
243
|
+
|
|
244
|
+
```typescript
|
|
245
|
+
// Legacy way
|
|
246
|
+
const worksheets: IWorksheets[] = [{
|
|
247
|
+
name: "Report",
|
|
248
|
+
tables: [{
|
|
249
|
+
headers: [...],
|
|
250
|
+
subHeaders: [...],
|
|
251
|
+
body: [...],
|
|
252
|
+
footers: [...]
|
|
253
|
+
}]
|
|
254
|
+
}];
|
|
255
|
+
await fileBuilder(worksheets, "report");
|
|
256
|
+
|
|
257
|
+
// New way
|
|
258
|
+
const builder = new ExcelBuilder();
|
|
259
|
+
const worksheet = builder.addWorksheet('Report');
|
|
260
|
+
worksheet.addHeaders([...]);
|
|
261
|
+
worksheet.addSubHeaders([...]);
|
|
262
|
+
worksheet.addRows([...]);
|
|
263
|
+
await builder.generateAndDownload('report');
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
## ๐ค Contributing
|
|
267
|
+
|
|
268
|
+
1. Fork the repository
|
|
269
|
+
2. Create a feature branch (`git checkout -b feature/amazing-feature`)
|
|
270
|
+
3. Commit your changes (`git commit -m 'Add amazing feature'`)
|
|
271
|
+
4. Push to the branch (`git push origin feature/amazing-feature`)
|
|
272
|
+
5. Open a Pull Request
|
|
273
|
+
|
|
274
|
+
## ๐ License
|
|
275
|
+
|
|
276
|
+
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
|
|
277
|
+
|
|
278
|
+
## ๐ Support
|
|
279
|
+
|
|
280
|
+
- ๐ [Documentation](https://github.com/your-org/han-excel-builder/docs)
|
|
281
|
+
- ๐ [Issues](https://github.com/your-org/han-excel-builder/issues)
|
|
282
|
+
- ๐ฌ [Discussions](https://github.com/your-org/han-excel-builder/discussions)
|
|
283
|
+
|
|
284
|
+
---
|
|
285
|
+
|
|
286
|
+
Made with โค๏ธ by the Han Excel Team
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const t=require("exceljs"),e=require("file-saver");class s{listeners=new Map;on(t,e,s={}){this.listeners.has(t)||this.listeners.set(t,[]);const r={type:t,listener:e,options:{once:!1,async:!1,priority:0,stopPropagation:!1,...s},id:this.generateId(),active:!0,timestamp:new Date};return this.listeners.get(t).push(r),this.listeners.get(t).sort((t,e)=>(e.options.priority||0)-(t.options.priority||0)),r.id}once(t,e,s={}){return this.on(t,e,{...s,once:!0})}off(t,e){const s=this.listeners.get(t);if(!s)return!1;const r=s.findIndex(t=>t.id===e);return-1!==r&&(s.splice(r,1),!0)}offAll(t){const e=this.listeners.get(t);if(!e)return 0;const s=e.length;return this.listeners.delete(t),s}async emit(t){const e=t.type||"default",s=this.listeners.get(e);if(!s||0===s.length)return;const r=s.filter(t=>t.active);for(const o of r)try{if(o.options.once&&(o.active=!1),o.options.async?await o.listener(t):o.listener(t),o.options.stopPropagation)break}catch(i){console.error(`Error in event listener for ${e}:`,i)}this.cleanupInactiveListeners(e)}emitSync(t){const e=t.type||"default",s=this.listeners.get(e);if(!s||0===s.length)return;const r=s.filter(t=>t.active);for(const o of r)try{if(o.options.once&&(o.active=!1),o.listener(t),o.options.stopPropagation)break}catch(i){console.error(`Error in event listener for ${e}:`,i)}this.cleanupInactiveListeners(e)}clear(){this.listeners.clear()}getListeners(t){return this.listeners.get(t)||[]}getListenerCount(t){return this.listeners.get(t)?.length||0}getEventTypes(){return Array.from(this.listeners.keys())}generateId(){return Math.random().toString(36).substr(2,9)}cleanupInactiveListeners(t){const e=this.listeners.get(t);if(e){const s=e.filter(t=>t.active);s.length!==e.length&&this.listeners.set(t,s)}}}var r=(t=>(t.STRING="string",t.NUMBER="number",t.BOOLEAN="boolean",t.DATE="date",t.PERCENTAGE="percentage",t.CURRENCY="currency",t.LINK="link",t.FORMULA="formula",t))(r||{}),i=(t=>(t.GENERAL="General",t.NUMBER="#,##0",t.NUMBER_DECIMALS="#,##0.00",t.CURRENCY="$#,##0.00",t.CURRENCY_INTEGER="$#,##0",t.PERCENTAGE="0%",t.PERCENTAGE_DECIMALS="0.00%",t.DATE="dd/mm/yyyy",t.DATE_TIME="dd/mm/yyyy hh:mm",t.TIME="hh:mm:ss",t.CUSTOM="custom",t))(i||{}),o=(t=>(t.LEFT="left",t.CENTER="center",t.RIGHT="right",t.FILL="fill",t.JUSTIFY="justify",t.CENTER_CONTINUOUS="centerContinuous",t.DISTRIBUTED="distributed",t))(o||{}),n=(t=>(t.TOP="top",t.MIDDLE="middle",t.BOTTOM="bottom",t.DISTRIBUTED="distributed",t.JUSTIFY="justify",t))(n||{}),l=(t=>(t.THIN="thin",t.MEDIUM="medium",t.THICK="thick",t.DOTTED="dotted",t.DASHED="dashed",t.DOUBLE="double",t.HAIR="hair",t.MEDIUM_DASHED="mediumDashed",t.DASH_DOT="dashDot",t.MEDIUM_DASH_DOT="mediumDashDot",t.DASH_DOT_DOT="dashDotDot",t.MEDIUM_DASH_DOT_DOT="mediumDashDotDot",t.SLANT_DASH_DOT="slantDashDot",t))(l||{}),a=(t=>(t.NORMAL="normal",t.BOLD="bold",t.ITALIC="italic",t.BOLD_ITALIC="bold italic",t))(a||{}),h=(t=>(t.VALIDATION_ERROR="VALIDATION_ERROR",t.BUILD_ERROR="BUILD_ERROR",t.STYLE_ERROR="STYLE_ERROR",t.WORKSHEET_ERROR="WORKSHEET_ERROR",t.CELL_ERROR="CELL_ERROR",t))(h||{});class d{config;tables=[];currentRow=1;currentCol=1;headerPointers=new Map;isBuilt=!1;headers=[];subHeaders=[];body=[];footers=[];constructor(t){this.config=t}addHeader(t){return this.headers.push(t),this}addSubHeaders(t){return this.subHeaders.push(...t),this}addRow(t){return Array.isArray(t)?this.body.push(...t):this.body.push(t),this}addFooter(t){return Array.isArray(t)?this.footers.push(...t):this.footers.push(t),this}async build(t,e={}){const s=t.addWorksheet(this.config.name,{properties:{defaultRowHeight:this.config.defaultRowHeight||20,tabColor:this.config.tabColor},pageSetup:this.config.pageSetup});let r=1;if(this.headers.length>0&&this.headers.forEach(t=>{s.addRow([t.value]),t.mergeCell&&s.mergeCells(r,1,r,this.subHeaders.length||1),t.styles&&s.getRow(r).eachCell(e=>{e.style=this.convertStyle(t.styles)}),r++}),this.subHeaders.length>0){const t=this.subHeaders.map(t=>t.value);s.addRow(t),this.subHeaders.forEach((t,e)=>{t.styles&&(s.getRow(r).getCell(e+1).style=this.convertStyle(t.styles))}),r++}for(const i of this.body)r=this.addDataRowRecursive(s,r,i);if(this.footers.length>0)for(const i of this.footers)s.addRow([i.value]),i.mergeCell&&i.mergeTo&&s.mergeCells(r,1,r,i.mergeTo),i.styles&&s.getRow(r).eachCell(t=>{t.style=this.convertStyle(i.styles)}),r++;this.isBuilt=!0}validate(){return this.headers.length||this.body.length?{success:!0,data:!0}:{success:!1,error:{type:h.VALIDATION_ERROR,message:"La hoja no tiene datos"}}}addDataRowRecursive(t,e,s,r=1){const i=t.getRow(e).getCell(r);i.value=s.value,s.styles&&(i.style=this.convertStyle(s.styles)),s.numberFormat&&(i.numFmt=s.numberFormat);let o=e;if(s.children&&s.children.length>0){let i=e;for(const e of s.children){i++;const s=this.addDataRowRecursive(t,i,e,r+1);s>o&&(o=s)}}return o}convertStyle(t){if(!t)return{};const e={};return t.font&&(e.font={name:t.font.family,size:t.font.size,bold:t.font.bold,italic:t.font.italic,underline:t.font.underline,color:t.font.color}),t.fill&&(e.fill={type:t.fill.type,pattern:t.fill.pattern,fgColor:t.fill.fgColor,bgColor:t.fill.bgColor}),t.border&&(e.border={top:t.border.top,left:t.border.left,bottom:t.border.bottom,right:t.border.right}),t.alignment&&(e.alignment={horizontal:t.alignment.horizontal,vertical:t.alignment.vertical,wrapText:t.alignment.wrapText,indent:t.alignment.indent}),t.numFmt&&(e.numFmt=t.numFmt),e}}var c=(t=>(t.WORKSHEET_ADDED="worksheetAdded",t.WORKSHEET_REMOVED="worksheetRemoved",t.WORKSHEET_UPDATED="worksheetUpdated",t.BUILD_STARTED="buildStarted",t.BUILD_PROGRESS="buildProgress",t.BUILD_COMPLETED="buildCompleted",t.BUILD_ERROR="buildError",t.DOWNLOAD_STARTED="downloadStarted",t.DOWNLOAD_PROGRESS="downloadProgress",t.DOWNLOAD_COMPLETED="downloadCompleted",t.DOWNLOAD_ERROR="downloadError",t))(c||{});class u{config;worksheets=new Map;currentWorksheet;isBuilding=!1;stats;eventEmitter;constructor(t={}){this.config={enableValidation:!0,enableEvents:!0,enablePerformanceMonitoring:!1,maxWorksheets:255,maxRowsPerWorksheet:1048576,maxColumnsPerWorksheet:16384,memoryLimit:104857600,...t},this.stats=this.initializeStats(),this.eventEmitter=new s}addWorksheet(t,e={}){if(this.worksheets.has(t))throw new Error(`Worksheet "${t}" already exists`);const s={name:t,defaultRowHeight:20,defaultColWidth:10,...this.config.defaultWorksheetConfig,...e},r=new d(s);return this.worksheets.set(t,r),this.currentWorksheet=r,this.emitEvent(c.WORKSHEET_ADDED,{worksheetName:t}),r}getWorksheet(t){return this.worksheets.get(t)}removeWorksheet(t){const e=this.worksheets.get(t);return!!e&&(this.worksheets.delete(t),this.currentWorksheet===e&&(this.currentWorksheet=void 0),this.emitEvent(c.WORKSHEET_REMOVED,{worksheetName:t}),!0)}setCurrentWorksheet(t){const e=this.worksheets.get(t);return!!e&&(this.currentWorksheet=e,!0)}async build(e={}){if(this.isBuilding)return{success:!1,error:{type:h.BUILD_ERROR,message:"Build already in progress",stack:(new Error).stack||""}};this.isBuilding=!0;const s=Date.now();try{this.emitEvent(c.BUILD_STARTED);const r=new t.Workbook;this.config.metadata&&(r.creator=this.config.metadata.author||"Han Excel Builder",r.lastModifiedBy=this.config.metadata.author||"Han Excel Builder",r.created=this.config.metadata.created||new Date,r.modified=this.config.metadata.modified||new Date,this.config.metadata.title&&(r.title=this.config.metadata.title),this.config.metadata.subject&&(r.subject=this.config.metadata.subject),this.config.metadata.keywords&&(r.keywords=this.config.metadata.keywords),this.config.metadata.category&&(r.category=this.config.metadata.category),this.config.metadata.description&&(r.description=this.config.metadata.description));for(const t of this.worksheets.values())await t.build(r,e);const i=await r.xlsx.writeBuffer({compression:e.compressionLevel||6}),o=Date.now();this.stats.buildTime=o-s,this.stats.fileSize=i.byteLength;const n={success:!0,data:i};return this.emitEvent(c.BUILD_COMPLETED,{buildTime:this.stats.buildTime,fileSize:this.stats.fileSize}),n}catch(r){const t={success:!1,error:{type:h.BUILD_ERROR,message:r instanceof Error?r.message:"Unknown build error",stack:r instanceof Error&&r.stack||""}};return this.emitEvent(c.BUILD_ERROR,{error:t.error}),t}finally{this.isBuilding=!1}}async generateAndDownload(t,s={}){const r=await this.build(s);if(!r.success)return r;try{this.emitEvent(c.DOWNLOAD_STARTED,{fileName:t});const i=new Blob([r.data],{type:s.mimeType||"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"});return e(i,t),this.emitEvent(c.DOWNLOAD_COMPLETED,{fileName:t}),{success:!0,data:void 0}}catch(i){const t={success:!1,error:{type:h.BUILD_ERROR,message:i instanceof Error?i.message:"Download failed",stack:i instanceof Error&&i.stack||""}};return this.emitEvent(c.DOWNLOAD_ERROR,{error:t.error}),t}}async toBuffer(t={}){return this.build(t)}async toBlob(t={}){const e=await this.build(t);if(!e.success)return e;return{success:!0,data:new Blob([e.data],{type:"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"})}}validate(){const t=[];0===this.worksheets.size&&t.push("No worksheets found");for(const[e,s]of this.worksheets.entries()){const r=s.validate();r.success||t.push(`Worksheet "${e}": ${r.error?.message}`)}return t.length>0?{success:!1,error:{type:h.VALIDATION_ERROR,message:t.join("; "),stack:(new Error).stack||""}}:{success:!0,data:!0}}clear(){this.worksheets.clear(),this.currentWorksheet=void 0}getStats(){return{...this.stats}}on(t,e){return this.eventEmitter.on(t,e)}off(t,e){return this.eventEmitter.off(t,e)}removeAllListeners(t){t?this.eventEmitter.offAll(t):this.eventEmitter.clear()}emitEvent(t,e){const s={type:t,data:e||{},timestamp:new Date};this.eventEmitter.emitSync(s)}initializeStats(){return{totalWorksheets:0,totalCells:0,memoryUsage:0,buildTime:0,fileSize:0,stylesUsed:0,formulasUsed:0,conditionalFormatsUsed:0,performance:{headersTime:0,dataTime:0,stylesTime:0,writeTime:0}}}}class m{style={};static create(){return new m}fontName(t){return this.style.font||(this.style.font={}),this.style.font.name=t,this}fontSize(t){return this.style.font||(this.style.font={}),this.style.font.size=t,this}fontStyle(t){return this.style.font||(this.style.font={}),this.style.font.style=t,this}fontColor(t){return this.style.font||(this.style.font={}),this.style.font.color=t,this}fontBold(){return this.style.font||(this.style.font={}),this.style.font.bold=!0,this}fontItalic(){return this.style.font||(this.style.font={}),this.style.font.italic=!0,this}fontUnderline(){return this.style.font||(this.style.font={}),this.style.font.underline=!0,this}border(t,e){this.style.border||(this.style.border={});const s={style:t};return void 0!==e&&(s.color=e),this.style.border.top=s,this.style.border.left=s,this.style.border.bottom=s,this.style.border.right=s,this}borderTop(t,e){this.style.border||(this.style.border={});const s={style:t};return void 0!==e&&(s.color=e),this.style.border.top=s,this}borderLeft(t,e){this.style.border||(this.style.border={});const s={style:t};return void 0!==e&&(s.color=e),this.style.border.left=s,this}borderBottom(t,e){this.style.border||(this.style.border={});const s={style:t};return void 0!==e&&(s.color=e),this.style.border.bottom=s,this}borderRight(t,e){this.style.border||(this.style.border={});const s={style:t};return void 0!==e&&(s.color=e),this.style.border.right=s,this}backgroundColor(t){return this.style.fill||(this.style.fill={type:"pattern"}),this.style.fill.backgroundColor=t,this.style.fill.pattern="solid",this}horizontalAlign(t){return this.style.alignment||(this.style.alignment={}),this.style.alignment.horizontal=t,this}verticalAlign(t){return this.style.alignment||(this.style.alignment={}),this.style.alignment.vertical=t,this}centerAlign(){return this.style.alignment||(this.style.alignment={}),this.style.alignment.horizontal=o.CENTER,this.style.alignment.vertical=n.MIDDLE,this}leftAlign(){return this.style.alignment||(this.style.alignment={}),this.style.alignment.horizontal=o.LEFT,this}rightAlign(){return this.style.alignment||(this.style.alignment={}),this.style.alignment.horizontal=o.RIGHT,this}wrapText(){return this.style.alignment||(this.style.alignment={}),this.style.alignment.wrapText=!0,this}numberFormat(t){return this.style.numberFormat=t,this}striped(){return this.style.striped=!0,this}conditionalFormat(t){return this.style.conditionalFormats||(this.style.conditionalFormats=[]),this.style.conditionalFormats.push(t),this}build(){return this.style}reset(){return this.style={},this}clone(){const t=new m;return t.style=JSON.parse(JSON.stringify(this.style)),t}}var f=(t=>(t.CREATED="created",t.UPDATED="updated",t.DELETED="deleted",t.STYLED="styled",t.VALIDATED="validated",t))(f||{}),y=(t=>(t.CREATED="created",t.UPDATED="updated",t.DELETED="deleted",t.TABLE_ADDED="tableAdded",t.TABLE_REMOVED="tableRemoved",t.CELL_ADDED="cellAdded",t.CELL_UPDATED="cellUpdated",t.CELL_DELETED="cellDeleted",t))(y||{}),E=(t=>(t.HEADER="header",t.SUBHEADER="subheader",t.DATA="data",t.FOOTER="footer",t.TOTAL="total",t.HIGHLIGHT="highlight",t.WARNING="warning",t.ERROR="error",t.SUCCESS="success",t.INFO="info",t))(E||{});exports.BorderStyle=l,exports.BuilderEventType=c,exports.CellEventType=f,exports.CellType=r,exports.ErrorType=h,exports.EventEmitter=s,exports.ExcelBuilder=u,exports.FontStyle=a,exports.HorizontalAlignment=o,exports.NumberFormat=i,exports.StyleBuilder=m,exports.StylePreset=E,exports.VerticalAlignment=n,exports.Worksheet=d,exports.WorksheetEventType=y,exports.default=u;
|
|
2
|
+
//# sourceMappingURL=han-excel.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"han-excel.cjs.js","sources":["../src/utils/EventEmitter.ts","../src/types/core.types.ts","../src/core/Worksheet.ts","../src/types/builder.types.ts","../src/core/ExcelBuilder.ts","../src/styles/StyleBuilder.ts","../src/types/cell.types.ts","../src/types/worksheet.types.ts","../src/types/style.types.ts"],"sourcesContent":["/**\r\n * Simple EventEmitter implementation\r\n */\r\n\r\n/**\r\n * Event listener function type\r\n */\r\nexport type EventListener<T = any> = (event: T) => void | Promise<void>;\r\n\r\n/**\r\n * Event listener options\r\n */\r\nexport interface EventListenerOptions {\r\n /** Whether to execute the listener only once */\r\n once?: boolean;\r\n /** Whether to execute the listener asynchronously */\r\n async?: boolean;\r\n /** Priority of the listener (higher = executed first) */\r\n priority?: number;\r\n /** Whether to stop event propagation */\r\n stopPropagation?: boolean;\r\n}\r\n\r\n/**\r\n * Event listener registration\r\n */\r\nexport interface EventListenerRegistration {\r\n /** Event type */\r\n type: string;\r\n /** Listener function */\r\n listener: EventListener;\r\n /** Listener options */\r\n options: EventListenerOptions;\r\n /** Registration ID */\r\n id: string;\r\n /** Whether the listener is active */\r\n active: boolean;\r\n /** Registration timestamp */\r\n timestamp: Date;\r\n}\r\n\r\n/**\r\n * EventEmitter class for handling events\r\n */\r\nexport class EventEmitter {\r\n private listeners: Map<string, EventListenerRegistration[]> = new Map();\r\n\r\n /**\r\n * Add an event listener\r\n */\r\n on<T = any>(type: string, listener: EventListener<T>, options: EventListenerOptions = {}): string {\r\n if (!this.listeners.has(type)) {\r\n this.listeners.set(type, []);\r\n }\r\n\r\n const registration: EventListenerRegistration = {\r\n type,\r\n listener: listener as EventListener,\r\n options: {\r\n once: false,\r\n async: false,\r\n priority: 0,\r\n stopPropagation: false,\r\n ...options\r\n },\r\n id: this.generateId(),\r\n active: true,\r\n timestamp: new Date()\r\n };\r\n\r\n this.listeners.get(type)!.push(registration);\r\n \r\n // Sort by priority (higher priority first)\r\n this.listeners.get(type)!.sort((a, b) => (b.options.priority || 0) - (a.options.priority || 0));\r\n\r\n return registration.id;\r\n }\r\n\r\n /**\r\n * Add a one-time event listener\r\n */\r\n once<T = any>(type: string, listener: EventListener<T>, options: EventListenerOptions = {}): string {\r\n return this.on(type, listener, { ...options, once: true });\r\n }\r\n\r\n /**\r\n * Remove an event listener\r\n */\r\n off(type: string, listenerId: string): boolean {\r\n const listeners = this.listeners.get(type);\r\n if (!listeners) {\r\n return false;\r\n }\r\n\r\n const index = listeners.findIndex(reg => reg.id === listenerId);\r\n if (index === -1) {\r\n return false;\r\n }\r\n\r\n listeners.splice(index, 1);\r\n return true;\r\n }\r\n\r\n /**\r\n * Remove all listeners for an event type\r\n */\r\n offAll(type: string): number {\r\n const listeners = this.listeners.get(type);\r\n if (!listeners) {\r\n return 0;\r\n }\r\n\r\n const count = listeners.length;\r\n this.listeners.delete(type);\r\n return count;\r\n }\r\n\r\n /**\r\n * Emit an event\r\n */\r\n async emit<T = any>(event: T): Promise<void> {\r\n const type = (event as any).type || 'default';\r\n const listeners = this.listeners.get(type);\r\n \r\n if (!listeners || listeners.length === 0) {\r\n return;\r\n }\r\n\r\n const activeListeners = listeners.filter(reg => reg.active);\r\n \r\n for (const registration of activeListeners) {\r\n try {\r\n if (registration.options.once) {\r\n registration.active = false;\r\n }\r\n\r\n if (registration.options.async) {\r\n await registration.listener(event);\r\n } else {\r\n registration.listener(event);\r\n }\r\n\r\n if (registration.options.stopPropagation) {\r\n break;\r\n }\r\n } catch (error) {\r\n console.error(`Error in event listener for ${type}:`, error);\r\n }\r\n }\r\n\r\n // Clean up inactive listeners\r\n this.cleanupInactiveListeners(type);\r\n }\r\n\r\n /**\r\n * Emit an event synchronously\r\n */\r\n emitSync<T = any>(event: T): void {\r\n const type = (event as any).type || 'default';\r\n const listeners = this.listeners.get(type);\r\n \r\n if (!listeners || listeners.length === 0) {\r\n return;\r\n }\r\n\r\n const activeListeners = listeners.filter(reg => reg.active);\r\n \r\n for (const registration of activeListeners) {\r\n try {\r\n if (registration.options.once) {\r\n registration.active = false;\r\n }\r\n\r\n registration.listener(event);\r\n\r\n if (registration.options.stopPropagation) {\r\n break;\r\n }\r\n } catch (error) {\r\n console.error(`Error in event listener for ${type}:`, error);\r\n }\r\n }\r\n\r\n // Clean up inactive listeners\r\n this.cleanupInactiveListeners(type);\r\n }\r\n\r\n /**\r\n * Clear all listeners\r\n */\r\n clear(): void {\r\n this.listeners.clear();\r\n }\r\n\r\n /**\r\n * Get listeners for an event type\r\n */\r\n getListeners(type: string): EventListenerRegistration[] {\r\n return this.listeners.get(type) || [];\r\n }\r\n\r\n /**\r\n * Get listener count for an event type\r\n */\r\n getListenerCount(type: string): number {\r\n return this.listeners.get(type)?.length || 0;\r\n }\r\n\r\n /**\r\n * Get all registered event types\r\n */\r\n getEventTypes(): string[] {\r\n return Array.from(this.listeners.keys());\r\n }\r\n\r\n // Private methods\r\n\r\n private generateId(): string {\r\n return Math.random().toString(36).substr(2, 9);\r\n }\r\n\r\n private cleanupInactiveListeners(type: string): void {\r\n const listeners = this.listeners.get(type);\r\n if (listeners) {\r\n const activeListeners = listeners.filter(reg => reg.active);\r\n if (activeListeners.length !== listeners.length) {\r\n this.listeners.set(type, activeListeners);\r\n }\r\n }\r\n }\r\n} ","/**\r\n * Core type definitions for Han Excel Builder\r\n */\r\n\r\nimport { CellValue } from 'exceljs';\r\n\r\n/**\r\n * Supported cell data types\r\n */\r\nexport enum CellType {\r\n STRING = 'string',\r\n NUMBER = 'number',\r\n BOOLEAN = 'boolean',\r\n DATE = 'date',\r\n PERCENTAGE = 'percentage',\r\n CURRENCY = 'currency',\r\n LINK = 'link',\r\n FORMULA = 'formula'\r\n}\r\n\r\n/**\r\n * Number format options\r\n */\r\nexport enum NumberFormat {\r\n GENERAL = 'General',\r\n NUMBER = '#,##0',\r\n NUMBER_DECIMALS = '#,##0.00',\r\n CURRENCY = '$#,##0.00',\r\n CURRENCY_INTEGER = '$#,##0',\r\n PERCENTAGE = '0%',\r\n PERCENTAGE_DECIMALS = '0.00%',\r\n DATE = 'dd/mm/yyyy',\r\n DATE_TIME = 'dd/mm/yyyy hh:mm',\r\n TIME = 'hh:mm:ss',\r\n CUSTOM = 'custom'\r\n}\r\n\r\n/**\r\n * Horizontal alignment options\r\n */\r\nexport enum HorizontalAlignment {\r\n LEFT = 'left',\r\n CENTER = 'center',\r\n RIGHT = 'right',\r\n FILL = 'fill',\r\n JUSTIFY = 'justify',\r\n CENTER_CONTINUOUS = 'centerContinuous',\r\n DISTRIBUTED = 'distributed'\r\n}\r\n\r\n/**\r\n * Vertical alignment options\r\n */\r\nexport enum VerticalAlignment {\r\n TOP = 'top',\r\n MIDDLE = 'middle',\r\n BOTTOM = 'bottom',\r\n DISTRIBUTED = 'distributed',\r\n JUSTIFY = 'justify'\r\n}\r\n\r\n/**\r\n * Border style options\r\n */\r\nexport enum BorderStyle {\r\n THIN = 'thin',\r\n MEDIUM = 'medium',\r\n THICK = 'thick',\r\n DOTTED = 'dotted',\r\n DASHED = 'dashed',\r\n DOUBLE = 'double',\r\n HAIR = 'hair',\r\n MEDIUM_DASHED = 'mediumDashed',\r\n DASH_DOT = 'dashDot',\r\n MEDIUM_DASH_DOT = 'mediumDashDot',\r\n DASH_DOT_DOT = 'dashDotDot',\r\n MEDIUM_DASH_DOT_DOT = 'mediumDashDotDot',\r\n SLANT_DASH_DOT = 'slantDashDot'\r\n}\r\n\r\n/**\r\n * Font style options\r\n */\r\nexport enum FontStyle {\r\n NORMAL = 'normal',\r\n BOLD = 'bold',\r\n ITALIC = 'italic',\r\n BOLD_ITALIC = 'bold italic'\r\n}\r\n\r\n/**\r\n * Color type - can be hex string, RGB object, or theme color\r\n */\r\nexport type Color = string | { r: number; g: number; b: number } | { theme: number };\r\n\r\n/**\r\n * Base cell properties interface\r\n */\r\nexport interface IBaseCell {\r\n /** Unique identifier for the cell */\r\n key: string;\r\n /** Cell data type */\r\n type: CellType;\r\n /** Cell value */\r\n value: CellValue;\r\n /** Optional cell reference (e.g., A1, B2) */\r\n reference?: string;\r\n /** Whether to merge this cell with others */\r\n mergeCell?: boolean;\r\n /** Number of columns to merge (if mergeCell is true) */\r\n mergeTo?: number;\r\n /** Row height for this cell */\r\n rowHeight?: number;\r\n /** Column width for this cell */\r\n colWidth?: number;\r\n /** Whether to move to next row after this cell */\r\n jump?: boolean;\r\n /** Hyperlink URL */\r\n link?: string;\r\n /** Excel formula */\r\n formula?: string;\r\n /** Number format for numeric cells */\r\n numberFormat?: NumberFormat | string;\r\n /** Custom number format string */\r\n customNumberFormat?: string;\r\n /** Whether the cell is protected */\r\n protected?: boolean;\r\n /** Whether the cell is hidden */\r\n hidden?: boolean;\r\n /** Cell comment */\r\n comment?: string;\r\n /** Data validation rules */\r\n validation?: IDataValidation;\r\n /** Optional styles for the cell */\r\n styles?: import('./style.types').IStyle;\r\n /** Legacy children cells */\r\n childrens?: IBaseCell[];\r\n /** Modern children cells */\r\n children?: IBaseCell[];\r\n}\r\n\r\n/**\r\n * Data validation interface\r\n */\r\nexport interface IDataValidation {\r\n /** Validation type */\r\n type: 'list' | 'whole' | 'decimal' | 'textLength' | 'date' | 'time' | 'custom';\r\n /** Validation operator */\r\n operator?: 'between' | 'notBetween' | 'equal' | 'notEqual' | 'greaterThan' | 'lessThan' | 'greaterThanOrEqual' | 'lessThanOrEqual';\r\n /** Validation formula or values */\r\n formula1?: string | number | Date;\r\n /** Second validation formula or value (for between/notBetween) */\r\n formula2?: string | number | Date;\r\n /** Whether to show error message */\r\n showErrorMessage?: boolean;\r\n /** Error message text */\r\n errorMessage?: string;\r\n /** Whether to show input message */\r\n showInputMessage?: boolean;\r\n /** Input message text */\r\n inputMessage?: string;\r\n /** Whether to allow blank values */\r\n allowBlank?: boolean;\r\n}\r\n\r\n/**\r\n * Workbook metadata interface\r\n */\r\nexport interface IWorkbookMetadata {\r\n /** Workbook author */\r\n author?: string;\r\n /** Workbook title */\r\n title?: string;\r\n /** Workbook subject */\r\n subject?: string;\r\n /** Workbook keywords */\r\n keywords?: string;\r\n /** Workbook category */\r\n category?: string;\r\n /** Workbook description */\r\n description?: string;\r\n /** Workbook company */\r\n company?: string;\r\n /** Workbook manager */\r\n manager?: string;\r\n /** Creation date */\r\n created?: Date;\r\n /** Last modified date */\r\n modified?: Date;\r\n /** Application name */\r\n application?: string;\r\n /** Application version */\r\n appVersion?: string;\r\n /** Hyperlink base */\r\n hyperlinkBase?: string;\r\n}\r\n\r\n/**\r\n * Error types for validation\r\n */\r\nexport enum ErrorType {\r\n VALIDATION_ERROR = 'VALIDATION_ERROR',\r\n BUILD_ERROR = 'BUILD_ERROR',\r\n STYLE_ERROR = 'STYLE_ERROR',\r\n WORKSHEET_ERROR = 'WORKSHEET_ERROR',\r\n CELL_ERROR = 'CELL_ERROR'\r\n}\r\n\r\n/**\r\n * Error interface\r\n */\r\nexport interface IError {\r\n type: ErrorType;\r\n message: string;\r\n code?: string;\r\n details?: Record<string, unknown>;\r\n stack?: string;\r\n}\r\n\r\n/**\r\n * Success result interface\r\n */\r\nexport interface ISuccessResult<T = unknown> {\r\n success: true;\r\n data: T;\r\n message?: string;\r\n}\r\n\r\n/**\r\n * Error result interface\r\n */\r\nexport interface IErrorResult {\r\n success: false;\r\n error: IError;\r\n}\r\n\r\n/**\r\n * Result union type\r\n */\r\nexport type Result<T = unknown> = ISuccessResult<T> | IErrorResult; ","import ExcelJS from 'exceljs';\r\nimport {\r\n IWorksheet,\r\n IWorksheetConfig,\r\n ITable\r\n} from '../types/worksheet.types';\r\nimport {\r\n IDataCell,\r\n IHeaderCell,\r\n IFooterCell\r\n} from '../types/cell.types';\r\nimport { IBuildOptions } from '../types/builder.types';\r\nimport { Result, ErrorType } from '../types/core.types';\r\n\r\n/**\r\n * Worksheet - Representa una hoja de cรกlculo dentro del builder\r\n *\r\n * Soporta headers, subheaders, rows, footers, children y estilos por celda.\r\n */\r\nexport class Worksheet implements IWorksheet {\r\n public config: IWorksheetConfig;\r\n public tables: ITable[] = [];\r\n public currentRow = 1;\r\n public currentCol = 1;\r\n public headerPointers: Map<string, any> = new Map();\r\n public isBuilt = false;\r\n\r\n // Estructuras temporales para la tabla actual\r\n private headers: IHeaderCell[] = [];\r\n private subHeaders: IHeaderCell[] = [];\r\n private body: IDataCell[] = [];\r\n private footers: IFooterCell[] = [];\r\n\r\n constructor(config: IWorksheetConfig) {\r\n this.config = config;\r\n }\r\n\r\n /**\r\n * Agrega un header principal\r\n */\r\n addHeader(header: IHeaderCell): this {\r\n this.headers.push(header);\r\n return this;\r\n }\r\n\r\n /**\r\n * Agrega subheaders\r\n */\r\n addSubHeaders(subHeaders: IHeaderCell[]): this {\r\n this.subHeaders.push(...subHeaders);\r\n return this;\r\n }\r\n\r\n /**\r\n * Agrega una fila de datos (puede ser jerรกrquica con childrens)\r\n */\r\n addRow(row: IDataCell[] | IDataCell): this {\r\n if (Array.isArray(row)) {\r\n this.body.push(...row);\r\n } else {\r\n this.body.push(row);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Agrega un footer o varios\r\n */\r\n addFooter(footer: IFooterCell[] | IFooterCell): this {\r\n if (Array.isArray(footer)) {\r\n this.footers.push(...footer);\r\n } else {\r\n this.footers.push(footer);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Construye la hoja en el workbook de ExcelJS\r\n */\r\n async build(workbook: ExcelJS.Workbook, _options: IBuildOptions = {}): Promise<void> {\r\n const ws = workbook.addWorksheet(this.config.name, {\r\n properties: {\r\n defaultRowHeight: this.config.defaultRowHeight || 20,\r\n tabColor: this.config.tabColor as any\r\n },\r\n pageSetup: this.config.pageSetup as any\r\n });\r\n\r\n let rowPointer = 1;\r\n // Headers\r\n if (this.headers.length > 0) {\r\n this.headers.forEach(header => {\r\n ws.addRow([header.value]);\r\n if (header.mergeCell) {\r\n ws.mergeCells(rowPointer, 1, rowPointer, (this.subHeaders.length || 1));\r\n }\r\n if (header.styles) {\r\n ws.getRow(rowPointer).eachCell(cell => {\r\n cell.style = this.convertStyle(header.styles);\r\n });\r\n }\r\n rowPointer++;\r\n });\r\n }\r\n // SubHeaders\r\n if (this.subHeaders.length > 0) {\r\n const subHeaderValues = this.subHeaders.map(sh => sh.value);\r\n ws.addRow(subHeaderValues);\r\n this.subHeaders.forEach((sh, idx) => {\r\n if (sh.styles) {\r\n ws.getRow(rowPointer).getCell(idx + 1).style = this.convertStyle(sh.styles);\r\n }\r\n });\r\n rowPointer++;\r\n }\r\n // Body (soporta children)\r\n for (const row of this.body) {\r\n rowPointer = this.addDataRowRecursive(ws, rowPointer, row);\r\n }\r\n // Footers\r\n if (this.footers.length > 0) {\r\n for (const footer of this.footers) {\r\n ws.addRow([footer.value]);\r\n if (footer.mergeCell && footer.mergeTo) {\r\n ws.mergeCells(rowPointer, 1, rowPointer, footer.mergeTo);\r\n }\r\n if (footer.styles) {\r\n ws.getRow(rowPointer).eachCell(cell => {\r\n cell.style = this.convertStyle(footer.styles);\r\n });\r\n }\r\n rowPointer++;\r\n }\r\n }\r\n this.isBuilt = true;\r\n }\r\n\r\n /**\r\n * Valida la hoja\r\n */\r\n validate(): Result<boolean> {\r\n if (!this.headers.length && !this.body.length) {\r\n return {\r\n success: false,\r\n error: {\r\n type: ErrorType.VALIDATION_ERROR,\r\n message: 'La hoja no tiene datos',\r\n }\r\n };\r\n }\r\n return { success: true, data: true };\r\n }\r\n\r\n /**\r\n * Agrega una fila de datos y sus children recursivamente\r\n * @returns el siguiente rowPointer disponible\r\n */\r\n private addDataRowRecursive(ws: ExcelJS.Worksheet, rowPointer: number, row: IDataCell, colPointer = 1): number {\r\n // Asegura que la fila exista\r\n const excelRow = ws.getRow(rowPointer);\r\n const cell = excelRow.getCell(colPointer);\r\n cell.value = row.value;\r\n if (row.styles) {\r\n cell.style = this.convertStyle(row.styles);\r\n }\r\n if (row.numberFormat) {\r\n cell.numFmt = row.numberFormat;\r\n }\r\n let maxRowPointer = rowPointer;\r\n // Si hay children, agregarlos en filas siguientes\r\n if (row.children && row.children.length > 0) {\r\n let childRowPointer = rowPointer;\r\n for (const child of row.children) {\r\n childRowPointer++;\r\n const usedRow = this.addDataRowRecursive(ws, childRowPointer, child, colPointer + 1);\r\n if (usedRow > maxRowPointer) maxRowPointer = usedRow;\r\n }\r\n }\r\n return maxRowPointer;\r\n }\r\n\r\n /**\r\n * Convierte el estilo personalizado a formato compatible con ExcelJS\r\n */\r\n private convertStyle(style: any): Partial<ExcelJS.Style> {\r\n if (!style) return {};\r\n \r\n const converted: Partial<ExcelJS.Style> = {};\r\n \r\n if (style.font) {\r\n converted.font = {\r\n name: style.font.family,\r\n size: style.font.size,\r\n bold: style.font.bold,\r\n italic: style.font.italic,\r\n underline: style.font.underline,\r\n color: style.font.color\r\n };\r\n }\r\n \r\n if (style.fill) {\r\n converted.fill = {\r\n type: style.fill.type,\r\n pattern: style.fill.pattern,\r\n fgColor: style.fill.fgColor,\r\n bgColor: style.fill.bgColor\r\n };\r\n }\r\n \r\n if (style.border) {\r\n converted.border = {\r\n top: style.border.top,\r\n left: style.border.left,\r\n bottom: style.border.bottom,\r\n right: style.border.right\r\n };\r\n }\r\n \r\n if (style.alignment) {\r\n converted.alignment = {\r\n horizontal: style.alignment.horizontal,\r\n vertical: style.alignment.vertical,\r\n wrapText: style.alignment.wrapText,\r\n indent: style.alignment.indent\r\n };\r\n }\r\n \r\n if (style.numFmt) {\r\n converted.numFmt = style.numFmt;\r\n }\r\n \r\n return converted;\r\n }\r\n} ","/**\r\n * Builder-specific type definitions\r\n */\r\n\r\nimport { IWorkbookMetadata, Result } from './core.types';\r\nimport { IWorksheet, IWorksheetConfig } from './worksheet.types';\r\nimport { IStyle } from './style.types';\r\n\r\n// Re-export ErrorType for convenience\r\nexport { ErrorType } from './core.types';\r\n\r\n/**\r\n * Excel builder configuration interface\r\n */\r\nexport interface IExcelBuilderConfig {\r\n /** Workbook metadata */\r\n metadata?: IWorkbookMetadata;\r\n /** Default worksheet configuration */\r\n defaultWorksheetConfig?: Partial<IWorksheetConfig>;\r\n /** Default styles */\r\n defaultStyles?: {\r\n header?: IStyle;\r\n subheader?: IStyle;\r\n data?: IStyle;\r\n footer?: IStyle;\r\n total?: IStyle;\r\n };\r\n /** Whether to enable validation */\r\n enableValidation?: boolean;\r\n /** Whether to enable events */\r\n enableEvents?: boolean;\r\n /** Whether to enable performance monitoring */\r\n enablePerformanceMonitoring?: boolean;\r\n /** Maximum number of worksheets */\r\n maxWorksheets?: number;\r\n /** Maximum number of rows per worksheet */\r\n maxRowsPerWorksheet?: number;\r\n /** Maximum number of columns per worksheet */\r\n maxColumnsPerWorksheet?: number;\r\n /** Memory limit in bytes */\r\n memoryLimit?: number;\r\n}\r\n\r\n/**\r\n * Build options interface\r\n */\r\nexport interface IBuildOptions {\r\n /** Output format */\r\n format?: 'xlsx' | 'xls' | 'csv';\r\n /** Whether to include styles */\r\n includeStyles?: boolean;\r\n /** Whether to include formulas */\r\n includeFormulas?: boolean;\r\n /** Whether to include comments */\r\n includeComments?: boolean;\r\n /** Whether to include data validation */\r\n includeValidation?: boolean;\r\n /** Whether to include conditional formatting */\r\n includeConditionalFormatting?: boolean;\r\n /** Compression level (0-9) */\r\n compressionLevel?: number;\r\n /** Whether to optimize for size */\r\n optimizeForSize?: boolean;\r\n /** Whether to optimize for speed */\r\n optimizeForSpeed?: boolean;\r\n}\r\n\r\n/**\r\n * Download options interface\r\n */\r\nexport interface IDownloadOptions extends IBuildOptions {\r\n /** File name */\r\n fileName?: string;\r\n /** Whether to show download progress */\r\n showProgress?: boolean;\r\n /** Progress callback */\r\n onProgress?: (progress: number) => void;\r\n /** Whether to auto-download */\r\n autoDownload?: boolean;\r\n /** MIME type */\r\n mimeType?: string;\r\n}\r\n\r\n/**\r\n * Excel builder interface\r\n */\r\nexport interface IExcelBuilder {\r\n /** Builder configuration */\r\n config: IExcelBuilderConfig;\r\n /** Worksheets in the workbook */\r\n worksheets: Map<string, IWorksheet>;\r\n /** Current worksheet */\r\n currentWorksheet: IWorksheet | undefined;\r\n /** Whether the builder is building */\r\n isBuilding: boolean;\r\n /** Build statistics */\r\n stats: IBuildStats;\r\n\r\n /** Add a new worksheet */\r\n addWorksheet(name: string, config?: Partial<IWorksheetConfig>): IWorksheet;\r\n /** Get a worksheet by name */\r\n getWorksheet(name: string): IWorksheet | undefined;\r\n /** Remove a worksheet */\r\n removeWorksheet(name: string): boolean;\r\n /** Set the current worksheet */\r\n setCurrentWorksheet(name: string): boolean;\r\n /** Build the workbook */\r\n build(options?: IBuildOptions): Promise<Result<ArrayBuffer>>;\r\n /** Generate and download the file */\r\n generateAndDownload(fileName: string, options?: IDownloadOptions): Promise<Result<void>>;\r\n /** Get workbook as buffer */\r\n toBuffer(options?: IBuildOptions): Promise<Result<ArrayBuffer>>;\r\n /** Get workbook as blob */\r\n toBlob(options?: IBuildOptions): Promise<Result<Blob>>;\r\n /** Validate the workbook */\r\n validate(): Result<boolean>;\r\n /** Clear all worksheets */\r\n clear(): void;\r\n /** Get workbook statistics */\r\n getStats(): IBuildStats;\r\n}\r\n\r\n/**\r\n * Build statistics interface\r\n */\r\nexport interface IBuildStats {\r\n /** Total number of worksheets */\r\n totalWorksheets: number;\r\n /** Total number of cells */\r\n totalCells: number;\r\n /** Total memory usage in bytes */\r\n memoryUsage: number;\r\n /** Build time in milliseconds */\r\n buildTime: number;\r\n /** File size in bytes */\r\n fileSize: number;\r\n /** Number of styles used */\r\n stylesUsed: number;\r\n /** Number of formulas used */\r\n formulasUsed: number;\r\n /** Number of conditional formats used */\r\n conditionalFormatsUsed: number;\r\n /** Performance metrics */\r\n performance: {\r\n /** Time spent building headers */\r\n headersTime: number;\r\n /** Time spent building data */\r\n dataTime: number;\r\n /** Time spent applying styles */\r\n stylesTime: number;\r\n /** Time spent writing to buffer */\r\n writeTime: number;\r\n };\r\n}\r\n\r\n/**\r\n * Builder event types\r\n */\r\nexport enum BuilderEventType {\r\n WORKSHEET_ADDED = 'worksheetAdded',\r\n WORKSHEET_REMOVED = 'worksheetRemoved',\r\n WORKSHEET_UPDATED = 'worksheetUpdated',\r\n BUILD_STARTED = 'buildStarted',\r\n BUILD_PROGRESS = 'buildProgress',\r\n BUILD_COMPLETED = 'buildCompleted',\r\n BUILD_ERROR = 'buildError',\r\n DOWNLOAD_STARTED = 'downloadStarted',\r\n DOWNLOAD_PROGRESS = 'downloadProgress',\r\n DOWNLOAD_COMPLETED = 'downloadCompleted',\r\n DOWNLOAD_ERROR = 'downloadError'\r\n}\r\n\r\n/**\r\n * Builder event interface\r\n */\r\nexport interface IBuilderEvent {\r\n type: BuilderEventType;\r\n data?: Record<string, unknown>;\r\n timestamp: Date;\r\n}\r\n\r\n/**\r\n * Builder event listener interface\r\n */\r\nexport interface IBuilderEventListener {\r\n (event: IBuilderEvent): void;\r\n}\r\n\r\n/**\r\n * Builder validation result interface\r\n */\r\nexport interface IBuilderValidationResult {\r\n /** Whether the builder is valid */\r\n isValid: boolean;\r\n /** Validation errors */\r\n errors: string[];\r\n /** Validation warnings */\r\n warnings: string[];\r\n /** Worksheet validation results */\r\n worksheetResults: Map<string, boolean>;\r\n} ","/**\r\n * ExcelBuilder - Main class for creating Excel workbooks\r\n */\r\n\r\nimport ExcelJS from 'exceljs';\r\nimport saveAs from 'file-saver';\r\nimport { EventEmitter } from '../utils/EventEmitter';\r\nimport { Worksheet } from './Worksheet';\r\nimport {\r\n IExcelBuilder,\r\n IExcelBuilderConfig,\r\n IBuildOptions,\r\n IDownloadOptions,\r\n IBuildStats,\r\n BuilderEventType,\r\n IBuilderEvent,\r\n ErrorType\r\n} from '../types/builder.types';\r\nimport {\r\n IWorksheet,\r\n IWorksheetConfig\r\n} from '../types/worksheet.types';\r\nimport { \r\n Result,\r\n ISuccessResult,\r\n IErrorResult\r\n} from '../types/core.types';\r\n\r\n/**\r\n * ExcelBuilder class for creating Excel workbooks\r\n */\r\nexport class ExcelBuilder implements IExcelBuilder {\r\n public config: IExcelBuilderConfig;\r\n public worksheets: Map<string, IWorksheet> = new Map();\r\n public currentWorksheet: IWorksheet | undefined;\r\n public isBuilding = false;\r\n public stats: IBuildStats;\r\n\r\n private eventEmitter: EventEmitter;\r\n\r\n constructor(config: IExcelBuilderConfig = {}) {\r\n this.config = {\r\n enableValidation: true,\r\n enableEvents: true,\r\n enablePerformanceMonitoring: false,\r\n maxWorksheets: 255,\r\n maxRowsPerWorksheet: 1048576,\r\n maxColumnsPerWorksheet: 16384,\r\n memoryLimit: 100 * 1024 * 1024, // 100MB\r\n ...config\r\n };\r\n\r\n this.stats = this.initializeStats();\r\n this.eventEmitter = new EventEmitter();\r\n }\r\n\r\n /**\r\n * Add a new worksheet to the workbook\r\n */\r\n addWorksheet(name: string, worksheetConfig: Partial<IWorksheetConfig> = {}): IWorksheet {\r\n if (this.worksheets.has(name)) {\r\n throw new Error(`Worksheet \"${name}\" already exists`);\r\n }\r\n\r\n const config: IWorksheetConfig = {\r\n name,\r\n defaultRowHeight: 20,\r\n defaultColWidth: 10,\r\n ...this.config.defaultWorksheetConfig,\r\n ...worksheetConfig\r\n };\r\n\r\n const worksheet = new Worksheet(config);\r\n this.worksheets.set(name, worksheet);\r\n this.currentWorksheet = worksheet;\r\n \r\n this.emitEvent(BuilderEventType.WORKSHEET_ADDED, { worksheetName: name });\r\n \r\n return worksheet;\r\n }\r\n\r\n /**\r\n * Get a worksheet by name\r\n */\r\n getWorksheet(name: string): IWorksheet | undefined {\r\n return this.worksheets.get(name);\r\n }\r\n\r\n /**\r\n * Remove a worksheet by name\r\n */\r\n removeWorksheet(name: string): boolean {\r\n const worksheet = this.worksheets.get(name);\r\n if (!worksheet) {\r\n return false;\r\n }\r\n\r\n this.worksheets.delete(name);\r\n \r\n // If this was the current worksheet, clear it\r\n if (this.currentWorksheet === worksheet) {\r\n this.currentWorksheet = undefined;\r\n }\r\n \r\n this.emitEvent(BuilderEventType.WORKSHEET_REMOVED, { worksheetName: name });\r\n \r\n return true;\r\n }\r\n\r\n /**\r\n * Set the current worksheet\r\n */\r\n setCurrentWorksheet(name: string): boolean {\r\n const worksheet = this.worksheets.get(name);\r\n if (!worksheet) {\r\n return false;\r\n }\r\n \r\n this.currentWorksheet = worksheet;\r\n return true;\r\n }\r\n\r\n /**\r\n * Build the workbook and return as ArrayBuffer\r\n */\r\n async build(options: IBuildOptions = {}): Promise<Result<ArrayBuffer>> {\r\n if (this.isBuilding) {\r\n return {\r\n success: false,\r\n error: {\r\n type: ErrorType.BUILD_ERROR,\r\n message: 'Build already in progress',\r\n stack: new Error().stack || ''\r\n }\r\n };\r\n }\r\n\r\n this.isBuilding = true;\r\n const startTime = Date.now();\r\n \r\n try {\r\n this.emitEvent(BuilderEventType.BUILD_STARTED);\r\n \r\n const workbook = new ExcelJS.Workbook();\r\n \r\n // Add metadata\r\n if (this.config.metadata) {\r\n workbook.creator = this.config.metadata.author || 'Han Excel Builder';\r\n workbook.lastModifiedBy = this.config.metadata.author || 'Han Excel Builder';\r\n workbook.created = this.config.metadata.created || new Date();\r\n workbook.modified = this.config.metadata.modified || new Date();\r\n if (this.config.metadata.title) workbook.title = this.config.metadata.title;\r\n if (this.config.metadata.subject) workbook.subject = this.config.metadata.subject;\r\n if (this.config.metadata.keywords) workbook.keywords = this.config.metadata.keywords;\r\n if (this.config.metadata.category) workbook.category = this.config.metadata.category;\r\n if (this.config.metadata.description) workbook.description = this.config.metadata.description;\r\n }\r\n\r\n // Build each worksheet\r\n for (const worksheet of this.worksheets.values()) {\r\n await (worksheet as Worksheet).build(workbook, options);\r\n }\r\n\r\n // Write to buffer\r\n const buffer = await workbook.xlsx.writeBuffer({\r\n compression: options.compressionLevel || 6\r\n } as any);\r\n\r\n const endTime = Date.now();\r\n this.stats.buildTime = endTime - startTime;\r\n this.stats.fileSize = buffer.byteLength;\r\n \r\n const successResult: ISuccessResult<ArrayBuffer> = {\r\n success: true,\r\n data: buffer\r\n };\r\n\r\n this.emitEvent(BuilderEventType.BUILD_COMPLETED, {\r\n buildTime: this.stats.buildTime,\r\n fileSize: this.stats.fileSize\r\n });\r\n\r\n return successResult;\r\n\r\n } catch (error) {\r\n const errorResult: IErrorResult = {\r\n success: false,\r\n error: {\r\n type: ErrorType.BUILD_ERROR,\r\n message: error instanceof Error ? error.message : 'Unknown build error',\r\n stack: error instanceof Error ? error.stack || '' : ''\r\n }\r\n };\r\n\r\n this.emitEvent(BuilderEventType.BUILD_ERROR, { error: errorResult.error });\r\n return errorResult;\r\n\r\n } finally {\r\n this.isBuilding = false;\r\n }\r\n }\r\n\r\n /**\r\n * Generate and download the file\r\n */\r\n async generateAndDownload(fileName: string, options: IDownloadOptions = {}): Promise<Result<void>> {\r\n const buildResult = await this.build(options);\r\n \r\n if (!buildResult.success) {\r\n return buildResult;\r\n }\r\n\r\n try {\r\n this.emitEvent(BuilderEventType.DOWNLOAD_STARTED, { fileName });\r\n \r\n const blob = new Blob([buildResult.data], { \r\n type: options.mimeType || 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' \r\n });\r\n \r\n saveAs(blob, fileName);\r\n \r\n this.emitEvent(BuilderEventType.DOWNLOAD_COMPLETED, { fileName });\r\n \r\n return { success: true, data: undefined };\r\n\r\n } catch (error) {\r\n const errorResult: IErrorResult = {\r\n success: false,\r\n error: {\r\n type: ErrorType.BUILD_ERROR,\r\n message: error instanceof Error ? error.message : 'Download failed',\r\n stack: error instanceof Error ? error.stack || '' : ''\r\n }\r\n };\r\n\r\n this.emitEvent(BuilderEventType.DOWNLOAD_ERROR, { error: errorResult.error });\r\n return errorResult;\r\n }\r\n }\r\n\r\n /**\r\n * Get workbook as buffer\r\n */\r\n async toBuffer(options: IBuildOptions = {}): Promise<Result<ArrayBuffer>> {\r\n return this.build(options);\r\n }\r\n\r\n /**\r\n * Get workbook as blob\r\n */\r\n async toBlob(options: IBuildOptions = {}): Promise<Result<Blob>> {\r\n const buildResult = await this.build(options);\r\n \r\n if (!buildResult.success) {\r\n return buildResult;\r\n }\r\n\r\n const blob = new Blob([buildResult.data], { \r\n type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' \r\n });\r\n \r\n return { success: true, data: blob };\r\n }\r\n\r\n /**\r\n * Validate the workbook\r\n */\r\n validate(): Result<boolean> {\r\n const errors: string[] = [];\r\n \r\n if (this.worksheets.size === 0) {\r\n errors.push('No worksheets found');\r\n }\r\n\r\n // Validate each worksheet\r\n for (const [name, worksheet] of this.worksheets.entries()) {\r\n const worksheetValidation = (worksheet as Worksheet).validate();\r\n if (!worksheetValidation.success) {\r\n errors.push(`Worksheet \"${name}\": ${worksheetValidation.error?.message}`);\r\n }\r\n }\r\n\r\n if (errors.length > 0) {\r\n return {\r\n success: false,\r\n error: {\r\n type: ErrorType.VALIDATION_ERROR,\r\n message: errors.join('; '),\r\n stack: new Error().stack || ''\r\n }\r\n };\r\n }\r\n\r\n return { success: true, data: true };\r\n }\r\n\r\n /**\r\n * Clear all worksheets\r\n */\r\n clear(): void {\r\n this.worksheets.clear();\r\n this.currentWorksheet = undefined;\r\n }\r\n\r\n /**\r\n * Get workbook statistics\r\n */\r\n getStats(): IBuildStats {\r\n return { ...this.stats };\r\n }\r\n\r\n /**\r\n * Event handling methods\r\n */\r\n on(eventType: BuilderEventType, listener: (event: IBuilderEvent) => void): string {\r\n return this.eventEmitter.on(eventType, listener);\r\n }\r\n\r\n off(eventType: BuilderEventType, listenerId: string): boolean {\r\n return this.eventEmitter.off(eventType, listenerId);\r\n }\r\n\r\n removeAllListeners(eventType?: BuilderEventType): void {\r\n if (eventType) {\r\n this.eventEmitter.offAll(eventType);\r\n } else {\r\n this.eventEmitter.clear();\r\n }\r\n }\r\n\r\n /**\r\n * Private methods\r\n */\r\n private emitEvent(type: BuilderEventType, data?: Record<string, unknown>): void {\r\n const event: IBuilderEvent = {\r\n type,\r\n data: data || {},\r\n timestamp: new Date()\r\n };\r\n this.eventEmitter.emitSync(event);\r\n }\r\n\r\n private initializeStats(): IBuildStats {\r\n return {\r\n totalWorksheets: 0,\r\n totalCells: 0,\r\n memoryUsage: 0,\r\n buildTime: 0,\r\n fileSize: 0,\r\n stylesUsed: 0,\r\n formulasUsed: 0,\r\n conditionalFormatsUsed: 0,\r\n performance: {\r\n headersTime: 0,\r\n dataTime: 0,\r\n stylesTime: 0,\r\n writeTime: 0\r\n }\r\n };\r\n }\r\n} ","/**\r\n * StyleBuilder - Fluent API for creating Excel styles\r\n */\r\n\r\nimport {\r\n IStyle,\r\n IBorder,\r\n IConditionalFormat,\r\n IStyleBuilder as IStyleBuilderInterface\r\n} from '../types/style.types';\r\nimport { \r\n Color, \r\n HorizontalAlignment,\r\n VerticalAlignment,\r\n BorderStyle, \r\n FontStyle \r\n} from '../types/core.types';\r\n\r\n/**\r\n * StyleBuilder class providing a fluent API for creating Excel styles\r\n */\r\nexport class StyleBuilder implements IStyleBuilderInterface {\r\n private style: Partial<IStyle> = {};\r\n\r\n /**\r\n * Create a new StyleBuilder instance\r\n */\r\n static create(): StyleBuilder {\r\n return new StyleBuilder();\r\n }\r\n\r\n /**\r\n * Set font name\r\n */\r\n fontName(name: string): StyleBuilder {\r\n if (!this.style.font) {\r\n this.style.font = {};\r\n }\r\n this.style.font.name = name;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set font size\r\n */\r\n fontSize(size: number): StyleBuilder {\r\n if (!this.style.font) {\r\n this.style.font = {};\r\n }\r\n this.style.font.size = size;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set font style\r\n */\r\n fontStyle(style: FontStyle): StyleBuilder {\r\n if (!this.style.font) {\r\n this.style.font = {};\r\n }\r\n this.style.font.style = style;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set font color\r\n */\r\n fontColor(color: Color): StyleBuilder {\r\n if (!this.style.font) {\r\n this.style.font = {};\r\n }\r\n this.style.font.color = color;\r\n return this;\r\n }\r\n\r\n /**\r\n * Make font bold\r\n */\r\n fontBold(): StyleBuilder {\r\n if (!this.style.font) {\r\n this.style.font = {};\r\n }\r\n this.style.font.bold = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * Make font italic\r\n */\r\n fontItalic(): StyleBuilder {\r\n if (!this.style.font) {\r\n this.style.font = {};\r\n }\r\n this.style.font.italic = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * Make font underlined\r\n */\r\n fontUnderline(): StyleBuilder {\r\n if (!this.style.font) {\r\n this.style.font = {};\r\n }\r\n this.style.font.underline = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set border on all sides\r\n */\r\n border(style: BorderStyle, color?: Color): StyleBuilder {\r\n if (!this.style.border) {\r\n this.style.border = {};\r\n }\r\n const border: IBorder = { style };\r\n if (color !== undefined) {\r\n border.color = color;\r\n }\r\n this.style.border.top = border;\r\n this.style.border.left = border;\r\n this.style.border.bottom = border;\r\n this.style.border.right = border;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set top border\r\n */\r\n borderTop(style: BorderStyle, color?: Color): StyleBuilder {\r\n if (!this.style.border) {\r\n this.style.border = {};\r\n }\r\n const border: IBorder = { style };\r\n if (color !== undefined) {\r\n border.color = color;\r\n }\r\n this.style.border.top = border;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set left border\r\n */\r\n borderLeft(style: BorderStyle, color?: Color): StyleBuilder {\r\n if (!this.style.border) {\r\n this.style.border = {};\r\n }\r\n const border: IBorder = { style };\r\n if (color !== undefined) {\r\n border.color = color;\r\n }\r\n this.style.border.left = border;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set bottom border\r\n */\r\n borderBottom(style: BorderStyle, color?: Color): StyleBuilder {\r\n if (!this.style.border) {\r\n this.style.border = {};\r\n }\r\n const border: IBorder = { style };\r\n if (color !== undefined) {\r\n border.color = color;\r\n }\r\n this.style.border.bottom = border;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set right border\r\n */\r\n borderRight(style: BorderStyle, color?: Color): StyleBuilder {\r\n if (!this.style.border) {\r\n this.style.border = {};\r\n }\r\n const border: IBorder = { style };\r\n if (color !== undefined) {\r\n border.color = color;\r\n }\r\n this.style.border.right = border;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set background color\r\n */\r\n backgroundColor(color: Color): StyleBuilder {\r\n if (!this.style.fill) {\r\n this.style.fill = { type: 'pattern' };\r\n }\r\n this.style.fill.backgroundColor = color;\r\n this.style.fill.pattern = 'solid';\r\n return this;\r\n }\r\n\r\n /**\r\n * Set horizontal alignment\r\n */\r\n horizontalAlign(alignment: HorizontalAlignment): StyleBuilder {\r\n if (!this.style.alignment) {\r\n this.style.alignment = {};\r\n }\r\n this.style.alignment.horizontal = alignment;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set vertical alignment\r\n */\r\n verticalAlign(alignment: VerticalAlignment): StyleBuilder {\r\n if (!this.style.alignment) {\r\n this.style.alignment = {};\r\n }\r\n this.style.alignment.vertical = alignment;\r\n return this;\r\n }\r\n\r\n /**\r\n * Center align text\r\n */\r\n centerAlign(): StyleBuilder {\r\n if (!this.style.alignment) {\r\n this.style.alignment = {};\r\n }\r\n this.style.alignment.horizontal = HorizontalAlignment.CENTER;\r\n this.style.alignment.vertical = VerticalAlignment.MIDDLE;\r\n return this;\r\n }\r\n\r\n /**\r\n * Left align text\r\n */\r\n leftAlign(): StyleBuilder {\r\n if (!this.style.alignment) {\r\n this.style.alignment = {};\r\n }\r\n this.style.alignment.horizontal = HorizontalAlignment.LEFT;\r\n return this;\r\n }\r\n\r\n /**\r\n * Right align text\r\n */\r\n rightAlign(): StyleBuilder {\r\n if (!this.style.alignment) {\r\n this.style.alignment = {};\r\n }\r\n this.style.alignment.horizontal = HorizontalAlignment.RIGHT;\r\n return this;\r\n }\r\n\r\n /**\r\n * Wrap text\r\n */\r\n wrapText(): StyleBuilder {\r\n if (!this.style.alignment) {\r\n this.style.alignment = {};\r\n }\r\n this.style.alignment.wrapText = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set number format\r\n */\r\n numberFormat(format: string): StyleBuilder {\r\n this.style.numberFormat = format;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set striped rows\r\n */\r\n striped(): StyleBuilder {\r\n this.style.striped = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * Add conditional formatting\r\n */\r\n conditionalFormat(format: IConditionalFormat): StyleBuilder {\r\n if (!this.style.conditionalFormats) {\r\n this.style.conditionalFormats = [];\r\n }\r\n this.style.conditionalFormats.push(format);\r\n return this;\r\n }\r\n\r\n /**\r\n * Build the final style\r\n */\r\n build(): IStyle {\r\n return this.style as IStyle;\r\n }\r\n\r\n /**\r\n * Reset the builder\r\n */\r\n reset(): StyleBuilder {\r\n this.style = {};\r\n return this;\r\n }\r\n\r\n /**\r\n * Clone the current style\r\n */\r\n clone(): StyleBuilder {\r\n const cloned = new StyleBuilder();\r\n cloned.style = JSON.parse(JSON.stringify(this.style));\r\n return cloned;\r\n }\r\n} ","/**\r\n * Cell-specific type definitions\r\n */\r\n\r\nimport { IBaseCell } from './core.types';\r\nimport type { CellValue } from 'exceljs';\r\n\r\n/**\r\n * Header cell interface\r\n */\r\nexport interface IHeaderCell extends IBaseCell {\r\n /** Reference to parent header key */\r\n mainHeaderKey?: string;\r\n /** Child headers */\r\n children?: IHeaderCell[];\r\n /** Whether this is a main header */\r\n isMainHeader?: boolean;\r\n /** Header level (1 = main, 2 = sub, etc.) */\r\n level?: number;\r\n}\r\n\r\n/**\r\n * Data cell interface\r\n */\r\nexport interface IDataCell extends IBaseCell {\r\n /** Reference to header key */\r\n header: string;\r\n /** Reference to main header key */\r\n mainHeaderKey?: string;\r\n /** Child data cells */\r\n children?: IDataCell[];\r\n /** Whether this cell has alternating row color */\r\n striped?: boolean;\r\n /** Row index */\r\n rowIndex?: number;\r\n /** Column index */\r\n colIndex?: number;\r\n}\r\n\r\n/**\r\n * Footer cell interface\r\n */\r\nexport interface IFooterCell extends IBaseCell {\r\n /** Reference to header key */\r\n header: string;\r\n /** Child footer cells */\r\n children?: IDataCell[];\r\n /** Whether this is a total row */\r\n isTotal?: boolean;\r\n /** Footer type */\r\n footerType?: 'total' | 'subtotal' | 'average' | 'count' | 'custom';\r\n}\r\n\r\n/**\r\n * Cell position interface\r\n */\r\nexport interface ICellPosition {\r\n /** Row index (1-based) */\r\n row: number;\r\n /** Column index (1-based) */\r\n col: number;\r\n /** Cell reference (e.g., A1) */\r\n reference: string;\r\n}\r\n\r\n/**\r\n * Cell range interface\r\n */\r\nexport interface ICellRange {\r\n /** Start position */\r\n start: ICellPosition;\r\n /** End position */\r\n end: ICellPosition;\r\n /** Range reference (e.g., A1:B10) */\r\n reference: string;\r\n}\r\n\r\n/**\r\n * Cell data for different types\r\n */\r\nexport interface ICellData {\r\n /** String cell data */\r\n string?: {\r\n value: string;\r\n maxLength?: number;\r\n trim?: boolean;\r\n };\r\n /** Number cell data */\r\n number?: {\r\n value: number;\r\n min?: number;\r\n max?: number;\r\n precision?: number;\r\n allowNegative?: boolean;\r\n };\r\n /** Date cell data */\r\n date?: {\r\n value: Date;\r\n min?: Date;\r\n max?: Date;\r\n format?: string;\r\n };\r\n /** Boolean cell data */\r\n boolean?: {\r\n value: boolean;\r\n trueText?: string;\r\n falseText?: string;\r\n };\r\n /** Percentage cell data */\r\n percentage?: {\r\n value: number;\r\n min?: number;\r\n max?: number;\r\n precision?: number;\r\n showSymbol?: boolean;\r\n };\r\n /** Currency cell data */\r\n currency?: {\r\n value: number;\r\n currency?: string;\r\n precision?: number;\r\n showSymbol?: boolean;\r\n };\r\n /** Link cell data */\r\n link?: {\r\n value: string;\r\n text?: string;\r\n tooltip?: string;\r\n };\r\n /** Formula cell data */\r\n formula?: {\r\n value: string;\r\n result?: CellValue;\r\n };\r\n}\r\n\r\n/**\r\n * Cell validation result\r\n */\r\nexport interface ICellValidationResult {\r\n /** Whether the cell is valid */\r\n isValid: boolean;\r\n /** Validation errors */\r\n errors: string[];\r\n /** Validation warnings */\r\n warnings: string[];\r\n}\r\n\r\n/**\r\n * Cell event types\r\n */\r\nexport enum CellEventType {\r\n CREATED = 'created',\r\n UPDATED = 'updated',\r\n DELETED = 'deleted',\r\n STYLED = 'styled',\r\n VALIDATED = 'validated'\r\n}\r\n\r\n/**\r\n * Cell event interface\r\n */\r\nexport interface ICellEvent {\r\n type: CellEventType;\r\n cell: IDataCell | IHeaderCell | IFooterCell;\r\n position: ICellPosition;\r\n timestamp: Date;\r\n data?: Record<string, unknown>;\r\n} ","/**\r\n * Worksheet-specific type definitions\r\n */\r\n\r\nimport { IHeaderCell, IDataCell, IFooterCell, ICellPosition, ICellRange } from './cell.types';\r\nimport { Color, Result } from './core.types';\r\n\r\n/**\r\n * Worksheet configuration interface\r\n */\r\nexport interface IWorksheetConfig {\r\n /** Worksheet name */\r\n name: string;\r\n /** Tab color */\r\n tabColor?: Color;\r\n /** Default row height */\r\n defaultRowHeight?: number;\r\n /** Default column width */\r\n defaultColWidth?: number;\r\n /** Whether the worksheet is hidden */\r\n hidden?: boolean;\r\n /** Whether the worksheet is protected */\r\n protected?: boolean;\r\n /** Protection password */\r\n protectionPassword?: string;\r\n /** Whether to show grid lines */\r\n showGridLines?: boolean;\r\n /** Whether to show row and column headers */\r\n showRowColHeaders?: boolean;\r\n /** Zoom level (1-400) */\r\n zoom?: number;\r\n /** Freeze panes position */\r\n freezePanes?: ICellPosition;\r\n /** Print area */\r\n printArea?: ICellRange;\r\n /** Fit to page settings */\r\n fitToPage?: {\r\n fitToWidth?: number;\r\n fitToHeight?: number;\r\n };\r\n /** Page setup */\r\n pageSetup?: {\r\n orientation?: 'portrait' | 'landscape';\r\n paperSize?: number;\r\n fitToPage?: boolean;\r\n fitToWidth?: number;\r\n fitToHeight?: number;\r\n scale?: number;\r\n horizontalCentered?: boolean;\r\n verticalCentered?: boolean;\r\n margins?: {\r\n top?: number;\r\n left?: number;\r\n bottom?: number;\r\n right?: number;\r\n header?: number;\r\n footer?: number;\r\n };\r\n };\r\n}\r\n\r\n/**\r\n * Table structure interface\r\n */\r\nexport interface ITable {\r\n /** Table name */\r\n name?: string;\r\n /** Table headers */\r\n headers?: IHeaderCell[];\r\n /** Table sub-headers */\r\n subHeaders?: IHeaderCell[];\r\n /** Table data rows */\r\n body?: IDataCell[];\r\n /** Table footers */\r\n footers?: IFooterCell[];\r\n /** Table range */\r\n range?: ICellRange;\r\n /** Whether to show table borders */\r\n showBorders?: boolean;\r\n /** Whether to show alternating row colors */\r\n showStripes?: boolean;\r\n /** Table style */\r\n style?: 'TableStyleLight1' | 'TableStyleLight2' | 'TableStyleMedium1' | 'TableStyleMedium2' | 'TableStyleDark1' | 'TableStyleDark2';\r\n}\r\n\r\n/**\r\n * Worksheet interface\r\n */\r\nexport interface IWorksheet {\r\n /** Worksheet configuration */\r\n config: IWorksheetConfig;\r\n /** Tables in the worksheet */\r\n tables: ITable[];\r\n /** Current row pointer */\r\n currentRow: number;\r\n /** Current column pointer */\r\n currentCol: number;\r\n /** Header pointers for navigation */\r\n headerPointers: Map<string, ICellPosition>;\r\n /** Whether the worksheet has been built */\r\n isBuilt: boolean;\r\n\r\n /** Add a header */\r\n addHeader(header: IHeaderCell): this;\r\n /** Add subheaders */\r\n addSubHeaders(subHeaders: IHeaderCell[]): this;\r\n /** Add a row or rows */\r\n addRow(row: IDataCell[] | IDataCell): this;\r\n /** Add a footer or footers */\r\n addFooter(footer: IFooterCell[] | IFooterCell): this;\r\n /** Build the worksheet */\r\n build(workbook: any, options?: any): Promise<void>;\r\n /** Validate the worksheet */\r\n validate(): Result<boolean>;\r\n}\r\n\r\n/**\r\n * Worksheet event types\r\n */\r\nexport enum WorksheetEventType {\r\n CREATED = 'created',\r\n UPDATED = 'updated',\r\n DELETED = 'deleted',\r\n TABLE_ADDED = 'tableAdded',\r\n TABLE_REMOVED = 'tableRemoved',\r\n CELL_ADDED = 'cellAdded',\r\n CELL_UPDATED = 'cellUpdated',\r\n CELL_DELETED = 'cellDeleted'\r\n}\r\n\r\n/**\r\n * Worksheet event interface\r\n */\r\nexport interface IWorksheetEvent {\r\n type: WorksheetEventType;\r\n worksheet: IWorksheet;\r\n data?: Record<string, unknown>;\r\n timestamp: Date;\r\n}\r\n\r\n/**\r\n * Worksheet validation result\r\n */\r\nexport interface IWorksheetValidationResult {\r\n /** Whether the worksheet is valid */\r\n isValid: boolean;\r\n /** Validation errors */\r\n errors: string[];\r\n /** Validation warnings */\r\n warnings: string[];\r\n /** Cell validation results */\r\n cellResults: Map<string, boolean>;\r\n}\r\n\r\n/**\r\n * Worksheet statistics\r\n */\r\nexport interface IWorksheetStats {\r\n /** Total number of cells */\r\n totalCells: number;\r\n /** Number of header cells */\r\n headerCells: number;\r\n /** Number of data cells */\r\n dataCells: number;\r\n /** Number of footer cells */\r\n footerCells: number;\r\n /** Number of tables */\r\n tables: number;\r\n /** Used range */\r\n usedRange: ICellRange;\r\n /** Memory usage in bytes */\r\n memoryUsage: number;\r\n} ","/**\r\n * Style-specific type definitions\r\n */\r\n\r\nimport { \r\n Color, \r\n HorizontalAlignment, \r\n VerticalAlignment, \r\n BorderStyle, \r\n FontStyle \r\n} from './core.types';\r\n\r\n/**\r\n * Font configuration interface\r\n */\r\nexport interface IFont {\r\n /** Font name */\r\n name?: string;\r\n /** Font size */\r\n size?: number;\r\n /** Font style */\r\n style?: FontStyle;\r\n /** Font color */\r\n color?: Color;\r\n /** Whether the font is bold */\r\n bold?: boolean;\r\n /** Whether the font is italic */\r\n italic?: boolean;\r\n /** Whether the font is underlined */\r\n underline?: boolean;\r\n /** Whether the font is strikethrough */\r\n strikethrough?: boolean;\r\n /** Font family */\r\n family?: string;\r\n /** Font scheme */\r\n scheme?: 'major' | 'minor' | 'none';\r\n}\r\n\r\n/**\r\n * Border configuration interface\r\n */\r\nexport interface IBorder {\r\n /** Border style */\r\n style?: BorderStyle;\r\n /** Border color */\r\n color?: Color;\r\n /** Border width */\r\n width?: number;\r\n}\r\n\r\n/**\r\n * Border sides interface\r\n */\r\nexport interface IBorderSides {\r\n /** Top border */\r\n top?: IBorder;\r\n /** Left border */\r\n left?: IBorder;\r\n /** Bottom border */\r\n bottom?: IBorder;\r\n /** Right border */\r\n right?: IBorder;\r\n /** Diagonal border */\r\n diagonal?: IBorder;\r\n /** Diagonal direction */\r\n diagonalDirection?: 'up' | 'down' | 'both';\r\n}\r\n\r\n/**\r\n * Fill pattern interface\r\n */\r\nexport interface IFill {\r\n /** Fill type */\r\n type: 'pattern' | 'gradient';\r\n /** Pattern type (for pattern fills) */\r\n pattern?: 'none' | 'solid' | 'darkGray' | 'mediumGray' | 'lightGray' | 'gray125' | 'gray0625' | 'darkHorizontal' | 'darkVertical' | 'darkDown' | 'darkUp' | 'darkGrid' | 'darkTrellis' | 'lightHorizontal' | 'lightVertical' | 'lightDown' | 'lightUp' | 'lightGrid' | 'lightTrellis';\r\n /** Background color */\r\n backgroundColor?: Color;\r\n /** Foreground color */\r\n foregroundColor?: Color;\r\n /** Gradient type (for gradient fills) */\r\n gradient?: 'linear' | 'path';\r\n /** Gradient stops */\r\n stops?: Array<{\r\n position: number;\r\n color: Color;\r\n }>;\r\n /** Gradient angle (for linear gradients) */\r\n angle?: number;\r\n}\r\n\r\n/**\r\n * Alignment configuration interface\r\n */\r\nexport interface IAlignment {\r\n /** Horizontal alignment */\r\n horizontal?: HorizontalAlignment;\r\n /** Vertical alignment */\r\n vertical?: VerticalAlignment;\r\n /** Text rotation (0-180 degrees) */\r\n textRotation?: number;\r\n /** Whether to wrap text */\r\n wrapText?: boolean;\r\n /** Whether to shrink text to fit */\r\n shrinkToFit?: boolean;\r\n /** Indent level */\r\n indent?: number;\r\n /** Whether to merge cells */\r\n mergeCell?: boolean;\r\n /** Reading order */\r\n readingOrder?: 'left-to-right' | 'right-to-left';\r\n}\r\n\r\n/**\r\n * Protection configuration interface\r\n */\r\nexport interface IProtection {\r\n /** Whether the cell is locked */\r\n locked?: boolean;\r\n /** Whether the cell is hidden */\r\n hidden?: boolean;\r\n}\r\n\r\n/**\r\n * Conditional formatting interface\r\n */\r\nexport interface IConditionalFormat {\r\n /** Condition type */\r\n type: 'cellIs' | 'containsText' | 'beginsWith' | 'endsWith' | 'containsBlanks' | 'notContainsBlanks' | 'containsErrors' | 'notContainsErrors' | 'timePeriod' | 'top' | 'bottom' | 'aboveAverage' | 'belowAverage' | 'duplicateValues' | 'uniqueValues' | 'expression' | 'colorScale' | 'dataBar' | 'iconSet';\r\n /** Condition operator */\r\n operator?: 'between' | 'notBetween' | 'equal' | 'notEqual' | 'greaterThan' | 'lessThan' | 'greaterThanOrEqual' | 'lessThanOrEqual';\r\n /** Condition values */\r\n values?: Array<string | number | Date>;\r\n /** Condition formula */\r\n formula?: string;\r\n /** Style to apply when condition is met */\r\n style?: IStyle;\r\n /** Priority of the condition */\r\n priority?: number;\r\n /** Whether to stop if true */\r\n stopIfTrue?: boolean;\r\n}\r\n\r\n/**\r\n * Main style interface\r\n */\r\nexport interface IStyle {\r\n /** Font configuration */\r\n font?: IFont;\r\n /** Border configuration */\r\n border?: IBorderSides;\r\n /** Fill configuration */\r\n fill?: IFill;\r\n /** Alignment configuration */\r\n alignment?: IAlignment;\r\n /** Protection configuration */\r\n protection?: IProtection;\r\n /** Conditional formatting */\r\n conditionalFormats?: IConditionalFormat[];\r\n /** Number format */\r\n numberFormat?: string;\r\n /** Whether to apply alternating row colors */\r\n striped?: boolean;\r\n /** Custom CSS-like properties */\r\n custom?: Record<string, unknown>;\r\n}\r\n\r\n/**\r\n * Style preset types\r\n */\r\nexport enum StylePreset {\r\n HEADER = 'header',\r\n SUBHEADER = 'subheader',\r\n DATA = 'data',\r\n FOOTER = 'footer',\r\n TOTAL = 'total',\r\n HIGHLIGHT = 'highlight',\r\n WARNING = 'warning',\r\n ERROR = 'error',\r\n SUCCESS = 'success',\r\n INFO = 'info'\r\n}\r\n\r\n/**\r\n * Style theme interface\r\n */\r\nexport interface IStyleTheme {\r\n /** Theme name */\r\n name: string;\r\n /** Theme description */\r\n description?: string;\r\n /** Color palette */\r\n colors: {\r\n primary: Color;\r\n secondary: Color;\r\n accent: Color;\r\n background: Color;\r\n text: Color;\r\n border: Color;\r\n success: Color;\r\n warning: Color;\r\n error: Color;\r\n info: Color;\r\n };\r\n /** Font family */\r\n fontFamily: string;\r\n /** Base font size */\r\n fontSize: number;\r\n /** Style presets */\r\n presets: Record<StylePreset, IStyle>;\r\n}\r\n\r\n/**\r\n * Style builder interface\r\n */\r\nexport interface IStyleBuilder {\r\n /** Set font name */\r\n fontName(name: string): IStyleBuilder;\r\n /** Set font size */\r\n fontSize(size: number): IStyleBuilder;\r\n /** Set font style */\r\n fontStyle(style: FontStyle): IStyleBuilder;\r\n /** Set font color */\r\n fontColor(color: Color): IStyleBuilder;\r\n /** Make font bold */\r\n fontBold(): IStyleBuilder;\r\n /** Make font italic */\r\n fontItalic(): IStyleBuilder;\r\n /** Make font underlined */\r\n fontUnderline(): IStyleBuilder;\r\n /** Set border */\r\n border(style: BorderStyle, color?: Color): IStyleBuilder;\r\n /** Set specific border */\r\n borderTop(style: BorderStyle, color?: Color): IStyleBuilder;\r\n borderLeft(style: BorderStyle, color?: Color): IStyleBuilder;\r\n borderBottom(style: BorderStyle, color?: Color): IStyleBuilder;\r\n borderRight(style: BorderStyle, color?: Color): IStyleBuilder;\r\n /** Set background color */\r\n backgroundColor(color: Color): IStyleBuilder;\r\n /** Set horizontal alignment */\r\n horizontalAlign(alignment: HorizontalAlignment): IStyleBuilder;\r\n /** Set vertical alignment */\r\n verticalAlign(alignment: VerticalAlignment): IStyleBuilder;\r\n /** Center align text */\r\n centerAlign(): IStyleBuilder;\r\n /** Left align text */\r\n leftAlign(): IStyleBuilder;\r\n /** Right align text */\r\n rightAlign(): IStyleBuilder;\r\n /** Wrap text */\r\n wrapText(): IStyleBuilder;\r\n /** Set number format */\r\n numberFormat(format: string): IStyleBuilder;\r\n /** Set striped rows */\r\n striped(): IStyleBuilder;\r\n /** Add conditional formatting */\r\n conditionalFormat(format: IConditionalFormat): IStyleBuilder;\r\n /** Build the final style */\r\n build(): IStyle;\r\n} "],"names":["EventEmitter","listeners","Map","on","type","listener","options","this","has","set","registration","once","async","priority","stopPropagation","id","generateId","active","timestamp","Date","get","push","sort","a","b","off","listenerId","index","findIndex","reg","splice","offAll","count","length","delete","emit","event","activeListeners","filter","error","console","cleanupInactiveListeners","emitSync","clear","getListeners","getListenerCount","getEventTypes","Array","from","keys","Math","random","toString","substr","CellType","NumberFormat","HorizontalAlignment","VerticalAlignment","BorderStyle","FontStyle","ErrorType","Worksheet","config","tables","currentRow","currentCol","headerPointers","isBuilt","headers","subHeaders","body","footers","constructor","addHeader","header","addSubHeaders","addRow","row","isArray","addFooter","footer","build","workbook","_options","ws","addWorksheet","name","properties","defaultRowHeight","tabColor","pageSetup","rowPointer","forEach","value","mergeCell","mergeCells","styles","getRow","eachCell","cell","style","convertStyle","subHeaderValues","map","sh","idx","getCell","addDataRowRecursive","mergeTo","validate","success","data","VALIDATION_ERROR","message","colPointer","numberFormat","numFmt","maxRowPointer","children","childRowPointer","child","usedRow","converted","font","family","size","bold","italic","underline","color","fill","pattern","fgColor","bgColor","border","top","left","bottom","right","alignment","horizontal","vertical","wrapText","indent","BuilderEventType","ExcelBuilder","worksheets","currentWorksheet","isBuilding","stats","eventEmitter","enableValidation","enableEvents","enablePerformanceMonitoring","maxWorksheets","maxRowsPerWorksheet","maxColumnsPerWorksheet","memoryLimit","initializeStats","worksheetConfig","Error","defaultColWidth","defaultWorksheetConfig","worksheet","emitEvent","WORKSHEET_ADDED","worksheetName","getWorksheet","removeWorksheet","WORKSHEET_REMOVED","setCurrentWorksheet","BUILD_ERROR","stack","startTime","now","BUILD_STARTED","ExcelJS","Workbook","metadata","creator","author","lastModifiedBy","created","modified","title","subject","keywords","category","description","values","buffer","xlsx","writeBuffer","compression","compressionLevel","endTime","buildTime","fileSize","byteLength","successResult","BUILD_COMPLETED","errorResult","generateAndDownload","fileName","buildResult","DOWNLOAD_STARTED","blob","Blob","mimeType","saveAs","DOWNLOAD_COMPLETED","DOWNLOAD_ERROR","toBuffer","toBlob","errors","entries","worksheetValidation","join","getStats","eventType","removeAllListeners","totalWorksheets","totalCells","memoryUsage","stylesUsed","formulasUsed","conditionalFormatsUsed","performance","headersTime","dataTime","stylesTime","writeTime","StyleBuilder","create","fontName","fontSize","fontStyle","fontColor","fontBold","fontItalic","fontUnderline","borderTop","borderLeft","borderBottom","borderRight","backgroundColor","horizontalAlign","verticalAlign","centerAlign","CENTER","MIDDLE","leftAlign","LEFT","rightAlign","RIGHT","format","striped","conditionalFormat","conditionalFormats","reset","clone","cloned","JSON","parse","stringify","CellEventType","WorksheetEventType","StylePreset"],"mappings":"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"}
|