【问题标题】:Removing a formula from Excel using OpenXML使用 OpenXML 从 Excel 中删除公式
【发布时间】:2018-03-14 00:14:05
【问题描述】:

我正在尝试使用 openxml 从工作表中删除所有公式。这就是我正在尝试的:

internal static void ReplaceFormulaWithValue()
{
    var res = _worksheetPart.Worksheet.GetFirstChild<SheetData>().Elements<Row>();      

    foreach (Row row in _worksheetPart.Worksheet.GetFirstChild<SheetData>().Elements<Row>())
    {
        foreach (Cell cell in row.Elements<Cell>())
        {
            if (cell.CellFormula != null &&
                  cell.CellValue != null)
            {
                string cellRef = cell.CellReference;
                CalculationChainPart calculationChainPart = _spreadSheet.WorkbookPart.CalculationChainPart;
                CalculationChain calculationChain = calculationChainPart.CalculationChain;
                var calculationCells = calculationChain.Elements<CalculationCell>().ToList();
                CalculationCell calculationCell = calculationCells.Where(c => c.CellReference == cellRef).FirstOrDefault();
                //CalculationCell calculationCell = calculationChain.Elements<CalculationCell>().Where(c => c.CellReference == cell.CellReference).FirstOrDefault();

                string value = cell.CellValue.InnerText;
                UpdateCell(cell, DataTypes.String, value);

                cell.CellFormula.Remove();
                calculationCell.Remove();                   
            }
        }
    }
    SaveChanges();
}

打开 excel 文档时,我收到以下错误:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<recoveryLog xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
<logFileName>error192600_01.xml</logFileName><summary>Errors were detected in file 'C:\DEV\ExcelEditor\ExcelEditor\bin\Debug\Chart.xlsx'</summary>
<removedParts summary="Following is a list of removed parts:">
<removedPart>Removed Part: /xl/calcChain.xml part with XML error.  (Calculation properties) Catastrophic failure Line 1, column 138.</removedPart>
</removedParts></recoveryLog>

所以我将旧的 calcChain.xml 文件与使用 OpenXML SDK 工具新生成的文件进行比较。旧文件有以下内容:

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<calcChain xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
 <c i="1" l="1" r="D2"/>
</calcChain>

运行我的代码后的新代码:

<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<x:calcChain xmlns:x="http://schemas.openxmlformats.org/spreadsheetml/2006/main">  
</x:calcChain>

如果我在这里遗漏了什么,谁能帮忙。

【问题讨论】:

    标签: c# openxml openxml-sdk


    【解决方案1】:

    如果要删除所有公式,需要一个空的 calcChain.xml 吗?你试过删除它吗?

    这对我有用:

    public static void ReplaceFormulasWithValue()
    {
        try
        {
            CalculationChainPart calculationChainPart = _spreadSheet.WorkbookPart.CalculationChainPart;
            CalculationChain calculationChain = calculationChainPart.CalculationChain;
            var calculationCells = calculationChain.Elements<CalculationCell>().ToList();
    
            foreach (Row row in _worksheetPart.Worksheet.GetFirstChild<SheetData>().Elements<Row>())
            {
                foreach (Cell cell in row.Elements<Cell>())
                {
                    if (cell.CellFormula != null && cell.CellValue != null)
                    {
                        string cellRef = cell.CellReference;                            
                        CalculationCell calculationCell = calculationCells.Where(c => c.CellReference == cellRef).FirstOrDefault();
    
                        UpdateCell(cell, DataTypes.String, cell.CellValue.InnerText);
    
                        cell.CellFormula.Remove();
                        if(calculationCell != null)
                        {                       
                            calculationCell.Remove();
                            calculationCells.Remove(calculationCell);
                        }
                        else
                        {
                            //Something is went wrong - log it
                        }                   
                    }
                    if (calculationCells.Count == 0)
                         _spreadSheet.WorkbookPart.DeletePart(calculationChainPart);
    
                }
                _worksheetPart.Worksheet.Save();
            }
        }
        catch(Exception ex)
        {
            Console.WriteLine(ex);
        }
    }
    

    【讨论】:

    • 这行得通。但是为什么一个空的 xml 会导致错误呢?有什么关系需要处理吗?
    猜你喜欢
    • 2018-05-10
    • 2017-03-30
    • 1970-01-01
    • 2011-02-09
    • 1970-01-01
    • 1970-01-01
    • 2018-05-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多