2010-10-11 2 views
6

У меня есть файл excel 2007 (формат OpenXML) с подключением к XML-файлу. Это соединение создает таблицу Excel и сводные диаграммы.Excel «Обновить все» с OpenXML

Я пытаюсь найти способ с OpenXML SDK v2 сделать то же самое, что и кнопка «Обновить все» в Excel. Чтобы я мог автоматически обновлять свой файл, как только появится новый XML-файл.

спасибо.

+0

Что касается сводных таблиц, я просто проверил опцию «Обновить данные при открытии файла» каждой сводной таблицы. –

ответ

2

Вы не можете сделать это с помощью Open XML. Open XML позволяет работать с данными, хранящимися в файле, и изменять данные, формулы и определения и т. Д. На самом деле это не делает никаких расчетов.

Автоматизация Excel технически будет работать, но она абсолютно не рекомендуется для серверной среды, и ее лучше всего избегать на рабочем столе, если это вообще возможно.

2

Я думаю, что единственный способ, которым Вы можете сделать это следующий этот тип метода ..

  1. Сохранить Open XML книгу обратно в файл XLSX.
  2. Загрузите книгу с использованием объектной модели Excel.
  3. Вызов либо

ThisWorkbook.PivotCaches(yourIndex).Refresh();

или

ThisWorkbook.RefreshAll();

хотя я был уверен, что RefreshAll также будет работать.

  1. Используйте объектную модель, чтобы сохранить книгу и закрыть ее.
  2. Повторно открыть для использования пространства имен xml.
+0

Это метод класса COM excel.Он недоступен в классах OpenXML, поскольку он предназначен для управления XML. Наконец-то я не думаю, что это возможно. –

+0

Обновить Все должно обновлять сводные таблицы. Я отредактирую свой ответ в соответствии с вашим комментарием выше. –

+0

Спасибо за ваше время, но я наконец нашел другое решение для своей проблемы: я установил параметр «обновить при открытии файла» всех моих сводных таблиц. Затем я просто экспортирую данные в основную таблицу, чтобы файл excel автоматически менялся. –

10

Хорошо, есть неплохой обходной путь для этого. Используя OpenXML, вы можете включить опцию «обновить данные при открытии файла» в сводной таблице (щелкните правой кнопкой мыши по сводной таблице-> Параметры сводной таблицы-> вкладки данных). Этот результат при автоматическом обновлении сводной таблицы при первом открытии электронной таблицы пользователя. Код:

using (var document = SpreadsheetDocument.Open(newFilePath, true)) 
     { 
      var uriPartDictionary = BuildUriPartDictionary(document); 

      PivotTableCacheDefinitionPart pivotTableCacheDefinitionPart1 = (PivotTableCacheDefinitionPart)uriPartDictionary["/xl/pivotCache/pivotCacheDefinition1.xml"]; 
      PivotCacheDefinition pivotCacheDefinition1 = pivotTableCacheDefinitionPart1.PivotCacheDefinition; 
      pivotCacheDefinition1.RefreshOnLoad = true;    
     } 

вам нужно определить "путь" к вашему pivotCacheDefinition - использовать OpenXML SDK 2.0 Productivity Tool, чтобы искать его.

BuildUriPartDictionary является стандартным методом генерируется OpenXML SDK 2.0 Productivity Tool

protected Dictionary<String, OpenXmlPart> BuildUriPartDictionary(SpreadsheetDocument document) 
    { 
     var uriPartDictionary = new Dictionary<String, OpenXmlPart>(); 
     var queue = new Queue<OpenXmlPartContainer>(); 
     queue.Enqueue(document); 
     while (queue.Count > 0) 
     { 
      foreach (var part in queue.Dequeue().Parts.Where(part => !uriPartDictionary.Keys.Contains(part.OpenXmlPart.Uri.ToString()))) 
      { 
       uriPartDictionary.Add(part.OpenXmlPart.Uri.ToString(), part.OpenXmlPart); 
       queue.Enqueue(part.OpenXmlPart); 
      } 
     } 
     return uriPartDictionary; 
    } 

Другое решение заключается в преобразовании таблицы в macroenabled, встроить туда скрипт VBA, который будет обновить все сводные таблицы. Это может произойти при нажатии кнопки или при открытии электронной таблицы. Здесь вы можете найти VBA код для обновления сводных таблиц: http://www.ozgrid.com/VBA/pivot-table-refresh.htm

Смежные вопросы