如果使用“ ExcelJS”导出数据,为什么会删除Excel中的图表?

问题描述

我成功读取了现有的Excel文件并将数据放在所需的单元格位置。但是,将数据放入后,现有Excel文件中的所有ExcelCharts都消失了。我仍在寻找解决方案,但无法解决

workbook.xlsx.readFile(__dirname + "/../assets/ExcelFile/testFile.xlsx")
 .then(function() {
    var worksheet = workbook.getWorksheet(8); 
      for(var i=1; i<data.length+1; i++)
     {
       for(var j=1; j<data[i-1].length+1; j++)
       {
         if(data[i-1][0] == "Slaes rate of electricity")
         {
           Price = data[i-1][2].replace(/,/gi,"");
           worksheet.getRow(12).getCell(7).value = Number(Price);
         }
         else if (data[i-1][0] == "Average coal HHV")
         {
           Price = data[i-1][2].replace(/,"");
           worksheet.getRow(15).getCell(7).value = Number(Price);
         }
        else if (data[i-1][0] == "Average price of coal")
         {
           Price = data[i-1][2].replace(/,"");
           worksheet.getRow(16).getCell(7).value = Number(Price);
         }
      }
    }
    return workbook.xlsx.writeFile(__dirname + "/../assets/ExcelFile/Test_"+getTimeStamp()+".xlsx");

 })
 .then(function() {
   res.send("true");
 })
 .catch(function(error) {
   console.dir(error);
   res.send(error);
 })

解决方法

不确定这是否仍然是一个问题。对于那些因为面临同样问题而最终来到这里的人,有一个解决方案。

Excel 文件只是一个压缩容器。 ExcelJS 不会读取此容器中的所有数据。为了保留您的图表,您需要将与图表相关的元素从原始容器复制到通过使用 ExcelJS 编写文件而创建的容器中:

  • 文件夹 /xl/charts/ 及其所有底层内容
  • 文件夹 /xl/drawings/ 及其所有底层内容(图表来自绘图)
  • [Content_Types].xml 中的相应条目(对于每个图表有三个文件,所有这些文件都需要从内容类型文件中引用,例如 <Override PartName="/xl/charts/chart1.xml" ContentType="application/vnd.openxmlformats-officedocument.drawingml.chart+xml" />
  • 确保 xl/worksheets/_rels/sheet[x].xml.rels 包含与感兴趣的绘图的关系,例如 <Relationship Id="rId999" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing" Target="../drawings/drawing1.xml"/>
  • 确保 xl/worksheets/sheet[x].xml 具有对相关项的引用:<drawing r:id="rId999" />(您可以将其作为 <worksheet> 标记中的最后一个元素)

(这里的 [x] 指的是感兴趣的工作表)

请注意,以上假设您有一个包含图表的源文件。如果不是这种情况,我建议创建一个一次性模板来获取 xl/chartsxl/drawings 的实际 XML(文件),并使用它们在 Excel 文件中动态创建相应的条目。

我已经成功地在一个项目中应用了它,使用 ADM-ZIP for NodeJS 来(解)压缩 Excel 文件。