通过C#刷新和保存Excel文件

3
我使用以下代码来打开、刷新、保存并关闭Excel文件:
Application excelFile = new Application();               
Workbook theWorkbook = excelFile.Workbooks._Open(Environment.CurrentDirectory + "/WebGate", 0, false, 5, System.Reflection.Missing.Value, System.Reflection.Missing.Value, false, System.Reflection.Missing.Value, System.Reflection.Missing.Value, true, false, System.Reflection.Missing.Value, false);    
Sheets sheets = (Sheets)theWorkbook.Worksheets;    
theWorkbook.RefreshAll();    
theWorkbook.Save();    
excelFile.Quit();

问题在于刷新和保存命令之间存在冲突,因为文件在后台保存时正在进行刷新(我猜测)。 有人能帮我解决这个问题吗?我需要知道如何确定何时完成刷新过程或任何其他指示,以便在不影响刷新进程的情况下保存文件。

这个问题的症状究竟是什么?即你怎么知道有冲突? - configurator
弹出消息告诉我该操作(保存)将影响刷新等待刷新过程,并询问我是否要取消该操作(保存操作)。 - eran
4个回答

4

我对C#不熟悉,但我擅长Excel VBA。 问题在于大多数数据透视表的BackgroundQuery属性都设置为True,这使得数据透视表异步刷新,以便Excel文件在最终用户使用时保持响应。如果您在与文件交互期间没有添加任何新的数据透视表,则可以通过在“外部数据选项”下的“数据透视表->表设置->后台查询”中取消选中BackgroundQuery来修复文件。如果您要添加数据透视表,则需要将此属性设置为false,如下:

Dim oPivot As PivotTable
set oPivot=worksheets("xyz").PivotTables("Pivot1") 
oPivot.PivotCache.BackgroundQuery = False

如果您不确定要修复哪个表格,并且在Excel中有很多表格,则可以使用以下代码在Excel VBA中修复它。

Public Sub FixPivotTables()
    Dim oPivot As New PivotTable, oSheet As Worksheet
    For Each oSheet In ThisWorkbook.Worksheets
        For Each oPivot In oSheet.PivotTables
            oPivot.PivotCache.BackgroundQuery = False
        Next
    Next
End Sub

3

我已经查看了文档,以下是我的翻译。

获取你要刷新的QueryTable对象。它有一个名为"AfterRefresh"的事件,你可以使用它来执行任何操作。

此外,不要对整个工作簿进行刷新,而是对特定的QueryTable进行刷新(除非你有多个QueryTable)。 QueryTable有一个Refresh方法,它需要一个名为BackGroundQuery的布尔参数,你可以将其设置为False。

我猜这会同步查询记录。
这对你有用吗?


2

Eran,我根据文档中的理解来发布此内容。

我假设您正在使用数据透视表,并且它使用某种查询。
尝试使用Workbook对象的PivotTableCloseConnection,看能否在其中调用Save方法。

在Excel 2007中,Application对象具有AfterCalculate事件-这也可能会有用。

如何模拟此情况?


0

尝试使用:

this.Application.ActiveWorkbook.RefreshAll();
this.Application.ActiveWorkbook.Save();

如有必要,请使用.ReCalculate()操作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接