今晚打老虎 发表于 2022-11-18 15:57:22

当Excel中有跨文件计算公式时,请问公式的刷新问题。

桌面上有两个Excel文件,A文件中存储学生数据,B文件为报表模板。

假设A文件中第一个表名为学生表,A列1至5行的数据为分别为:男、男、女、女、女。
假设B文件中第一个表名为计算表,A1的公式为:=COUNTIF('C:\Users\Administrator\Desktop\学生表'!$A$1:$A$5,"女"),此时公式计算值为3
                                                   A2的公式为:=COUNTIF('C:\Users\Administrator\Desktop\学生表'!$A$1:$A$5,"男"),此时公式计算值为2

if (ofdComputationSheetFile.ShowDialog() == DialogResult.OK)
{
      pathComputationSheet = ofdComputationSheetFile.FileName;      //此处选择桌面上的B.xlsx文件
      spreadComputationSheet.OpenExcel(pathComputationSheet, ExcelOpenFlags.TruncateEmptyRowsAndColumns);
}

当A文件中学生表A列的值发生变化时,如修改为:男、男、男、女、女。
此时,B文件中计算表,A1的公式计算值没有发生变化,仍为3。(正确应为2)
                                    A2的公式计算值没有发生变化,仍为2。(正确应为3)

请问程序中如何能刷新加载到Spread控件中的公式计算。

Richard.Ma 发表于 2022-11-18 15:57:23

目前spread没有办法

Interop.Excel毕竟和excel本身基本就是一个东西,其实和你手工解决的效果是一样的

Richard.Ma 发表于 2022-11-18 16:51:35

本帖最后由 Richard.Ma 于 2022-11-18 17:12 编辑

可以参考一下这里设置看看

https://www.grapecity.com/spread ... in-externalref.html

设置公式后设置下面的代码
fpSpread1.AllowUserFormulas = true;

今晚打老虎 发表于 2022-11-18 17:46:17

试过了,还是不行。这个应该不是控件的问题,而是Excel跨文件引用公式计算的问题。现在看了一些资料,还没找到代码解决的方法。


手工解决倒是弄明白了。需要手工打开B文件,点击【数据】——【编辑链接】——【更新值】。

然后上面的代码,加载B文件,跨文件引用公式计算的值就是正确的了。

Richard.Ma 发表于 2022-11-18 18:13:17

嗯,那这个确实就没有办法通过控件层面来解决了。

今晚打老虎 发表于 2022-11-18 18:15:21

目前用COM组件Microsoft.Office.Interop.Excel,可以代码刷新跨文件引用公式计算的问题了。

      // using Microsoft.Office.Interop.Excel;

      Application excelComputationSheet = new Application();
      Workbook bookComputationSheet = excelComputationSheet.Workbooks.Open(pathComputationSheet);
      excelComputationSheet.Visible = true;
      excelComputationSheet.AskToUpdateLinks = true;
      excelComputationSheet.ScreenUpdating = true;
      bookComputationSheet.UpdateRemoteReferences = true;
      Array links = bookComputationSheet.LinkSources(XlLink.xlExcelLinks) as Array;
      if (links != null)
      {
            foreach (string strName in links)
            {
                bookComputationSheet.UpdateLink(strName, XlLinkType.xlLinkTypeExcelLinks);
            }
      }
      bookComputationSheet.RefreshAll();
      bookComputationSheet.Save();
      bookComputationSheet.Close();
      excelComputationSheet.Quit();

      spreadComputationSheet.OpenExcel(pathComputationSheet, ExcelOpenFlags.TruncateEmptyRowsAndColumns);

不知道Spread.Net有没有类似的代码刷新机制?原理其实是刷新Microsoft Excel 源的链接。

页: [1]
查看完整版本: 当Excel中有跨文件计算公式时,请问公式的刷新问题。