插入公式给出误差.Excel在"ab.xlsx"中发现无法读取的内容.你想要恢复

本文关键字:quot 读取 恢复 发现 xlsx 误差 Excel 插入 ab | 更新日期: 2023-09-27 18:13:13

我的要求是为单元格插入公式。我使用下面的方法插入公式。其插公式正确,公式运行良好。但是当我插入公式时,我的excel文件被更正并显示消息

"Excel在"exceltemplate.xlsx"中发现无法读取的内容

是否要恢复…的内容"。我搜索了很多,但没有解决。请帮忙解决这个

public void InsertFormula(string filepath, string SheetName, string strCellIndex, string strFormula)
{
    using (SpreadsheetDocument document = SpreadsheetDocument.Open(filepath, true))
    {
        IEnumerable<Sheet> sheets = document.WorkbookPart.Workbook.Descendants<Sheet>().Where(s => s.Name == SheetName);
        if (sheets.Count() == 0)
        {
            // The specified worksheet does not exist.
            return;
        }
        WorksheetPart worksheetPart = (WorksheetPart)document.WorkbookPart.GetPartById(sheets.First().Id);
        Worksheet worksheet = worksheetPart.Worksheet;
        SheetData sheetData = worksheet.GetFirstChild<SheetData>();
        Row row1 = new Row()
        {
            RowIndex = (UInt32Value)4U,
            Spans = new ListValue<StringValue>()
        };
        Cell cell = new Cell() { CellReference = strCellIndex };
        CellFormula cellformula = new CellFormula();
        cellformula.Text = strFormula;
        cell.DataType = CellValues.Number;
        CellValue cellValue = new CellValue();
        cellValue.Text = "0";
        cell.Append(cellformula);
        cell.Append(cellValue);
        row1.Append(cell);
        sheetData.Append(row1);
        worksheet.Save();
        document.Close();
    }
}

插入公式给出误差.Excel在"ab.xlsx"中发现无法读取的内容.你想要恢复

这个函数有两个问题。

第一个问题是您显式地将RowIndex设置为4U。给公式赋值的单元格必须在第4行,比如单元格C4。因为单元格引用是作为参数(strCellIndex)传入的,所以不能保证。

即使你解决了这个问题,我们还有下一个(也是更阴险的)问题…

第二个问题更难解决。Row类必须按顺序插入到SheetData类中(作为子对象),由RowIndex排序。假设您仍然希望将RowIndex硬编码为4U。这意味着如果现有的Excel文件有第2、3和7行,你必须插入Row类后面的RowIndex 3。这很重要,否则Excel会吐血(就像你已经经历过的那样)。

第二个问题的解决方案需要更多的工作。考虑SheetData类(或者实际上大多数Open XML SDK类)的InsertAt()、InsertBefore()和InsertAfter()函数。遍历SheetData的子类,直到找到一个Row类,其RowIndex大于所插入的Row类。然后使用InsertBefore()。

我将留给您一个有趣的错误检查任务,例如,如果没有Row类开始,或者所有Row类的RowIndex小于您要插入的Row类,或者(这里是有趣的)一个现有的Row类与您想要插入的Row类具有相同的RowIndex。