当使用c#代码和oledb更新任何excel单元格时,如何强制更新依赖单元格?
当使用c#代码和oledb更新任何excel单元格时,如何强制更新依赖单元格?我的站点托管在云环境中。用户单击按钮,此时我的代码从数据库中获取所需的值,并更新少数excel单元格,并提示用户下载此excel表。许多计算都依赖于此更新的excel单元格 当我手动更新此单元格时,所有计算都可以正常工作,但当使用c#代码进行更新时,它不起作用 请在这里检查我的代码当使用c#代码和oledb更新任何excel单元格时,如何强制更新依赖单元格?,c#,excel,oledb,C#,Excel,Oledb,当使用c#代码和oledb更新任何excel单元格时,如何强制更新依赖单元格?我的站点托管在云环境中。用户单击按钮,此时我的代码从数据库中获取所需的值,并更新少数excel单元格,并提示用户下载此excel表。许多计算都依赖于此更新的excel单元格 当我手动更新此单元格时,所有计算都可以正常工作,但当使用c#代码进行更新时,它不起作用 请在这里检查我的代码 String connstring = "Provider=Microsoft.ACE.OLEDB.12.0;Da
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();
我不想使用开放式XML。是否有其他方法强制更新依赖单元格?您要问的是,当您更改Excel工作表的值时,如何强制重新计算公式。使用OLE DB提供程序时无法执行此操作,因为它将Excel工作表视为另一个数据库。只有Excel本身能够执行公式并重新计算结果 如果代码使用模板Excel文件,则可以通过更改“公式”菜单中的“计算”选项,在Excel中打开该文件,更改文件的属性以重新计算公式 不过,更好的选择是使用Open XML而不是JET来设置值,并更改文件的计算选项以在加载时重新计算,如中所示 即使这样也不会重新计算公式,但每次在Excel中打开文件时,它都会将计算属性更改为重新计算 更好的选择是使用类似的库,它可以。该库也比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();
}
OpenXMLSDK不需要在服务器上安装Office或SDK,它不是Office互操作,而是一个允许直接操作XLSX文件的库。它也不需要像OLEDB那样安装任何驱动程序
EPPlus使使用XLSX文件变得更加容易,增加了更容易的格式、操作、LINQ查询,甚至可以直接从数据表或集合加载。您只需将库添加到项目中 “依赖细胞”是什么意思?你的意思是要强制公式重新计算?它本身不会这样做。为什么不想使用OpenXML?使用像EPPlus这样的库直接更新单元格更快、更容易、更安全(等等),不需要JET驱动程序。是的,我想强迫公式重新计算。我不想使用开放式XML,因为每次我们在门户(云环境)上推送新版本时,我们都需要安装Office及其用于开放式XML的SDK。不,你不需要!这是195%的错误!事实上,需要额外安装的是OLEDB提供程序。我认为您混淆了开放XML和Office互操作。OpenXMLSDK只是一个用于操作office文件的库。您可以像任何其他程序集一样将其添加到项目中,也可以像EPPlusGreat一样在其上使用库。我试过EPPlus。工作很好。谢谢…使用ForcellCalculation是一种过火的做法(关闭Excel的智能重新计算,并使工作簿中的每个公式在每次计算时都进行计算),而且会减慢工作簿的计算速度。最好只是将计算设置为自动。@CharlesWilliams最好根本不必强制重新计算,从一开始就生成一个完整的Excel文件。此外,FullCalculationOnLoad在Excel 2007中不可用,我怀疑它是否在Google文档中可用。除非OP可以保证使用Excel版本,否则这两个选项都是必需的。您不需要强制计算或完全计算加载:文件将在Excel打开时进行计算。@Charles Williams在这种情况下OP的问题(以及链接的问题)是无意义的。正如我所说,创建一个完整的文件比依赖于应用程序的行为或最终用户的设置要好。仅仅因为它是一个Excel文件并不意味着它将被Excel打开,因为某些单元格仍然无法工作。我想分享屏幕截图。如何在这里共享图像?
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();
}