插件窝 干货文章 如何使用jq、jszip.js、FileSaver.js高效导出Excel表格并自定义样式?

如何使用jq、jszip.js、FileSaver.js高效导出Excel表格并自定义样式?

XML openxmlformats relationships 文件 430    来源:    2025-03-19

要高效地导出Excel表格并自定义样式,你可以结合使用 jqjszip.jsFileSaver.js 这三个库。以下是实现步骤:

1. 准备工作

首先,确保你已经引入了 jszip.jsFileSaver.js 这两个库。你可以通过以下方式引入:

<script src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.7.1/jszip.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/FileSaver.js/2.0.5/FileSaver.min.js"></script>

2. 使用 jq 处理数据

假设你有一个 JSON 数据,你可以使用 jq 来筛选和处理数据。例如:

const data = [
    { name: "John", age: 30, city: "New York" },
    { name: "Jane", age: 25, city: "Los Angeles" },
    { name: "Mike", age: 35, city: "Chicago" }
];

// 使用 jq 筛选数据
const filteredData = data.filter(item => item.age > 25);

3. 创建 Excel 文件

使用 jszip.js 创建一个 Excel 文件。Excel 文件实际上是一个 ZIP 文件,里面包含 XML 文件。你可以手动创建这些 XML 文件,或者使用现有的库来生成。

const zip = new JSZip();

// 创建一个工作簿
const workbook = zip.folder("xl").folder("worksheets");
const sheet1 = workbook.file("sheet1.xml", generateSheetXML(filteredData));

// 创建共享字符串表
const sharedStrings = zip.folder("xl").folder("sharedStrings");
sharedStrings.file("sharedStrings.xml", generateSharedStringsXML(filteredData));

// 创建 [Content_Types].xml
zip.file("[Content_Types].xml", generateContentTypesXML());

// 创建 _rels/.rels
const rels = zip.folder("_rels");
rels.file(".rels", generateRelsXML());

// 创建 xl/_rels/workbook.xml.rels
const xlRels = zip.folder("xl").folder("_rels");
xlRels.file("workbook.xml.rels", generateWorkbookRelsXML());

// 创建 xl/workbook.xml
zip.folder("xl").file("workbook.xml", generateWorkbookXML());

// 生成 ZIP 文件并保存
zip.generateAsync({ type: "blob" }).then(function (content) {
    saveAs(content, "example.xlsx");
});

4. 生成 XML 文件

你需要编写一些函数来生成 Excel 所需的 XML 文件。以下是一些示例函数:

function generateSheetXML(data) {
    let xml = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>';
    xml += '<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">';
    xml += '<sheetData>';

    data.forEach((row, rowIndex) => {
        xml += `<row r="${rowIndex + 1}">`;
        Object.values(row).forEach((value, colIndex) => {
            xml += `<c r="${String.fromCharCode(65 + colIndex)}${rowIndex + 1}" t="inlineStr"><is><t>${value}</t></is></c>`;
        });
        xml += '</row>';
    });

    xml += '</sheetData></worksheet>';
    return xml;
}

function generateSharedStringsXML(data) {
    let xml = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>';
    xml += '<sst xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" count="1" uniqueCount="1">';
    xml += '<si><t>Shared String</t></si>';
    xml += '</sst>';
    return xml;
}

function generateContentTypesXML() {
    return '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>' +
        '<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">' +
        '<Default Extension="rels" ContentType="application/vnd.openxmlformats-package.relationships+xml"/>' +
        '<Default Extension="xml" ContentType="application/xml"/>' +
        '<Override PartName="/xl/worksheets/sheet1.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml"/>' +
        '<Override PartName="/xl/sharedStrings.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml"/>' +
        '<Override PartName="/xl/workbook.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml"/>' +
        '</Types>';
}

function generateRelsXML() {
    return '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>' +
        '<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">' +
        '<Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Target="xl/workbook.xml"/>' +
        '</Relationships>';
}

function generateWorkbookRelsXML() {
    return '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>' +
        '<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">' +
        '<Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet" Target="worksheets/sheet1.xml"/>' +
        '<Relationship Id="rId2" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings" Target="sharedStrings.xml"/>' +
        '</Relationships>';
}

function generateWorkbookXML() {
    return '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>' +
        '<workbook xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">' +
        '<sheets>' +
        '<sheet name="Sheet1" sheetId="1" r:id="rId1"/>' +
        '</sheets>' +
        '</workbook>';
}

5. 自定义样式

要自定义样式,你可以在 sheet1.xml 中添加样式信息。例如,你可以为单元格添加背景颜色、字体样式等。这需要你深入了解 Excel 的 XML 结构。

6. 保存文件

最后,使用 FileSaver.js 保存生成的 Excel 文件。

zip.generateAsync({ type: "blob" }).then(function (content) {
    saveAs(content, "example.xlsx");
});

总结

通过结合 jqjszip.jsFileSaver.js,你可以高效地导出 Excel 表格并自定义样式。虽然手动生成 Excel 文件需要编写较多的 XML 代码,但这种方式非常灵活,允许你完全控制 Excel 文件的内容和样式。