我正在使用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不支持创建图表,但有没有办法避免在保存时丢失它们?
答案 0 :(得分:0)
不幸的是,这是对ClosedXML
的限制,项目页面上有一些“图表”请求:
https://github.com/ClosedXML/ClosedXML/issues?utf8=%E2%9C%93&q=is%3Aissue+chart
但是担心XLSX格式不是很简单!它只是一堆压缩的文件 我们仍然可以使用ClosedXML编辑该工作表将其保存为临时文件,然后替换原始文件上的工作表,这是我的代码:
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