Обновление промежуточных итогов в файлах Excel - PullRequest
2 голосов
/ 06 января 2010

Я использовал библиотеку OpenXML, чтобы взять таблицу данных и вставить ее в предварительно отформатированный файл Excel. Это отлично работает.

Проблема, с которой я столкнулся, заключается в том, что в верхней части предварительно отформатированного файла Excel есть строка промежуточных итогов, в которой задан промежуточный итог для каждого столбца этих данных (поэтому в каждом столбце есть промежуточный итог). Когда я открываю файл Excel после того, как он был создан, все эти значения равны 0, они не обновлялись при вставке таблицы данных. Если вы выделите одну из этих промежуточных ячеек и нажмете клавишу ввода, она обновится и покажет правильное значение.

Какой самый простой способ обновить эти значения и отобразить правильное значение, как только пользователь откроет загруженную электронную таблицу?

Код для создания электронной таблицы:

MemoryStream memoryStream = SpreadsheetReader.StreamFromFile(TemplateDirectory + @"\" + "exceltTemplate.xlsx");
doc = SpreadsheetDocument.Open(memoryStream, true);
worksheetPart = SpreadsheetReader.GetWorksheetPartByName(doc, currentSheetName);
writer = new WorksheetWriter(doc, worksheetPart);
cellName = "A8";
writer.PasteDataTable(reports.Tables[0], cellName);
SpreadsheetWriter.Save(doc);

1 Ответ

5 голосов
/ 06 января 2010

Библиотека OpenXML не пересчитывает результаты формул. Одним из способов решения этой проблемы является удаление значений (а не формул) из промежуточных ячеек. Это приводит к тому, что Excel выполняет автоматический пересчет.

Эта ссылка объясняет это более подробно. Примерно на полпути вниз по странице вы увидите следующий код, который важен для ваших нужд:

// remove all values of cells with formulas on a sheet
// so that Excel refreshes them upon Open
public static void ClearAllValuesInSheet
      (SpreadsheetDocument spreadSheet, string sheetName)
{
    WorksheetPart worksheetPart =
        GetWorksheetPartByName(spreadSheet, sheetName);

    foreach (Row row in
       worksheetPart.Worksheet.
          GetFirstChild().Elements())
    {
    foreach (Cell cell in row.Elements())
    {
        if (cell.CellFormula != null &&
              cell.CellValue != null)
        {
        cell.CellValue.Remove();
        }
    }

    }

    worksheetPart.Worksheet.Save();
}

Этот код удаляет значения для всех ячеек, которые содержат формулы и значения. Чтобы ускорить его, вы можете легко настроить его так, чтобы он имел дело только с вашими промежуточными ячейками.

...