Как с помощью Open XML вставить формулу в лист Excel 2010?

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


person vbasic321    schedule 10.06.2011    source источник


Ответы (3)


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

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

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

person JonoW    schedule 17.06.2011
comment
Как тут обойтись без открытия excel. - person AjayR; 08.10.2013

Это взято из справочного документа, прилагаемого к файлу справки 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

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

person Joe Masilotti    schedule 24.07.2012
comment
Я получаю ошибки сборки для этого кода. CellValues. [Formula] и newCell.Formula не содержат методы / свойства Formula. Вы используете OpenXML2.0? - person Eric Schneider; 25.07.2012
comment
Я использую версию: 2.0.5022.0 - person Eric Schneider; 25.07.2012
comment
@eschneider Обновленные DataType и Formula, попробуйте сейчас. - person Joe Masilotti; 25.07.2012
comment
@eschneider По сути, все сводилось к следующему: newCell.CellFormula = New CellFormula("SUM(A1:A2)") - person Joe Masilotti; 25.07.2012
comment
@eschneider Я добавил свой телефонный код из Main(). Убедитесь, что у вас есть действующий документ Excel в C:\Book1.xlsx с одним листом. - person Joe Masilotti; 25.07.2012

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

spreadSheet.WorkbookPart.Workbook.CalculationProperties.ForceFullCalculation = True spreadSheet.WorkbookPart.Workbook.CalculationProperties.FullCalculationOnLoad = True
person leyla azari    schedule 07.09.2013
comment
Я пишу всю свою формулу в ячейках Excel, затем использую этот код и работаю. - person leyla azari; 25.11.2013