xml-xlsx-lite
Version:
🚀 Lightweight Excel XLSX generator with full Excel features: dynamic pivot tables, charts, styles, and Chinese support. Fast, TypeScript-friendly Excel file creation library. | 輕量級 Excel XLSX 生成器,支援樞紐分析表、圖表、樣式,完整繁體中文支援。
701 lines (580 loc) • 20 kB
Markdown
// 工作表管理
getWorksheet(nameOrIndex: string | number): Worksheet
getWorksheets(): Worksheet[]
// 儲存格操作
getCell(worksheet: string | Worksheet, address: string): Cell
setCell(worksheet: string | Worksheet, address: string, value: number | string | boolean | Date | null, options?: CellOptions): Cell
// 檔案輸出
writeBuffer(): Promise<ArrayBuffer>
writeFile(filename: string): Promise<void>
writeStream(writeStream: (chunk: Uint8Array) => Promise<void>): Promise<void>
// 大型資料集處理
addLargeDataset(worksheetName: string, data: Array<Array<any>>, options?: {
startRow?: number;
startCol?: number;
chunkSize?: number;
}): Promise<void>
// 記憶體優化設定
setMemoryOptimization(enabled: boolean): void
setChunkSize(size: number): void
setCacheEnabled(enabled: boolean): void
setMaxCacheSize(size: number): void
// 記憶體統計
getMemoryStats(): {
sheets: number;
totalCells: number;
cacheSize: number;
cacheHitRate: number;
memoryUsage: number;
}
forceGarbageCollection(): void
// Pivot Table 管理
createPivotTable(config: PivotTableConfig): PivotTable
getPivotTable(name: string): PivotTable | undefined
getAllPivotTables(): PivotTable[]
removePivotTable(name: string): boolean
refreshAllPivotTables(): void
// 工作簿保護
protect(password?: string, options?: WorkbookProtectionOptions): void
unprotect(password?: string): void
isProtected(): boolean
getProtectionOptions(): WorkbookProtectionOptions | null
```
**使用範例:**
```typescript
const workbook = new Workbook();
const sheet = workbook.getWorksheet('Sheet1');
sheet.setCell('A1', 'Hello World');
const buffer = await workbook.writeBuffer();
```
---
表示工作表中的單個儲存格。
**屬性:**
```typescript
address: string // 儲存格地址 (如 "A1")
value: number | string | boolean | Date | null // 儲存格的值
type: 'n' | 's' | 'b' | 'd' | null // 儲存格類型 (n=數字, s=字串, b=布林, d=日期)
options: CellOptions // 儲存格選項
```
**使用範例:**
```typescript
const cell = sheet.getCell('A1');
console.log(cell.value); // 獲取值
console.log(cell.address); // 獲取地址
console.log(cell.type); // 獲取類型
```
定義儲存格的所有樣式和格式選項。
**屬性:**
```typescript
// 數字格式
numFmt?: string
// 字體設定
font?: {
bold?: boolean // 粗體
italic?: boolean // 斜體
size?: number // 字體大小
name?: string // 字體名稱
color?: string // 字體顏色
underline?: boolean // 底線
strike?: boolean // 刪除線
}
// 對齊設定
alignment?: {
horizontal?: 'left' | 'center' | 'right' | 'justify' | 'distributed' // 水平對齊
vertical?: 'top' | 'middle' | 'bottom' | 'justify' | 'distributed' // 垂直對齊
wrapText?: boolean // 自動換行
indent?: number // 縮排
rotation?: number // 旋轉角度
}
// 填滿設定
fill?: {
type?: 'pattern' | 'gradient' // 填滿類型
color?: string // 主要顏色
patternType?: 'none' | 'solid' | 'darkGray' | 'mediumGray' | 'lightGray' | 'darkHorizontal' | 'darkVertical' | 'darkDown' | 'darkUp' | 'darkGrid' | 'darkTrellis' | 'lightHorizontal' | 'lightVertical' | 'lightDown' | 'lightUp' | 'lightGrid' | 'lightTrellis' | 'gray125' | 'gray0625'
fgColor?: string // 前景顏色
bgColor?: string // 背景顏色
}
// 邊框設定
border?: {
style?: 'none' | 'thin' | 'medium' | 'dashed' | 'dotted' | 'thick' | 'double' | 'hair' | 'mediumDashed' | 'dashDot' | 'mediumDashDot' | 'dashDotDot' | 'mediumDashDotDot' | 'slantDashDot'
color?: string // 邊框顏色
top?: { style?: string; color?: string } // 上邊框
left?: { style?: string; color?: string } // 左邊框
bottom?: { style?: string; color?: string } // 下邊框
right?: { style?: string; color?: string } // 右邊框
}
// 合併儲存格
mergeRange?: string // 標記儲存格是否為合併儲存格的主儲存格
mergedInto?: string // 標記儲存格是否被合併到某個範圍
// 公式支援
formula?: string // Excel 公式,例如 "=SUM(A1:A10)"
formulaType?: 'array' | 'shared' | 'dataTable' // 公式類型
// Pivot Table 支援
pivotTable?: {
isPivotField?: boolean // 是否為樞紐欄位
pivotFieldType?: 'row' | 'column' | 'value' | 'filter' // 樞紐欄位類型
pivotFieldIndex?: number // 樞紐欄位索引
pivotItemIndex?: number // 樞紐項目索引
isSubtotal?: boolean // 是否為小計
isGrandTotal?: boolean // 是否為總計
}
```
**使用範例:**
```typescript
const cellOptions: CellOptions = {
font: { bold: true, size: 14, color: '#FF0000' },
alignment: { horizontal: 'center', vertical: 'middle' },
fill: { type: 'pattern', patternType: 'solid', fgColor: '#FFFF00' },
border: { style: 'thin', color: '#000000' }
};
sheet.setCell('A1', 'Hello World', cellOptions);
```
---
表示工作簿中的單個工作表。
**屬性:**
```typescript
name: string // 工作表名稱
```
**方法:**
```typescript
// 儲存格操作
getCell(address: string): Cell
setCell(address: string, value: number | string | boolean | Date | null, options?: CellOptions): Cell
// 行/列遍歷
rows(): Generator<[number, Map<number, Cell>]>
// 合併儲存格
mergeCells(range: string): void
unmergeCells(range: string): void
getMergedRanges(): string[]
// 欄寬/列高設定
setColumnWidth(column: string | number, width: number): void
getColumnWidth(column: string | number): number
setRowHeight(row: number, height: number): void
getRowHeight(row: number): number
// 凍結窗格
freezePanes(row?: number, column?: number): void
unfreezePanes(): void
getFreezePanes(): { row?: number; column?: number }
// 公式支援
setFormula(address: string, formula: string, options?: CellOptions): Cell
getFormula(address: string): string | null
validateFormula(formula: string): boolean
getFormulaDependencies(address: string): string[]
// 工作表保護
protect(password?: string, options?: WorksheetProtectionOptions): void
unprotect(password?: string): void
isProtected(): boolean
getProtectionOptions(): WorksheetProtectionOptions | null
// 圖表支援
addChart(chart: Chart): void
removeChart(chartName: string): void
getCharts(): Chart[]
getChart(chartName: string): Chart | undefined
```
**使用範例:**
```typescript
const sheet = workbook.getWorksheet('Sheet1');
// 設定儲存格
sheet.setCell('A1', 'Hello World');
// 合併儲存格
sheet.mergeCells('A1:B2');
// 設定欄寬
sheet.setColumnWidth('A', 15);
// 凍結窗格
sheet.freezePanes(2, 1);
// 設定公式
sheet.setFormula('B1', '=SUM(A1:A10)');
```
---
定義樞紐分析表中的欄位設定。
**屬性:**
```typescript
name: string // 欄位名稱
sourceColumn: string // 來源欄位名稱
type: 'row' | 'column' | 'value' | 'filter' // 欄位類型
function?: 'sum' | 'count' | 'average' | 'max' | 'min' | 'countNums' | 'stdDev' | 'stdDevP' | 'var' | 'varP' // 彙總函數
numberFormat?: string // 數字格式
showSubtotal?: boolean // 是否顯示小計
showGrandTotal?: boolean // 是否顯示總計
sortOrder?: 'asc' | 'desc' // 排序順序
filterValues?: string[] // 篩選值
customName?: string // 自訂名稱
```
**使用範例:**
```typescript
const rowField: PivotField = {
name: 'Month',
sourceColumn: 'Month',
type: 'row',
showSubtotal: true,
sortOrder: 'asc'
};
const valueField: PivotField = {
name: 'Saving Amount',
sourceColumn: 'Saving_Amount',
type: 'value',
function: 'sum',
numberFormat: '#,##0.00',
customName: 'Total Savings'
};
```
定義樞紐分析表的配置。
**屬性:**
```typescript
name: string // 樞紐分析表名稱
sourceRange: string // 資料來源範圍,例如 "A1:D1000"
targetRange: string // 目標範圍,例如 "F1:J20"
fields: PivotField[] // 欄位設定陣列
showRowHeaders?: boolean // 是否顯示列標題
showColumnHeaders?: boolean // 是否顯示欄標題
showRowSubtotals?: boolean // 是否顯示列小計
showColumnSubtotals?: boolean // 是否顯示欄小計
showGrandTotals?: boolean // 是否顯示總計
autoFormat?: boolean // 是否自動格式化
compactRows?: boolean // 是否壓縮列
outlineData?: boolean // 是否顯示大綱資料
mergeLabels?: boolean // 是否合併標籤
pageBreakBetweenGroups?: boolean // 群組間是否分頁
repeatRowLabels?: boolean // 是否重複列標籤
rowGrandTotals?: boolean // 是否顯示列總計
columnGrandTotals?: boolean // 是否顯示欄總計
```
**使用範例:**
```typescript
const pivotConfig: PivotTableConfig = {
name: 'Savings Summary',
sourceRange: 'A1:C7',
targetRange: 'E1:H10',
fields: [rowField, valueField],
showGrandTotals: true,
autoFormat: true
};
```
樞紐分析表的實例介面。
**屬性:**
```typescript
name: string // 樞紐分析表名稱
config: PivotTableConfig // 配置設定
```
**方法:**
```typescript
refresh(): void // 重新整理資料
updateSourceData(sourceRange: string): void // 更新資料來源
getField(fieldName: string): PivotField | undefined // 獲取欄位
addField(field: PivotField): void // 添加欄位
removeField(fieldName: string): void // 移除欄位
reorderFields(fieldOrder: string[]): void // 重新排序欄位
applyFilter(fieldName: string, filterValues: string[]): void // 套用篩選
clearFilters(): void // 清除篩選
getData(): any[][] // 獲取樞紐資料
exportToWorksheet(worksheetName: string): Worksheet // 匯出到工作表
```
**使用範例:**
```typescript
const pivotTable = workbook.createPivotTable(pivotConfig);
// 重新整理
pivotTable.refresh();
// 套用篩選
pivotTable.applyFilter('Month', ['January', 'February']);
// 匯出到新工作表
const newSheet = pivotTable.exportToWorksheet('Pivot Results');
```
---
工作表保護選項。
**屬性:**
```typescript
selectLockedCells?: boolean // 是否允許選取鎖定的儲存格
selectUnlockedCells?: boolean // 是否允許選取未鎖定的儲存格
formatCells?: boolean // 是否允許格式化儲存格
formatColumns?: boolean // 是否允許格式化欄
formatRows?: boolean // 是否允許格式化列
insertColumns?: boolean // 是否允許插入欄
insertRows?: boolean // 是否允許插入列
insertHyperlinks?: boolean // 是否允許插入超連結
deleteColumns?: boolean // 是否允許刪除欄
deleteRows?: boolean // 是否允許刪除列
sort?: boolean // 是否允許排序
autoFilter?: boolean // 是否允許自動篩選
pivotTables?: boolean // 是否允許樞紐分析表
objects?: boolean // 是否允許物件操作
scenarios?: boolean // 是否允許情節
```
**使用範例:**
```typescript
const protectionOptions: WorksheetProtectionOptions = {
selectLockedCells: false,
formatCells: false,
insertRows: false,
deleteRows: false
};
sheet.protect('password123', protectionOptions);
```
工作簿保護選項。
**屬性:**
```typescript
structure?: boolean // 是否保護工作簿結構
windows?: boolean // 是否保護工作簿視窗
password?: string // 保護密碼
```
**使用範例:**
```typescript
const workbookProtection: WorkbookProtectionOptions = {
structure: true,
windows: false,
password: 'workbook123'
};
workbook.protect('workbook123', workbookProtection);
```
---
圖表類型。
**類型:**
```typescript
type ChartType = 'column' | 'line' | 'pie' | 'bar' | 'area' | 'scatter' | 'doughnut' | 'radar'
```
圖表資料設定。
**屬性:**
```typescript
series: string // 系列名稱
categories: string // 類別範圍,例如 "A2:A10"
values: string // 數值範圍,例如 "B2:B10"
color?: string // 系列顏色
```
圖表選項。
**屬性:**
```typescript
title?: string // 圖表標題
xAxisTitle?: string // X 軸標題
yAxisTitle?: string // Y 軸標題
width?: number // 圖表寬度
height?: number // 圖表高度
showLegend?: boolean // 是否顯示圖例
showDataLabels?: boolean // 是否顯示資料標籤
showGridlines?: boolean // 是否顯示格線
theme?: 'light' | 'dark' // 主題
```
圖表介面。
**屬性:**
```typescript
name: string // 圖表名稱
type: ChartType // 圖表類型
data: ChartData[] // 圖表資料陣列
options: ChartOptions // 圖表選項
position: { // 圖表位置
row: number;
col: number;
}
```
**使用範例:**
```typescript
const chartData: ChartData[] = [
{
series: 'Sales',
categories: 'A2:A10',
values: 'B2:B10',
color: '#FF0000'
}
];
const chartOptions: ChartOptions = {
title: 'Monthly Sales',
xAxisTitle: 'Month',
yAxisTitle: 'Sales Amount',
showLegend: true,
showGridlines: true
};
const chart: Chart = {
name: 'Sales Chart',
type: 'column',
data: chartData,
options: chartOptions,
position: { row: 1, col: 1 }
};
sheet.addChart(chart);
```
---
```typescript
interface MemoryStats {
sheets: number; // 工作表數量
totalCells: number; // 總儲存格數量
cacheSize: number; // 快取大小
cacheHitRate: number; // 快取命中率
memoryUsage: number; // 記憶體使用量
}
```
```typescript
interface LargeDatasetOptions {
startRow?: number; // 起始列
startCol?: number; // 起始欄
chunkSize?: number; // 分塊大小
}
```
**使用範例:**
```typescript
// 啟用記憶體優化
workbook.setMemoryOptimization(true);
workbook.setChunkSize(1000);
workbook.setCacheEnabled(true);
workbook.setMaxCacheSize(1000000);
// 添加大型資料集
await workbook.addLargeDataset('Sheet1', largeDataArray, {
startRow: 2,
startCol: 1,
chunkSize: 500
});
// 獲取記憶體統計
const stats = workbook.getMemoryStats();
console.log(`工作表數量: ${stats.sheets}`);
console.log(`總儲存格: ${stats.totalCells}`);
console.log(`記憶體使用: ${stats.memoryUsage} bytes`);
// 強制垃圾回收
workbook.forceGarbageCollection();
```
---
```typescript
import { Workbook } from './src/index';
async function createBasicWorkbook() {
const workbook = new Workbook();
const sheet = workbook.getWorksheet('Sheet1');
// 設定標題
sheet.setCell('A1', 'Monthly Savings Report', {
font: { bold: true, size: 16 },
alignment: { horizontal: 'center' }
});
// 設定欄標題
const headers = ['Month', 'Account', 'Saving Amount (NTD)'];
headers.forEach((header, index) => {
sheet.setCell(`A${index + 2}`, header, {
font: { bold: true },
fill: { type: 'pattern', patternType: 'solid', fgColor: '#E0E0E0' }
});
});
// 設定資料
const data = [
['January', 'Account A', 5000],
['January', 'Account B', 3000],
['February', 'Account A', 6000],
['February', 'Account B', 4000]
];
data.forEach((row, rowIndex) => {
row.forEach((value, colIndex) => {
sheet.setCell(`${String.fromCharCode(65 + colIndex)}${rowIndex + 3}`, value);
});
});
// 設定欄寬
sheet.setColumnWidth('A', 15);
sheet.setColumnWidth('B', 15);
sheet.setColumnWidth('C', 20);
// 儲存檔案
await workbook.writeFile('monthly-savings.xlsx');
}
createBasicWorkbook();
```
```typescript
async function createPivotTableExample() {
const workbook = new Workbook();
const sheet = workbook.getWorksheet('Detail');
// 設定資料
const data = [
['Month', 'Account', 'Saving Amount (NTD)'],
['January', 'Account A', 5000],
['January', 'Account B', 3000],
['February', 'Account A', 6000],
['February', 'Account B', 4000],
['March', 'Account A', 7000],
['March', 'Account B', 5000]
];
data.forEach((row, rowIndex) => {
row.forEach((value, colIndex) => {
sheet.setCell(`${String.fromCharCode(65 + colIndex)}${rowIndex + 1}`, value);
});
});
// 創建樞紐分析表
const pivotConfig: PivotTableConfig = {
name: 'Savings Summary',
sourceRange: 'A1:C7',
targetRange: 'E1:H10',
fields: [
{
name: 'Month',
sourceColumn: 'Month',
type: 'row',
showSubtotal: true
},
{
name: 'Account',
sourceColumn: 'Account',
type: 'column',
showSubtotal: true
},
{
name: 'Saving Amount',
sourceColumn: 'Saving Amount (NTD)',
type: 'value',
function: 'sum',
numberFormat: '#,##0.00'
}
],
showGrandTotals: true,
autoFormat: true
};
const pivotTable = workbook.createPivotTable(pivotConfig);
pivotTable.refresh();
// 儲存檔案
await workbook.writeFile('pivot-example.xlsx');
}
createPivotTableExample();
```
---
1. **記憶體管理**: 處理大型檔案時,建議啟用記憶體優化功能
2. **公式驗證**: 使用公式前請先驗證語法正確性
3. **樞紐分析表**: 確保資料來源範圍包含標題列
4. **檔案保護**: 設定密碼保護後請妥善保管密碼
5. **效能考量**: 大量資料操作時建議使用分塊處理
---
- [專案首頁](../README.md)
- [安裝說明](../INSTALL.md)
- [設定指南](../SETUP.md)
- [專案文件](../PROJECT.md)
- [核心介面](
- [儲存格相關](
- [工作表相關](
- [工作簿相關](
- [Pivot Table 相關](
- [保護功能相關](
- [圖表相關](
- [樣式相關](
- [效能優化相關](
---
工作簿的主要介面,提供工作表的創建、管理和 Excel 檔案生成功能。
**屬性:**
- 無公開屬性
**方法:**
```typescript