обновить и сохранить файл Excel с помощью C # - PullRequest
3 голосов
/ 25 декабря 2008

Я использую этот код для открытия, сохранения, сохранения и закрытия файла 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();

проблема в том, что существует конфликт между командами обновления и сохранения, потому что файл был сохранен, а обновление было выполнено в фоновом режиме (я полагаю) Кто-нибудь может мне с этим помочь? Мне нужно знать, как я могу узнать, когда завершится процесс обновления или какие-либо другие указания, которые помогут мне решить, когда следует сохранить файл без вреда для процесса обновления

Ответы [ 4 ]

4 голосов
/ 27 декабря 2008

Я не знаком с C #, но хорошо разбираюсь в Excel VBA. Проблема здесь в том, что для большинства сводных таблиц свойство BackgroundQuery имеет значение True, в результате чего сводные таблицы обновляются асинхронно, поэтому файл Excel реагирует на повторное реагирование при использовании конечным пользователем. Если вы не добавляете какие-либо новые сводные таблицы во время транзакции с файлом, вы можете исправить файл один раз, сняв флажок BackgroundQuery в Сводная таблица-> Настройка таблицы-> 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 голосов
/ 26 декабря 2008

Опять же, я посмотрел на документацию, и вот что я могу сказать.

Получите объект QueryTable, который вы обновляете. У него есть событие с именем «AfterRefresh», которое вы можете использовать для любых действий.

Кроме того, вместо того, чтобы выполнять обновление для книги, выполните обновление для определенного QueryTable (если у вас нет нескольких QueryTables). QueryTable имеет метод Refresh, который принимает логический параметр с именем BackGroundQuery, который можно установить в False.

Полагаю, это будет синхронно запрашивать записи.
Это работает для вас?

2 голосов
/ 25 декабря 2008

Эран, я публикую это на основании того, что я понимаю в документации.

Я предполагаю, что вы используете сводные таблицы, и он использует какой-то запрос.
Попробуйте использовать PivotTableCloseConnection объекта Workbook и посмотрите, сможете ли вы вызвать внутри него функцию Save.

В Excel 2007 объект Application имеет событие AfterCalculate, которое также может быть полезным.

Как можно смоделировать этот сценарий?

0 голосов
/ 10 августа 2012

Попробуйте использовать:

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

При необходимости используйте действие .ReCalculate().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...