返回

如何解决 Excel 下载后公式无法自动计算的难题?

javascript

Excel 下载后公式无法计算的难题

遭遇问题

相信不少人都有这样的经历:辛辛苦苦用 ExcelJS 创建了一个 Excel 文件,下载后打开时,却发现其中的公式无法自动计算,需要手动点击“启用编辑”后才能重新计算。这令人十分困扰,因为它影响了 Excel 文件的便捷性和自动化程度。

根源探究

为什么会出现这种现象?经过分析,我们发现,这是因为 Excel 默认会在下载时将其标记为只读。当文件处于只读状态时,其中的公式就会被禁用,无法自动计算。

解决方案出炉

为了解决这一问题,我们需要在导出 Excel 文件之前,手动更改工作表的计算属性,使其在加载时进行完全计算。在 ExcelJS 中,我们可以通过以下代码来实现:

workbook.calcProperties.fullCalcOnLoad = true;

完整方案

现在,我们提供一份完整的解决方案,帮助你解决 Excel 下载后公式无法计算的问题:

const handlePrintExcel = async () => {
  try {
    const response = await fetch("/test.xlsx");
    if (!response.ok) {
      console.log("Network response error");
    }
    const blob = await response.blob();

    // Read the Blob using ExcelJS
    const workbook = new ExcelJS.Workbook();
    workbook.xlsx
      .load(blob)
      .then(async (wb) => {
        const worksheet = workbook.getWorksheet("Sheet1");

        const cell_f8 = worksheet.getCell("A1");
        cell_f8.value = 123;
        const cell_a2 = worksheet.getCell("A2");
        cell_a2.value = 123;

        workbook.properties.readOnlyRecommended = false;
        workbook.properties.date1904 = false;

        workbook.security = {
          lockWindows: false,
          lockStructure: false,
          workbookPassword: null,
          workbookAlgorithmName: null,
          workbookHashValue: null,
        };

        // 设置工作表的计算属性,使其在加载时进行完全计算
        workbook.calcProperties.fullCalcOnLoad = true;

        // Write the changes to a buffer
        const buffer = await workbook.xlsx.writeBuffer();
        return buffer;
      })
      .then((data) => {
        // Create a new Blob with the updated data
        const updatedBlob = new Blob([data], {
          type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
        });

        // Create a URL for the Blob
        const url = window.URL.createObjectURL(updatedBlob);

        // Create an anchor element to trigger the download
        const anchor = document.createElement("a");
        anchor.href = url;
        anchor.download = `Test.xlsx`;

        // Trigger the download
        anchor.click();

        // Revoke the URL to release resources
        window.URL.revokeObjectURL(url);
      })
      .catch((error) => {
        console.error("Error processing Excel file: ", error);
      });
  } catch (error) {
    console.error("Error converting Excel file into Blob:", error);
  }
};

通过以上修改,下载的 Excel 文件中的公式将在打开时自动重新计算,无需手动点击“启用编辑”。

常见问题解答

  1. 为什么 Excel 会默认将下载的文件标记为只读?
    为了保护文件安全,防止未经授权的修改。
  2. 除了使用 ExcelJS 库,还有其他方法可以解决这个问题吗?
    可以,你可以在文件保存时使用 SaveAs 选项,并选择将文件另存为可编辑格式。
  3. 如果我将 Excel 文件发送给其他人,他们也会遇到同样的问题吗?
    是的,除非你手动更改了工作表的计算属性。
  4. 我是否可以将工作表的计算属性设置为自动重新计算,即使文件被标记为只读?
    不行,只读属性会覆盖计算属性的设置。
  5. 如果我使用的是其他编程语言,如何实现相同的解决方案?
    每个编程语言都有自己的 API 来处理 Excel 文件,你需要查阅相关的文档以获取具体方法。

总结

Excel 下载后公式无法计算是一个常见问题,原因是 Excel 默认将下载的文件标记为只读。通过手动更改工作表的计算属性,使其在加载时进行完全计算,我们可以解决这个问题,确保公式在下载后能够自动计算。