Используя Open XML, как вставить формулу в таблицу Excel 2010? - PullRequest
5 голосов
/ 10 июня 2011

Я использую Visual Studio 2010 (VB.Net) и Open XML SDK 2.0.Как вставить формулу в лист Excel 2010?Когда я делаю это, я также хочу установить для свойства CellValue ячейки значение DBNull или EmptyString, чтобы заставить Excel пересчитать ячейку при открытии пользователем рабочего блока.

Ответы [ 3 ]

6 голосов
/ 17 июня 2011

Просто оставьте CellValue как ноль и создайте новую CellFormula следующим образом:

Cell cell = new Cell()
{
  CellReference = "A3",
  DataType = new EnumValue<CellValues>(CellValues.Number),
  CellFormula = "SUM(A1:A2)"
};

Значение ячеек будет вычислено при открытии документа в Excel

0 голосов
/ 07 сентября 2013

вы можете установить формулу в шаблоне Excel и написать этот код для их пересчета:

spreadSheet.WorkbookPart.Workbook.CalculationProperties.ForceFullCalculation = True spreadSheet.WorkbookPart.Workbook.CalculationProperties.FullCalculationOnLoad = True
0 голосов
/ 24 июля 2012

Это взято из справочного документа, приложенного к файлу справки Open XML SDK 2.0 для Microsoft Office, с некоторыми изменениями для добавления формулы.

Main() находит пустой документ Excel с одним листом и добавляет формулу SUM() в ячейку A3.

Sub Main()
    Dim outputFilePath = "C:\Book1.xlsx"
    Dim doc As SpreadsheetDocument = SpreadsheetDocument.Open(outputFilePath, True)
    Dim workbookPart As WorkbookPart = doc.WorkbookPart
    Dim worksheetPart As WorksheetPart = workbookPart.WorksheetParts.First()

    InsertCellInWorksheet("A", 3, worksheetPart)
End Sub

' Given a column name, a row index, and a WorksheetPart, inserts a cell into the worksheet. 
' If the cell already exists, return it. 
Private Function InsertCellInWorksheet(ByVal columnName As String, ByVal rowIndex As     UInteger, ByVal worksheetPart As WorksheetPart) As Cell
    Dim worksheet As Worksheet = worksheetPart.Worksheet
    Dim sheetData As SheetData = worksheet.GetFirstChild(Of SheetData)()
    Dim cellReference As String = (columnName + rowIndex.ToString())

    ' If the worksheet does not contain a row with the specified row index, insert one.
    Dim row As Row
    If (sheetData.Elements(Of Row).Where(Function(r) r.RowIndex.Value = rowIndex).Count() <> 0) Then
        row = sheetData.Elements(Of Row).Where(Function(r) r.RowIndex.Value = rowIndex).First()
    Else
        row = New Row()
        row.RowIndex = rowIndex
        sheetData.Append(row)
    End If

    ' If there is not a cell with the specified column name, insert one.  
    If (row.Elements(Of Cell).Where(Function(c) c.CellReference.Value = columnName + rowIndex.ToString()).Count() > 0) Then
        Return row.Elements(Of Cell).Where(Function(c) c.CellReference.Value = cellReference).First()
    Else
        ' Cells must be in sequential order according to CellReference. Determine where to insert the new cell.
        Dim refCell As Cell = Nothing
        For Each cell As Cell In row.Elements(Of Cell)()
            If (String.Compare(cell.CellReference.Value, cellReference, True) > 0) Then
                refCell = cell
                Exit For
            End If
        Next

        Dim newCell As Cell = New Cell
        newCell.CellReference = cellReference
        newCell.CellFormula = New CellFormula("SUM(A1:A2)")

        row.InsertBefore(newCell, refCell)
        worksheet.Save()

        Return newCell
    End If
    End Function

Обратите внимание, что этот метод предполагает, что каждая ячейка, на которую вы ссылаетесь в формуле, имеет правильно помеченную ссылку.

...