npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

Iโ€™ve always been into building performant and accessible sites, but lately Iโ€™ve been taking it extremely seriously. So much so that Iโ€™ve been building a tool to help me optimize and monitor the sites that I build to make sure that Iโ€™m making an attempt to offer the best experience to those who visit them. If youโ€™re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, ๐Ÿ‘‹, Iโ€™m Ryan Hefnerย  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If youโ€™re interested in other things Iโ€™m working on, follow me on Twitter or check out the open source projects Iโ€™ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soonโ€“ish.

Open Software & Tools

This site wouldnโ€™t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you ๐Ÿ™

ยฉ 2025 โ€“ย Pkg Stats / Ryan Hefner

xml-xlsx-lite

v1.7.4

Published

๐Ÿš€ 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 ็”Ÿๆˆๅ™จ๏ผŒๆ”ฏๆดๆจž็ดๅˆ†ๆž่กจใ€ๅœ–่กจใ€ๆจฃๅผ๏ผŒๅฎŒๆ•ด็น้ซ”ไธญๆ–‡ๆ”ฏๆดใ€‚

Readme

๐Ÿš€ xml-xlsx-lite

Lightweight Excel XLSX generator with full Excel features: dynamic pivot tables, charts, styles, and Chinese support. Fast, TypeScript-friendly Excel file creation library.

npm version npm downloads License TypeScript

๐Ÿ“‹ Table of Contents

๐Ÿš€ Features

  • โœจ Complete Excel Support: Full XLSX format support with all Excel features
  • ๐Ÿ”„ Dynamic Pivot Tables: Insert refreshable pivot tables into existing workbooks
  • ๐Ÿ“Š Chart Support: Create and preserve Excel charts
  • ๐ŸŽจ Rich Styling: Comprehensive cell formatting, borders, colors, and fonts
  • ๐ŸŒ Chinese Support: Full Traditional Chinese character support
  • โšก High Performance: Optimized for large files with streaming support
  • ๐Ÿ”ง TypeScript Ready: Built with TypeScript, includes type definitions
  • ๐Ÿ“ฑ Cross Platform: Works in Node.js and modern browsers
  • ๐Ÿš€ Lightweight: Minimal dependencies, fast build times

๐Ÿ“ฆ Installation

npm install xml-xlsx-lite

๐ŸŽฏ Quick Start

import { Workbook } from 'xml-xlsx-lite';

// Create workbook
const workbook = new Workbook();

// Get worksheet
const worksheet = workbook.getWorksheet('Sheet1');

// Set cells
worksheet.setCell('A1', 'Hello World');
worksheet.setCell('B1', 42);

// Save file
const buffer = await workbook.writeBuffer();

๐Ÿ“š Complete Guide

1. Create Excel Files

1.1 Basic Workbook Creation

import { Workbook } from 'xml-xlsx-lite';

// Create new workbook
const workbook = new Workbook();

// Get default worksheet
const worksheet = workbook.getWorksheet('Sheet1');

// Set title
worksheet.setCell('A1', 'Product Sales Report');
worksheet.setCell('A2', '2024 Annual');

// Set column headers
worksheet.setCell('A3', 'Product Name');
worksheet.setCell('B3', 'Sales Quantity');
worksheet.setCell('C3', 'Unit Price');
worksheet.setCell('D3', 'Total Amount');

// Set data
worksheet.setCell('A4', 'Laptop');
worksheet.setCell('B4', 10);
worksheet.setCell('C4', 35000);
worksheet.setCell('D4', 350000);

worksheet.setCell('A5', 'Mouse');
worksheet.setCell('B5', 50);
worksheet.setCell('C5', 500);
worksheet.setCell('D5', 25000);

// Save file
const buffer = await workbook.writeBuffer();

1.2 Multi-Worksheet Workbook

const workbook = new Workbook();

// Create multiple worksheets
const summarySheet = workbook.getWorksheet('Summary');
const detailSheet = workbook.getWorksheet('Detailed Data');
const chartSheet = workbook.getWorksheet('Charts');

// Set data in different worksheets
summarySheet.setCell('A1', 'Sales Summary');
detailSheet.setCell('A1', 'Detailed Sales Data');
chartSheet.setCell('A1', 'Sales Charts');

2. Basic Cell Operations

2.1 Cell Value Setting

const worksheet = workbook.getWorksheet('Sheet1');

// Different types of data
worksheet.setCell('A1', 'Text');                    // String
worksheet.setCell('B1', 123);                       // Number
worksheet.setCell('C1', true);                      // Boolean
worksheet.setCell('D1', new Date());                // Date
worksheet.setCell('E1', null);                      // Null
worksheet.setCell('F1', '');                        // Empty string

// Using coordinates
worksheet.setCell('G1', 'Using A1 coordinates');
worksheet.setCell(1, 8, 'Using row-column coordinates'); // Row 1, Column 8

2.2 Cell Range Operations

// Set cells in a range
for (let row = 1; row <= 10; row++) {
    for (let col = 1; col <= 5; col++) {
        const value = `R${row}C${col}`;
        worksheet.setCell(row, col, value);
    }
}

// Set entire row
for (let col = 1; col <= 5; col++) {
    worksheet.setCell(1, col, `Title${col}`);
}

// Set entire column
for (let row = 1; row <= 10; row++) {
    worksheet.setCell(row, 1, `Item${row}`);
}

3. Styling and Formatting

3.1 Basic Styling

// Font styling
worksheet.setCell('A1', 'Bold Title', {
    font: {
        bold: true,
        size: 16,
        color: 'FF0000'  // Red
    }
});

// Alignment styling
worksheet.setCell('B1', 'Center Aligned', {
    alignment: {
        horizontal: 'center',
        vertical: 'middle'
    }
});

// Border styling
worksheet.setCell('C1', 'With Borders', {
    border: {
        top: { style: 'thin', color: '000000' },
        bottom: { style: 'double', color: '000000' },
        left: { style: 'thin', color: '000000' },
        right: { style: 'thin', color: '000000' }
    }
});

// Fill styling
worksheet.setCell('D1', 'With Background', {
    fill: {
        type: 'solid',
        color: 'FFFF00'  // Yellow
    }
});

3.2 Number Formatting

// Currency format
worksheet.setCell('A1', 1234.56, {
    numFmt: 'ยฅ#,##0.00'
});

// Percentage format
worksheet.setCell('B1', 0.1234, {
    numFmt: '0.00%'
});

// Date format
worksheet.setCell('C1', new Date(), {
    numFmt: 'yyyy-mm-dd'
});

// Custom format
worksheet.setCell('D1', 42, {
    numFmt: '0 "items"'
});

3.3 Merge Cells

// Merge cells
worksheet.mergeCells('A1:D1');
worksheet.setCell('A1', 'Merged Title');

// Merge multiple rows
worksheet.mergeCells('A2:A5');
worksheet.setCell('A2', 'Vertical Merge');

4. Worksheet Management

4.1 Column Width and Row Height

// Set column width
worksheet.setColumnWidth('A', 20);      // Column A width 20
worksheet.setColumnWidth(2, 15);        // Column B width 15

// Set row height
worksheet.setRowHeight(1, 30);          // Row 1 height 30
worksheet.setRowHeight(2, 25);          // Row 2 height 25

4.2 Freeze Panes

// Freeze first row and first column
worksheet.freezePanes(2, 2);

// Freeze only first row
worksheet.freezePanes(2);

// Freeze only first column
worksheet.freezePanes(undefined, 2);

// Unfreeze panes
worksheet.unfreezePanes();

4.3 Worksheet Protection

// Protect worksheet
worksheet.protect('password123', {
    selectLockedCells: false,
    selectUnlockedCells: true,
    formatCells: false,
    formatColumns: false,
    formatRows: false
});

// Check protection status
const isProtected = worksheet.isProtected();

5. Read Excel Files

5.1 Basic Reading

import { Workbook } from 'xml-xlsx-lite';

// Read from file
const workbook = await Workbook.readFile('existing-file.xlsx');

// Read from Buffer
const fs = require('fs');
const buffer = fs.readFileSync('existing-file.xlsx');
const workbook = await Workbook.readBuffer(buffer);

5.2 Read Worksheet Data

// Get worksheet
const worksheet = workbook.getWorksheet('Sheet1');

// Convert to 2D array
const arrayData = worksheet.toArray();
console.log('Array data:', arrayData);

// Convert to JSON object array
const jsonData = worksheet.toJSON({ headerRow: 1 });
console.log('JSON data:', jsonData);

// Get specific range
const rangeData = worksheet.getRange('A1:D10');
console.log('Range data:', rangeData);

5.3 Reading Options

const workbook = await Workbook.readFile('file.xlsx', {
    enableSharedStrings: true,      // Enable shared strings optimization
    preserveStyles: true,           // Preserve style information
    preserveFormulas: true,         // Preserve formulas
    preservePivotTables: true,      // Preserve pivot tables
    preserveCharts: true            // Preserve charts
});

6. Pivot Tables

6.1 Manual Pivot Table Creation

// Create manual pivot table
const pivotData = [
    { department: 'IT', month: 'Jan', sales: 1000 },
    { department: 'IT', month: 'Feb', sales: 1200 },
    { department: 'HR', month: 'Jan', sales: 800 },
    { department: 'HR', month: 'Feb', sales: 900 }
];

const pivotSheet = workbook.getWorksheet('Pivot');
workbook.createManualPivotTable(pivotData, {
    rowField: 'department',
    columnField: 'month',
    valueField: 'sales',
    aggregation: 'sum',
    numberFormat: '#,##0'
});

6.2 Dynamic Pivot Tables

Dynamic pivot tables allow you to insert refreshable pivot tables into existing Excel files. This is a powerful feature for creating professional reports.

Complete Example: From 0 to 1 Building Dynamic Pivot Tables
import { Workbook, addPivotToWorkbookBuffer } from 'xml-xlsx-lite';
import * as fs from 'fs';

async function createDynamicPivotTable() {
  console.log('๐Ÿš€ Starting to build dynamic pivot table...');
  
  // Step 1: Create base workbook (with data and blank pivot table worksheet)
  console.log('๐Ÿ“ Step 1: Creating base workbook...');
  
  const workbook = new Workbook();
  
  // Create data worksheet
  const dataSheet = workbook.getWorksheet('Data');
  
  // Add header row
  dataSheet.setCell('A1', 'Department', { font: { bold: true } });
  dataSheet.setCell('B1', 'Month', { font: { bold: true } });
  dataSheet.setCell('C1', 'Product', { font: { bold: true } });
  dataSheet.setCell('D1', 'Sales', { font: { bold: true } });
  
  // Add test data
  const testData = [
    ['IT', 'Jan', 'Software', 50000],
    ['IT', 'Jan', 'Hardware', 30000],
    ['IT', 'Feb', 'Software', 60000],
    ['IT', 'Feb', 'Hardware', 35000],
    ['HR', 'Jan', 'Training', 20000],
    ['HR', 'Jan', 'Recruitment', 15000],
    ['HR', 'Feb', 'Training', 25000],
    ['HR', 'Feb', 'Recruitment', 18000],
    ['Finance', 'Jan', 'Audit', 40000],
    ['Finance', 'Jan', 'Tax', 25000],
    ['Finance', 'Feb', 'Audit', 45000],
    ['Finance', 'Feb', 'Tax', 30000]
  ];
  
  // Write data
  for (let i = 0; i < testData.length; i++) {
    const row = testData[i];
    dataSheet.setCell(`A${i + 2}`, row[0]);
    dataSheet.setCell(`B${i + 2}`, row[1]);
    dataSheet.setCell(`C${i + 2}`, row[2]);
    dataSheet.setCell(`D${i + 2}`, row[3], { numFmt: '#,##0' });
  }
  
  // Set column widths
  dataSheet.setColumnWidth('A', 15);
  dataSheet.setColumnWidth('B', 12);
  dataSheet.setColumnWidth('C', 15);
  dataSheet.setColumnWidth('D', 15);
  
  // Create blank pivot table worksheet
  const pivotSheet = workbook.getWorksheet('Pivot');
  
  // Add title
  pivotSheet.setCell('A1', 'Pivot Table', { font: { bold: true, size: 16 } });
  pivotSheet.setCell('A2', '(Dynamic pivot table will be inserted here)', { font: { italic: true, color: '808080' } });
  
  // Set column width
  pivotSheet.setColumnWidth('A', 30);
  
  console.log('โœ… Base workbook created successfully');
  
  // Step 2: Output base Excel file
  console.log('๐Ÿ’พ Step 2: Outputting base Excel file...');
  
  const baseBuffer = await workbook.writeBuffer();
  const baseFilename = 'base-workbook.xlsx';
  fs.writeFileSync(baseFilename, new Uint8Array(baseBuffer));
  
  console.log(`โœ… Base file ${baseFilename} generated`);
  console.log('๐Ÿ“Š File size:', (baseBuffer.byteLength / 1024).toFixed(2), 'KB');
  
  // Step 3: Use dynamic pivot table builder
  console.log('๐Ÿ”ง Step 3: Dynamically inserting pivot table...');
  
  const pivotOptions = {
    sourceSheet: "Data",
    sourceRange: "A1:D13",         // Including header row
    targetSheet: "Pivot",
    anchorCell: "A3",
    layout: {
      rows: [{ name: "Department" }],
      cols: [{ name: "Month" }],
      values: [
        { 
          name: "Sales", 
          agg: "sum", 
          displayName: "Total Sales",
          numFmtId: 0
        }
      ],
    },
    refreshOnLoad: true,
    styleName: "PivotStyleMedium9",
  };
  
  console.log('๐Ÿ“‹ Pivot table configuration:');
  console.log(`  Source worksheet: ${pivotOptions.sourceSheet}`);
  console.log(`  Source range: ${pivotOptions.sourceRange}`);
  console.log(`  Target worksheet: ${pivotOptions.targetSheet}`);
  console.log(`  Anchor cell: ${pivotOptions.anchorCell}`);
  console.log(`  Row fields: ${pivotOptions.layout.rows?.map(f => f.name).join(', ')}`);
  console.log(`  Column fields: ${pivotOptions.layout.cols?.map(f => f.name).join(', ')}`);
  console.log(`  Value fields: ${pivotOptions.layout.values.map(v => `${v.name}(${v.agg})`).join(', ')}`);
  
  // Dynamically insert pivot table
  const enhancedBuffer = await addPivotToWorkbookBuffer(baseBuffer, pivotOptions);
  
  console.log('โœ… Pivot table insertion completed');
  
  // Step 4: Output final file
  console.log('๐Ÿ’พ Step 4: Outputting final Excel file...');
  
  const finalFilename = 'dynamic-pivot-workbook.xlsx';
  fs.writeFileSync(finalFilename, new Uint8Array(enhancedBuffer));
  
  console.log(`โœ… Final file ${finalFilename} generated`);
  console.log('๐Ÿ“Š File size:', (enhancedBuffer.byteLength / 1024).toFixed(2), 'KB');
  console.log('๐Ÿ“ˆ File size change:', ((enhancedBuffer.byteLength - baseBuffer.byteLength) / 1024).toFixed(2), 'KB');
  
  // Step 5: Verify results
  console.log('๐Ÿ” Step 5: Verifying results...');
  
  // Check if file exists
  if (fs.existsSync(finalFilename)) {
    console.log('โœ… Final file exists');
    
    // Check file size
    const stats = fs.statSync(finalFilename);
    console.log(`โœ… File size: ${(stats.size / 1024).toFixed(2)} KB`);
    
    console.log('๐ŸŽ‰ Dynamic pivot table creation completed!');
  }
  
  return finalFilename;
}

// Execute function
createDynamicPivotTable().then(filename => {
  console.log(`\n๐ŸŽฏ Complete! Please open ${filename} to check the pivot table.`);
  console.log('The pivot table should appear at cell A3 in the Pivot worksheet.');
  console.log('After modifying data in the "Data" worksheet, you can right-click on the pivot table and select "Refresh" to update.');
}).catch(console.error);
Quick Version

If you only need a basic dynamic pivot table, you can use this simplified version:

// Create base workbook
const workbook = new Workbook();
const dataSheet = workbook.getWorksheet('Data');

// Fill in data
const data = [
    ['Department', 'Month', 'Sales'],
    ['IT', 'Jan', 1000],
    ['IT', 'Feb', 1200],
    ['HR', 'Jan', 800],
    ['HR', 'Feb', 900]
];

data.forEach((row, rowIndex) => {
    row.forEach((value, colIndex) => {
        const address = String.fromCharCode(65 + colIndex) + (rowIndex + 1);
        dataSheet.setCell(address, value);
    });
});

// Save base file
const baseBuffer = await workbook.writeBuffer();

// Dynamically insert pivot table
import { addPivotToWorkbookBuffer } from 'xml-xlsx-lite';

const enhancedBuffer = await addPivotToWorkbookBuffer(baseBuffer, {
    sourceSheet: 'Data',
    sourceRange: 'A1:C100',
    targetSheet: 'Pivot',
    anchorCell: 'A3',
    layout: {
        rows: [{ name: 'Department' }],
        cols: [{ name: 'Month' }],
        values: [{ 
            name: 'Sales', 
            agg: 'sum', 
            displayName: 'Total Sales' 
        }]
    },
    refreshOnLoad: true,
    styleName: 'PivotStyleMedium9'
});

6.3 Pivot Table Configuration Options

const pivotOptions = {
    sourceSheet: 'Data',           // Source worksheet
    sourceRange: 'A1:C100',        // Source range
    targetSheet: 'Pivot',          // Target worksheet
    anchorCell: 'A3',              // Anchor cell
    
    layout: {
        rows: [                     // Row fields
            { name: 'Department' },
            { name: 'Product' }     // Multi-level row fields
        ],
        cols: [                     // Column fields
            { name: 'Month' },
            { name: 'Year' }
        ],
        values: [                   // Value fields
            { 
                name: 'Sales', 
                agg: 'sum',         // Aggregation: sum, avg, count, max, min
                displayName: 'Total Sales',
                numberFormat: '#,##0'
            },
            { 
                name: 'Quantity', 
                agg: 'count',
                displayName: 'Order Count'
            }
        ]
    },
    
    refreshOnLoad: true,            // Auto-refresh on open
    styleName: 'PivotStyleMedium9', // Pivot table style
    showGrandTotals: true,          // Show grand totals
    showSubTotals: true,            // Show subtotals
    enableDrilldown: true           // Enable drill-down
};

7. Chart Support

7.1 Basic Charts

// Create chart worksheet
const chartSheet = workbook.getWorksheet('Charts');

// Set chart data
chartSheet.setCell('A1', 'Month');
chartSheet.setCell('B1', 'Sales');
chartSheet.setCell('A2', 'Jan');
chartSheet.setCell('B2', 1000);
chartSheet.setCell('A3', 'Feb');
chartSheet.setCell('B3', 1200);
chartSheet.setCell('A4', 'Mar');
chartSheet.setCell('B4', 1100);

// Add chart (basic support)
chartSheet.addChart({
    type: 'bar',
    title: 'Monthly Sales Chart',
    dataRange: 'A1:B4',
    position: { x: 100, y: 100, width: 400, height: 300 }
});

7.2 Chart Types

// Supported chart types
const chartTypes = [
    'bar',          // Bar chart
    'line',         // Line chart
    'pie',          // Pie chart
    'column',       // Column chart
    'area',         // Area chart
    'scatter'       // Scatter chart
];

chartTypes.forEach((type, index) => {
    const row = index + 1;
    chartSheet.setCell(`A${row}`, `${type} Chart`);
    chartSheet.addChart({
        type: type,
        title: `${type} Chart Example`,
        dataRange: 'A1:B4',
        position: { x: 100, y: 100 + index * 100, width: 300, height: 200 }
    });
});

8. Advanced Features

8.1 Formula Support

// Set formulas
worksheet.setFormula('D4', '=B4*C4');           // Multiplication
worksheet.setFormula('D5', '=B5*C5');           // Multiplication
worksheet.setFormula('D6', '=SUM(D4:D5)');     // Sum
worksheet.setFormula('B6', '=SUM(B4:B5)');     // Quantity sum
worksheet.setFormula('C6', '=AVERAGE(C4:C5)'); // Average price

// Logical formulas
worksheet.setFormula('E4', '=IF(D4>100000,"High","Low")');
worksheet.setFormula('F4', '=AND(B4>5,C4>10000)');

8.2 Conditional Formatting

// Set conditional formatting (basic support)
worksheet.setCell('A1', 'Conditional Format Test', {
    font: { bold: true },
    fill: { type: 'solid', color: 'FFFF00' }
});

// Set styles based on values
const salesData = [1000, 1200, 800, 900, 1500];
salesData.forEach((value, index) => {
    const row = index + 1;
    const cell = worksheet.setCell(`B${row}`, value);
    
    // Set colors based on sales amount
    if (value > 1200) {
        cell.style = { fill: { type: 'solid', color: '00FF00' } }; // Green
    } else if (value > 1000) {
        cell.style = { fill: { type: 'solid', color: 'FFFF00' } }; // Yellow
    } else {
        cell.style = { fill: { type: 'solid', color: 'FF0000' } }; // Red
    }
});

8.3 Performance Optimization

// Large data processing
const largeData = [];
for (let i = 0; i < 10000; i++) {
    largeData.push({
        id: i + 1,
        name: `Item${i + 1}`,
        value: Math.random() * 1000
    });
}

// Batch processing
const batchSize = 1000;
for (let i = 0; i < largeData.length; i += batchSize) {
    const batch = largeData.slice(i, i + batchSize);
    batch.forEach((item, index) => {
        const row = i + index + 1;
        worksheet.setCell(`A${row}`, item.id);
        worksheet.setCell(`B${row}`, item.name);
        worksheet.setCell(`C${row}`, item.value);
    });
}

๐Ÿ”ง API Reference

Workbook

| Method | Description | Status | |--------|-------------|---------| | new Workbook() | Create new workbook | โœ… Stable | | getWorksheet(name) | Get worksheet | โœ… Stable | | writeBuffer() | Output as Buffer | โœ… Stable | | writeFile(path) | Save file directly | โœ… Stable | | writeFileWithPivotTables(path, options) | Save file with pivot tables | โœ… Stable | | createManualPivotTable(data, options) | Create manual pivot table | โœ… Stable |

Worksheet

| Method | Description | Status | |--------|-------------|---------| | setCell(address, value, options) | Set cell | โœ… Stable | | getCell(address) | Get cell | โœ… Stable | | mergeCells(range) | Merge cells | โœ… Stable | | setColumnWidth(col, width) | Set column width | โœ… Stable | | setRowHeight(row, height) | Set row height | โœ… Stable | | freezePanes(row?, col?) | Freeze panes | โœ… Stable | | protect(password, options) | Protect worksheet | โœ… Stable | | addChart(chart) | Add chart | ๐Ÿ”ถ Experimental |

Reading

| Method | Description | Status | |--------|-------------|---------| | Workbook.readFile(path, options) | Read from file | โœ… Stable | | Workbook.readBuffer(buffer, options) | Read from Buffer | โœ… Stable | | worksheet.toArray() | Convert to array | โœ… Stable | | worksheet.toJSON(options) | Convert to JSON | โœ… Stable |

๐Ÿ“– Examples

Complete Example: Sales Report System

import { Workbook } from 'xml-xlsx-lite';

async function createSalesReport() {
    const workbook = new Workbook();
    
    // 1. Create data worksheet
    const dataSheet = workbook.getWorksheet('Sales Data');
    
    // Set headers
    dataSheet.setCell('A1', 'Date', { font: { bold: true } });
    dataSheet.setCell('B1', 'Product', { font: { bold: true } });
    dataSheet.setCell('C1', 'Quantity', { font: { bold: true } });
    dataSheet.setCell('D1', 'Unit Price', { font: { bold: true } });
    dataSheet.setCell('E1', 'Total Amount', { font: { bold: true } });
    
    // Fill in data
    const salesData = [
        ['2024-01-01', 'Laptop', 2, 35000, 70000],
        ['2024-01-01', 'Mouse', 10, 500, 5000],
        ['2024-01-02', 'Keyboard', 5, 800, 4000],
        ['2024-01-02', 'Monitor', 3, 8000, 24000],
        ['2024-01-03', 'Headphones', 8, 1200, 9600]
    ];
    
    salesData.forEach((row, index) => {
        const rowNum = index + 2;
        row.forEach((value, colIndex) => {
            const col = String.fromCharCode(65 + colIndex);
            dataSheet.setCell(`${col}${rowNum}`, value);
        });
        
        // Set formulas
        const rowNum2 = index + 2;
        dataSheet.setFormula(`E${rowNum2}`, `=C${rowNum2}*D${rowNum2}`);
    });
    
    // 2. Create pivot table
    const pivotSheet = workbook.getWorksheet('Pivot Analysis');
    workbook.createManualPivotTable(salesData.map(row => ({
        date: row[0],
        product: row[1],
        quantity: row[2],
        price: row[3],
        total: row[4]
    })), {
        rowField: 'product',
        columnField: 'date',
        valueField: 'total',
        aggregation: 'sum',
        numberFormat: '#,##0'
    });
    
    // 3. Create charts
    const chartSheet = workbook.getWorksheet('Charts');
    chartSheet.setCell('A1', 'Product Sales Chart', { font: { bold: true, size: 16 } });
    
    // 4. Save file
    await workbook.writeFileWithPivotTables('Sales Report.xlsx');
    
    console.log('Sales report created successfully!');
}

createSalesReport();

๐Ÿšจ Important Notes

โš ๏ธ Important Reminders

  • Do NOT use writeFile() method: This method is not fully implemented, please use writeBuffer() + fs.writeFileSync() or the new writeFileWithPivotTables() method
  • Pivot Table Limitations: Dynamic pivot tables need to be manually refreshed once in Excel
  • Browser Compatibility: Some features (such as file reading) only support Node.js environment

๐Ÿ”ง Correct File Saving Methods

// โŒ Wrong way
await workbook.writeFile('file.xlsx');

// โœ… Correct way 1: Use Buffer
const buffer = await workbook.writeBuffer();
const fs = require('fs');
fs.writeFileSync('file.xlsx', new Uint8Array(buffer));

// โœ… Correct way 2: Use new convenient method
await workbook.writeFileWithPivotTables('file.xlsx', pivotOptions);

๐Ÿ“Š Feature Matrix

| Feature | Status | Description | Alternatives | |---------|--------|-------------|--------------| | Basic Features | | Create Workbook | โœ… Stable | Fully supported | - | | Cell Operations | โœ… Stable | Fully supported | - | | Style Setting | โœ… Stable | Fully supported | - | | Formula Support | โœ… Stable | Basic formulas | - | | Advanced Features | | Pivot Tables | ๐Ÿ”ถ Experimental | Dynamic insertion | Manual creation | | Chart Support | ๐Ÿ”ถ Experimental | Basic support | Manual creation | | File Reading | โœ… Stable | Fully supported | - | | Performance Optimization | | Large Data | โœ… Stable | Batch processing | Streaming processing | | Memory Optimization | โœ… Stable | Auto-optimization | Manual control |

๐ŸŒ Browser Support

  • โœ… Node.js: Fully supported
  • ๐Ÿ”ถ Modern Browsers: Basic feature support (some features limited)
  • โŒ Legacy Browsers: Not supported

Browser Usage Example

<!DOCTYPE html>
<html>
<head>
    <title>xml-xlsx-lite Browser Test</title>
</head>
<body>
    <h1>Excel Generation Test</h1>
    <button onclick="generateExcel()">Generate Excel</button>
    
    <script type="module">
        import { Workbook } from './node_modules/xml-xlsx-lite/dist/index.esm.js';
        
        async function generateExcel() {
            const workbook = new Workbook();
            const worksheet = workbook.getWorksheet('Sheet1');
            
            worksheet.setCell('A1', 'Hello from Browser!');
            worksheet.setCell('B1', new Date());
            
            const buffer = await workbook.writeBuffer();
            
            // Download file
            const blob = new Blob([buffer], { 
                type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' 
            });
            const url = URL.createObjectURL(blob);
            const a = document.createElement('a');
            a.href = url;
            a.download = 'browser-test.xlsx';
            a.click();
            URL.revokeObjectURL(url);
        }
    </script>
</body>
</html>

๐Ÿค Contributing

We welcome contributions! Please see our Contributing Guide for details.

Development Environment Setup

git clone https://github.com/mikemikex1/xml-xlsx-lite.git
cd xml-xlsx-lite
npm install
npm run dev

Testing

npm run test:all        # Run all tests
npm run verify          # Verify functionality
npm run build           # Build project

๐Ÿ“„ License

MIT License - see LICENSE file for details.


๐ŸŒŸ Feature Showcase

๐Ÿš€ Quick Start

# Install
npm install xml-xlsx-lite

# Basic usage
node -e "
const { Workbook } = require('xml-xlsx-lite');
const wb = new Workbook();
const ws = wb.getWorksheet('Sheet1');
ws.setCell('A1', 'Hello Excel!');
wb.writeBuffer().then(buf => require('fs').writeFileSync('test.xlsx', new Uint8Array(buf)));
"

๐Ÿ“Š Pivot Table Example

// Create complete report with pivot tables
const workbook = new Workbook();
const dataSheet = workbook.getWorksheet('Data');

// Fill in sales data
const salesData = [
    ['Department', 'Month', 'Product', 'Quantity', 'Amount'],
    ['IT', 'Jan', 'Laptop', 5, 175000],
    ['IT', 'Feb', 'Laptop', 3, 105000],
    ['HR', 'Jan', 'Office Supplies', 20, 4000],
    ['HR', 'Feb', 'Office Supplies', 15, 3000]
];

salesData.forEach((row, i) => {
    row.forEach((value, j) => {
        const address = String.fromCharCode(65 + j) + (i + 1);
        dataSheet.setCell(address, value);
    });
});

// Create manual pivot table
workbook.createManualPivotTable(salesData.slice(1).map(row => ({
    Department: row[0],
    Month: row[1],
    Product: row[2],
    Quantity: row[3],
    Amount: row[4]
})), {
    rowField: 'Department',
    columnField: 'Month',
    valueField: 'Amount',
    aggregation: 'sum'
});

// Save file
await workbook.writeFileWithPivotTables('Sales Pivot Report.xlsx');

๐ŸŽฏ Goal: Provide the most complete and easy-to-use Excel generation solution!

๐Ÿ’ก Features: From basic operations to advanced features, complete guide from zero to hero!

๐Ÿš€ Vision: Let every developer easily create professional Excel reports!