【问题标题】:ClosedXML - charts missing after savingClosedXML - 保存后图表丢失
【发布时间】:2018-04-14 01:24:30
【问题描述】:

我正在使用ClosedXML 更改 XLSX 文件中某些单元格的值。这些单元格用于在另一张纸上生成图表。

我根本没有用 ClosedXML 接触图表。事实上,我什至没有触摸包含它的工作表,我只是更改了一些数据单元格的值,如下所示:

var workbook = new XLWorkbook(@"C:\path\to\my\file.xlsx");
var dataWorksheet = workbook.Worksheet("data");
var cell = dataWorksheet.Cell(1, 2);
cell.Value = 30;
workbook.Save();

但是,当我在 Excel 中重新打开该文件时,另一张表上的图表(我根本没有碰过)只是消失了,而该表为空。

我知道 ClosedXML 不支持创建图表,但有没有办法在保存时避免丢失?

【问题讨论】:

  • 在 Github.com 上创建问题并附加文件。我会看看我是否可以做一个 PR 以至少保留图表。
  • 我在github.com/ClosedXML/ClosedXML/pull/780做了一个修复
  • @FrancoisBotha:抱歉,如果我此时无法测试它(我很着急,所以我不得不切换项目以使用 Excel 互操作 API),但感谢 lor为您修复。如果您将其发布为答案,我会很乐意“真诚地”接受它:)

标签: c# excel closedxml


【解决方案1】:

不幸的是,这是对ClosedXML 的限制,项目页面上有一些“图表”请求:
https://github.com/ClosedXML/ClosedXML/issues?utf8=%E2%9C%93&q=is%3Aissue+chart

但怕不是XLSX格式很简单!这只是一堆压缩文件。
我们仍然可以使用 ClosedXML 编辑该 Worksheet 将其保存为临时文件,然后替换原始文件上的工作表,这是我的代码:

using ClosedXML.Excel;
using Ionic.Zip;
using System.IO;
using System.Linq;

namespace ExcelTest
{
    class Program
    {
        static void Main(string[] args)
        {
            string file = @"..\..\file.xlsx";
            ClosedXMLTest(file);
        }

        static void ClosedXMLTest(string file)
        {
            string outFile = "fileClosedXML.xlsx";

            var workbook = new XLWorkbook(file);
            var dataWorksheet = workbook.Worksheet("data");
            for (int i = 1; i < 10; i++)
                dataWorksheet.Cell(i, i).Value = i;
            workbook.SaveAs(outFile);

            ReplaceSheet(outFile, file, "xl/worksheets/sheet1.xml");
        }

        static void ReplaceSheet(string outputFile, string inputFile, string sheetName)
        {
            using (var ozip = new ZipFile(outputFile))
            using (var izip = new ZipFile(inputFile))
            {
                var osheet = ozip.Entries.Where(x => x.FileName == sheetName).FirstOrDefault();
                var tempS = new MemoryStream();
                osheet.Extract(tempS);

                var isheet = izip.Entries.Where(x => x.FileName == sheetName).FirstOrDefault();
                izip.RemoveEntry(isheet);
                izip.AddEntry(isheet.FileName, tempS.ToArray());
                izip.Save();
            }
        }
    }
}

我在这里有完整的项目: https://github.com/heldersepu/csharp-proj/tree/master/ExcelTest

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-20
    • 1970-01-01
    • 1970-01-01
    • 2020-12-24
    • 2017-05-08
    • 2017-02-07
    • 2017-08-17
    相关资源
    最近更新 更多