Preserve QExcell auto filters in XLSX

This commit is contained in:
Курнат Андрей
2026-06-01 12:53:19 +03:00
parent a1ad101729
commit 5ebc9639dc
4 changed files with 83 additions and 5 deletions
+38
View File
@@ -3,6 +3,7 @@ import JSZip from "jszip";
import {
buildChartXml,
buildCellXml,
buildAutoFilterXml,
buildHyperlinksXml,
buildMergeCellsXml,
buildSheetViewsXml,
@@ -16,6 +17,7 @@ import {
workbookActiveSheetId,
workbookRelationshipTargets,
workbookSheetRefs,
worksheetXmlToAutoFilter,
worksheetXmlToCells,
worksheetXmlToCellFormats,
worksheetXmlToFrozenPane,
@@ -643,6 +645,42 @@ describe("excellOffice OOXML helpers", () => {
expect(imported.sheets[0].frozenPane).toEqual({ columns: 1, rows: 1, topLeftCell: "B2", activePane: "bottomRight" });
});
it("читает и записывает автофильтр XLSX через autoFilter ref", async () => {
expect(
worksheetXmlToAutoFilter({
worksheet: {
autoFilter: { ref: "$D$20:$A$1" }
}
})
).toBe("A1:D20");
expect(buildAutoFilterXml("B2:B2")).toBe('<autoFilter ref="B2"/>');
expect(buildAutoFilterXml("bad")).toBe("");
const blob = await exportXlsxBlob({
id: "book-1",
title: "AutoFilter.xlsx",
updatedAt: "2026-06-01T00:00:00.000Z",
activeSheet: "sheet-1",
sheets: [
{
id: "sheet-1",
name: "Filter",
autoFilter: "D20:A1",
mergedCells: [{ start: "A22", end: "D22" }],
cells: { A1: "Product", D20: "Total" }
}
]
});
const zip = await JSZip.loadAsync(await blob.arrayBuffer());
const sheetXml = (await zip.file("xl/worksheets/sheet1.xml")?.async("string")) ?? "";
const imported = await importXlsxFile(new File([blob], "AutoFilter.xlsx", { type: blob.type }));
expect(sheetXml).toContain('<autoFilter ref="A1:D20"/>');
expect(sheetXml.indexOf("<sheetData>")).toBeLessThan(sheetXml.indexOf("<autoFilter"));
expect(sheetXml.indexOf("<autoFilter")).toBeLessThan(sheetXml.indexOf("<mergeCells"));
expect(imported.sheets[0].autoFilter).toBe("A1:D20");
});
it("создает OOXML chart part для диаграммы XLSX", () => {
const xml = buildChartXml(
{