2015-10-06 130 views
0

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

当我手动更新这个单元格时,所有的计算都能正常工作,但是当使用c#代码进行更新时,它不起作用。

Pleasse这里查看我的代码

  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。有没有其他方法来强制更新依赖单元格?

+0

你是什么意思“依赖细胞”?你的意思是你想迫使公式重新计算?它本身不会这样做。 *为什么*你不想使用OpenXML?使用像EPPlus这样的库直接更新单元更快,更容易,更安全(等),*不需要JET驱动。它支持公式重新计算(http://epplus.codeplex.com/wikipage?title=About%20Formula%20calculation&referringTitle=Documentation) –

+0

是的,我想迫使公式重新计算。我不想使用开放式XML,因为每当我们在门户(云环境)上推新版本时,我们都需要安装Office及其OpenXML SDK。 –

+0

不,你不!这是195%错误!事实上,这是OLEDB提供商需要额外安装。我认为你将Open XML与Office Interop混为一谈。 Open XML SDK只是用于处理Office文件的库。您可以将其添加到您的项目中,就像其他任何程序集一样,或者像EPPlus –

回答

-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。图书馆是一个容易得多比开放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(); 
} 

开放XML SDK并需要安装的Office或服务器上的SDK - 这不是办公室互操作,这是一个库,允许直接操作XLSX文件。它也不需要像OLEDB那样安装任何驱动程序。

EPPlus使得使用XLSX文件变得更容易,增加了更简单的格式化,操作,LINQ查询,甚至直接从DataTable或集合中加载。您只需将图书馆的NuGet package添加到项目中即可。

+0

使用ForceFullCalculation是矫枉过正的(关闭Excel的智能重新计算,并使工作簿中的每个公式都可以在每次计算时计算),并且可能会减慢工作簿的计算速度。最好将“计算”设置为自动。 –

+0

@CharlesWilliams最好不必强制重新计算,并从头开始生成完整的Excel文件。此外,FullCalculationOnLoad在Excel 2007中不可用,我怀疑它是否可用,例如在Google Docs中。除非OP能保证使用Excel版本,否则可能需要这两个选项。 –

+0

你不需要Forcefullcalculation或Fullcalculationonload:无论如何Excel会打开它,文件将被计算。 –