gpt4 book ai didi

c# - 打开xml sdk excel公式重新计算缓存问题

转载 作者:行者123 更新时间:2023-11-30 17:49:44 25 4
gpt4 key购买 nike

我已经查看了 SO 中类似问题的所有先前答案,但这些答案不起作用。我在 excel 中传递值并希望公式单元格重新计算但它仍然显示旧值。

我使用了 2 种技术 1) 从单元格中删除计算值 2) 以编程方式打开和关闭文件。他们两个都不适合我。这是我的代码。请帮忙。

            string filename = Server.MapPath("/") + "ExcelData.xlsx";



// getting 2 numbers in excel sheet, saving, and closing it.

using (SpreadsheetDocument document = SpreadsheetDocument.Open(filename, true))
{
Sheet sheet = document.WorkbookPart.Workbook.Descendants<Sheet>().SingleOrDefault(s => s.Name == "myRange1");
if (sheet == null)
{
throw new ArgumentException(
String.Format("No sheet named {0} found in spreadsheet {1}", "myRange1", filename), "sheetName");
}
WorksheetPart worksheetPart = (WorksheetPart)document.WorkbookPart.GetPartById(sheet.Id);

int rowIndex = int.Parse("C3".Substring(1));

Row row = worksheetPart.Worksheet.GetFirstChild<SheetData>().
Elements<Row>().FirstOrDefault(r => r.RowIndex == rowIndex);

Cell cell3 = row.Elements<Cell>().FirstOrDefault(c => "C3".Equals(c.CellReference.Value));
if (cell3 != null)
{
cell3.CellValue = new CellValue("13");
cell3.DataType = new DocumentFormat.OpenXml.EnumValue<CellValues>(CellValues.Number);
}

document.WorkbookPart.WorksheetParts
.SelectMany(part => part.Worksheet.Elements<SheetData>())
.SelectMany(data => data.Elements<Row>())
.SelectMany(row1 => row1.Elements<Cell>())
.Where(cell => cell.CellFormula != null && cell.CellValue != null)
.ToList()
.ForEach(cell => cell.CellValue.Remove());

worksheetPart.Worksheet.Save();

}



// getting the result out of excel.
using (SpreadsheetDocument document = SpreadsheetDocument.Open(filename, false))
{
document.WorkbookPart.Workbook.CalculationProperties.ForceFullCalculation = true;
document.WorkbookPart.Workbook.CalculationProperties.FullCalculationOnLoad = true;

Sheet sheet = document.WorkbookPart.Workbook.Descendants<Sheet>().SingleOrDefault(s => s.Name == "myRange1");
if (sheet == null)
{
throw new ArgumentException(
String.Format("No sheet named {0} found in spreadsheet {1}", "myRange1", filename), "sheetName");
}



WorksheetPart worksheetPart = (WorksheetPart)document.WorkbookPart.GetPartById(sheet.Id);

int rowIndex = int.Parse("C4".Substring(1));

Row row = worksheetPart.Worksheet.GetFirstChild<SheetData>().
Elements<Row>().FirstOrDefault(r => r.RowIndex == rowIndex);

Cell cell = row.Elements<Cell>().FirstOrDefault(c => "C4".Equals(c.CellReference.Value));

calculatedvalue = Convert.ToDouble(cell.CellValue.InnerText);
}

最佳答案

从您提供的代码片段中,我错过了您提到的博客中的重要部分。

如该博客所述,OpenXML 只能用于创建/读取/更新和删除 OpenXML 兼容应用程序的存储格式。您没有获得实际的应用程序引擎。要实现您想要的效果,您需要在您的服务器上安装 Excel,以便您可以利用 Microsoft.Office.Interop.Excel namespace它是 Application COM 接口(interface)或依赖最终用户 Excel 应用程序在打开更新的 Excel 工作表时进行重新计算。

code copied and text adapted from this blog

var excelApp = new Microsoft.Office.Interop.Excel.Application();
Workbook workbook = excelApp.Workbooks.Open(Path.GetFullPath(_filePath));
workbook.Close(true);
excelApp.Quit();

请注意,如果您需要它在服务器上运行(例如,因为您需要网页中的计算结果),您可能会在内存、I/O 和 CPU 方面遇到严重的性能问题。在那种情况下,我宁愿在 C# 中实现计算规则/公式。

关于c# - 打开xml sdk excel公式重新计算缓存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21311690/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com