我通过Microsoft Office OpenXML SDK 2.0更新Excel电子表格的一些单元格。更改值会使包含依赖于已更改单元格的公式的所有单元格无效。但是,由于缓存的值,Excel不会重新计算公式,即使用户单击“立即计算”。
通过SDK使整个工作簿的所有相关单元无效的最佳方法是什么?到目前为止,我在http://cdonner.com/introduction-to-microsofts-open-xml-format-sdk-20-with-a-focus-on-excel-documents.htm找到了以下代码段:
public static void ClearAllValuesInSheet
(SpreadsheetDocument spreadSheet, string sheetName)
{
WorksheetPart worksheetPart =
GetWorksheetPartByName(spreadSheet, sheetName);
foreach (Row row in
worksheetPart.Worksheet.
GetFirstChild().Elements())
{
foreach (Cell cell in row.Elements())
{
if (cell.CellFormula != null &&
cell.CellValue != null)
{
cell.CellValue.Remove();
}
}
}
worksheetPart.Worksheet.Save();
}
除了这个代码片段不能为我编译之外,它有两个限制:
我正在寻找一种有效的方法(特别是,只会使依赖于某个单元格值的单元格无效),并考虑所有表格。
更新
与此同时,我设法使代码编译和放大运行,并删除工作簿的所有工作表上的缓存值。 (参见答案。)我仍然对更好/替代解决方案感兴趣,特别是如何只删除实际依赖于更新单元格的单元格的缓存值。
答案 0 :(得分:43)
spreadSheet.WorkbookPart.Workbook.CalculationProperties.ForceFullCalculation = true;
spreadSheet.WorkbookPart.Workbook.CalculationProperties.FullCalculationOnLoad = true;
适合我!
答案 1 :(得分:2)
我用这个
static void FlushCachedValues(SpreadsheetDocument doc)
{
doc.WorkbookPart.WorksheetParts
.SelectMany(part => part.Worksheet.Elements<SheetData>())
.SelectMany(data => data.Elements<Row>())
.SelectMany(row => row.Elements<Cell>())
.Where(cell => cell.CellFormula != null)
.Where(cell => cell.CellValue != null)
.ToList()
.ForEach(cell => cell.CellValue.Remove())
;
}
这会刷新缓存的值
招呼
答案 2 :(得分:1)
由于它部分地解决了我的问题,到目前为止似乎没有更好的解决方案,将该代码块从问题转移到答案......这就是新代码的样子:
foreach (WorksheetPart worksheetPart in spreadSheet.WorkbookPart.WorksheetParts)
{
foreach (Row row in
worksheetPart.Worksheet.GetFirstChild<SheetData>().Elements())
{
foreach (Cell cell in row.Elements())
{
if (cell.CellFormula != null && cell.CellValue != null)
cell.CellValue.Remove();
}
}
}
答案 3 :(得分:1)
你需要在最后保存工作表,这对我有用。
foreach (WorksheetPart worksheetPart in spreadSheet.WorkbookPart.WorksheetParts) {
foreach (Row row in
worksheetPart.Worksheet.GetFirstChild<SheetData>().Elements()) {
foreach (Cell cell in row.Elements()) {
if (cell.CellFormula != null && cell.CellValue != null)
cell.CellValue.Remove();
}
}
worksheetPart.Worksheet.Save();
}
答案 4 :(得分:0)
算法:
示例:在45度和56 m / s的速度下,球应该走320米。
答案 5 :(得分:0)
或者,您可以更改公式以使用INDIRECT运算符。如果您使用的是SAX +模板文件方法,则特别有用。由于此解决方案不需要更改代码,因此只需模板excel文件。请在此处参考我的解决方案-Set xlsx to recalculate formulae on open