Я использую Visual Studio 2010 (VB.Net) и Open XML SDK 2.0. Как вставить формулу на лист Excel 2010? Когда я делаю это, я также хочу установить для свойства CellValue ячейки значение DBNull или EmptyString, чтобы заставить Excel пересчитывать ячейку, когда пользователь открывает рабочую панель.
Как с помощью Open XML вставить формулу в лист Excel 2010?
Ответы (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
Как тут обойтись без открытия 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
Я получаю ошибки сборки для этого кода. CellValues. [Formula] и newCell.Formula не содержат методы / свойства Formula. Вы используете OpenXML2.0?
- person Eric Schneider; 25.07.2012
Я использую версию: 2.0.5022.0
- person Eric Schneider; 25.07.2012
@eschneider Обновленные DataType и Formula, попробуйте сейчас.
- person Joe Masilotti; 25.07.2012
@eschneider По сути, все сводилось к следующему:
newCell.CellFormula = New CellFormula("SUM(A1:A2)")
- person Joe Masilotti; 25.07.2012
@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
Я пишу всю свою формулу в ячейках Excel, затем использую этот код и работаю.
- person leyla azari; 25.11.2013