0

我的要求是为单元格插入公式。我正在使用以下方法插入公式。并且它的插入公式正确,公式工作正常。但是当我插入公式时,我的 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();
    }
}
4

1 回答 1

1

该功能有2个问题。

第一个问题是您将 RowIndex 显式设置为 4U。您分配公式的单元格必须位于第 4 行,例如单元格 C4。由于单元格引用作为参数 (strCellIndex) 传入,因此无法保证。

即使你解决了这个问题,我们还有下一个(也是更隐蔽的)问题......

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

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

我会给你留下有趣的错误检查任务,例如如果没有 Row 类开始,或者所有 Row 类的 RowIndex-es 小于你要插入的 Row 类,或者(这是有趣的)与要插入的 Row 类具有相同 RowIndex 的现有 Row 类。

于 2013-05-14T02:25:43.633 回答