我正在将 C# 与 openxml 和 Excel 2013 一起使用。我正在尝试删除具有公式的单元格。我可以删除没有公式的单元格,但是当我尝试使用公式删除它时,Excel 文件会损坏。
要复制错误,请创建一个 Excel 文件并将单元格 A1 设置为“=A2”。
运行以下代码,保存的excel文件将被损坏:
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;
using System.Linq;
class Program
{
static void Main()
{
string filePath = "c:\\test\\test.xlsx";
string worksheetName = "Sheet1";
//get first row
SpreadsheetDocument spreadsheetdocument = SpreadsheetDocument.Open(filePath, true);
WorkbookPart workbookpart = spreadsheetdocument.WorkbookPart;
Sheet sheet = workbookpart.Workbook.Descendants<Sheet>().FirstOrDefault(s => s.Name == worksheetName);
WorksheetPart worksheetpart = (WorksheetPart)workbookpart.GetPartById(sheet.Id);
SheetData sheetdata = worksheetpart.Worksheet.Elements<SheetData>().FirstOrDefault();
Row row = sheetdata.Elements<Row>().FirstOrDefault(r => r.RowIndex == 1);
//get first cell
Cell cell = row.Elements<Cell>().FirstOrDefault();
//delete cell
cell.Remove();
//save
worksheetpart.Worksheet.Save();
spreadsheetdocument.Save();
//dispose
spreadsheetdocument.Dispose();
}
}
我的答案基于此处的答案:使用 OpenXML 从 Excel 中删除公式
公式保存在工作簿的单独部分中,为了数据完整性,应将其从其名称中删除,在您展示的简单演示中,可以在保存之前在一行中完成:
spreadsheetdocument.WorkbookPart
.CalculationChainPart
.CalculationChain
.Elements<CalculationCell>()
.FirstOrDefault(cc => cc.CellReference == cell.CellReference)?
.Remove();
在实际情况下(动态清除多个单元格),准备一本公式单元格字典可能会更有效,如我提供的链接中的其他答案所示。
OpenXml 对于此类操作并不理想,因为它访问存储在非常低级别的数据,并且您需要检查如何执行每个操作。我建议使用 EPPlus。
(OpenXml和EEPlus都不需要在电脑上安装office)。