插入公式给出误差.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();
}
}
这个函数有两个问题。
第一个问题是您显式地将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。