更新Excel文件中的小计

时间:2010-01-06 13:24:28

标签: .net asp.net excel openxml

我使用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 个答案:

答案 0 :(得分: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();
}

此代码删除包含公式和值的所有单元格的值。为了加快速度,您可以非常轻松地对其进行自定义,以便处理小计单元格。