我正在使用 C# 和 openxml。如何删除包含公式的单元格?

问题描述 投票:0回答:1

我正在将 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();

    }

}

c# excel openxml-sdk
1个回答
0
投票

我的答案基于此处的答案:使用 OpenXML 从 Excel 中删除公式

公式保存在工作簿的单独部分中,为了数据完整性,应将其从其名称中删除,在您展示的简单演示中,可以在保存之前在一行中完成:

spreadsheetdocument.WorkbookPart
              .CalculationChainPart
              .CalculationChain
              .Elements<CalculationCell>()
              .FirstOrDefault(cc => cc.CellReference == cell.CellReference)?
              .Remove();

在实际情况下(动态清除多个单元格),准备一本公式单元格字典可能会更有效,如我提供的链接中的其他答案所示。

OpenXml 对于此类操作并不理想,因为它访问存储在非常低级别的数据,并且您需要检查如何执行每个操作。我建议使用 EPPlus。

(OpenXml和EEPlus都不需要在电脑上安装office)。

© www.soinside.com 2019 - 2024. All rights reserved.