2010-01-06 2 views
2

Я использую библиотеку OpenXML для получения данных и вставляю их в предварительно форматированный файл excel. Это прекрасно работает.Обновить промежуточные итоги в файлах excel

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

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

Код для создания таблицы:

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

ответ

5

БИБЛИОТЕКА OpenXML не пересчитывать результаты формул. Один из способов решить это - удалить значения (а не формулы) из ваших субтотальных ячеек. Это заставляет Excel выполнять автоматическое перерасчет.

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

// 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(); 
} 

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

+0

Спасибо, что получил. –

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