【问题标题】:How to force update dependent cell when updated any excel cell using c# code and oledb?使用c#代码和oledb更新任何excel单元格时如何强制更新依赖单元格?
【发布时间】:2015-10-06 16:19:34
【问题描述】:

如何在使用 c# 代码和 oledb 更新任何 excel 单元格时强制更新依赖单元格?我的网站托管在云环境中。用户单击按钮,当时我的代码从数据库中获取所需的值并更新几个 excel 单元格并提示用户下载此 excel 表。大量的计算取决于这个更新的 excel 单元格。

当我手动更新此单元格时,所有计算都可以正常工作,但使用 c# 代码更新时,它不起作用。

请在此处查看我的代码

            String connstring = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties=\"Excel 12.0 XML;HDR=NO\";";

            System.Data.OleDb.OleDbConnection MyConnection;

            System.Data.OleDb.OleDbCommand myCommand = new System.Data.OleDb.OleDbCommand();

            string sql = null;

            MyConnection = new System.Data.OleDb.OleDbConnection(connstring);

            MyConnection.Open();

            myCommand.Connection = MyConnection;

            //term in months
            sql = "UPDATE [InputSheet$C7:C7] SET F1 = " + model.Lender.ApprovedTerm;
            myCommand.CommandText = sql;
            myCommand.ExecuteNonQuery();

            //intrest rate
            sql = "UPDATE [InputSheet$C8:C8] SET F1 = " + model.Lender.ContractRate;
            myCommand.CommandText = sql;
            myCommand.ExecuteNonQuery();

            //loan amount
            sql = "UPDATE [InputSheet$C9:C9] SET F1 = " + model.Lender.ApprovedLoanAmt;
            myCommand.CommandText = sql;
            myCommand.ExecuteNonQuery();

            MyConnection.Close();

我不想使用 Open XML。有没有其他方法可以强制更新依赖单元格?

【问题讨论】:

  • “依赖细胞”是什么意思?你的意思是你想强制公式重新计算?它不会自己这样做。 为什么你不想使用 OpenXML?使用像 EPPlus 这样的库直接更新单元会更快、更容易、更安全(等等),不需要需要 JET 驱动程序。它supports formula recalculation
  • 是的,我想强制公式重新计算。我不想使用开放 XML,因为每次我们在门户(云环境)上推送新版本时,我们都需要安装 Office 及其 OpenXML 的 SDK。
  • 不,你没有!这是 195% 的错误!事实上,需要额外安装的是 OLEDB 提供程序。我认为您将 Open XML 与 Office Interop 混淆了。 Open XML SDK 只是一个用于处理办公文件的库。您可以像任何其他程序集一样将其添加到您的项目中,或者在其上使用库,例如​​ EPPlus
  • 太棒了。试过 EPPlus。工作正常。谢谢...

标签: c# excel oledb


【解决方案1】:

您要问的是,当您更改 Excel 工作表的值时,如何强制重新计算公式。当您使用 OLE DB 提供程序时,您不能这样做,因为它将 Excel 工作表视为另一个数据库。只有 Excel 本身能够执行公式并重新计算结果。

如果您的代码使用模板 Excel 文件,您可以更改在 Excel 中打开文件,通过更改公式菜单中的计算选项来重新计算公式的文件属性。

一个更好的选择是使用 Open XML 而不是 JET 来设置值并更改文件的计算选项以在加载时重新计算,如 this SO question 所示

spreadSheet.WorkbookPart.Workbook.CalculationProperties.ForceFullCalculation = true;
spreadSheet.WorkbookPart.Workbook.CalculationProperties.FullCalculationOnLoad = true;

即使这不会重新计算公式,它也会更改计算属性以在您每次在 Excel 中打开文件时重新计算。

更好的选择是使用像EPPlus 这样的库,它可以calculate formulas。该库也比 Open XML SDK 更易于使用:

using(var package = new ExcelPackage(new FileInfo(@"c:\temp\tmp.xlsx")))
{
   var sheet=package.Workbook.Worksheets["my sheet"];
   var lender=model.Lender;
   sheet.Cells["C7"].Value=lender.ApprovedTerm;
   sheet.Cells["C8"].Value=lender.ContractRate;
   sheet.Cells["C9"].Value=lender.ApprovedLoanAmt;
   // calculate all formulas in the sheet
   sheet.Calculate();
}

Open XML SDK不需要需要在服务器上安装 Office 或 SDK - 它不是 Office Interop,它是一个允许直接操作 XLSX 文件的库。它也不需要像 OLEDB 那样安装任何驱动程序。

EPPlus 使处理 XLSX 文件变得更加容易,添加了更简单的格式设置、操作、LINQ 查询,甚至直接从 DataTables 或集合加载。您只需将库的NuGet package 添加到项目中。

【讨论】:

  • 使用 ForceFullCalculation 太过分了(关闭 Excel 的智能重新计算,并使工作簿中的每个公式在每次计算时都进行计算)并且会减慢工作簿的计算速度。最好将计算设置为自动。
  • @CharlesWilliams 最好根本不必强制重新计算,并从头开始生成完整的 Excel 文件。此外,FullCalculationOnLoad 在Excel 2007 中 可用,我怀疑它是否在Google Docs 中可用。除非 OP 可以保证使用的 Excel 版本,否则可能需要这两个选项。
  • 您不需要 Forcefullcalculation 或 Fullcalculationonload:文件将在 Excel 打开时进行计算。
  • @CharlesWilliams 在这种情况下,OP 的问题(和链接的问题)毫无意义。正如我所说,创建一个完整的文件比依赖于应用程序的行为或最终用户的设置更好。仅仅因为它是一个 Excel 文件并不意味着它会被 Excel 打开
  • 对于某些单元格仍然无法正常工作。我想分享屏幕截图。如何在此处分享图片?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多