Excel "Обновить все" с OpenXML - PullRequest
6 голосов
/ 11 октября 2010

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

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

Спасибо.

Ответы [ 3 ]

11 голосов
/ 28 ноября 2012

Ну, для этого есть неплохой обходной путь.Используя 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.

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;
    }

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

2 голосов
/ 22 января 2011

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

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

2 голосов
/ 19 октября 2010

Я думаю, что единственный способ сделать это - следовать этому типу метода.

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

ThisWorkbook.PivotCaches(yourIndex).Refresh();

или

ThisWorkbook.RefreshAll();

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

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