3

尝试使用 openXML 2.0 库创建日期单元格。在某些情况下会显示日期,但 excel 在打开文件时会出错。如果我删除日期单元格,它会毫无错误地打开。有谁知道怎么了?

Protected Function CreateCell(columnIndex As Integer, rowIndex As Integer, value As DateTime) As Cell

    Dim cell As New Cell()
    cell.DataType = CellValues.Date
    Dim v As CellValue = New CellValue()
    v.Text = value.ToString()
    cell.CellValue = v
    Return cell

End Function

Protected Function CreateCell(columnIndex As Integer, rowIndex As Integer, value As Double) As Cell
    Dim cell As New Cell()

    cell.DataType = CellValues.Number
    'cell.CellReference = getColumnName(columnIndex) & rowIndex
    cell.CellValue = New CellValue()
    cell.CellValue.Text = value.ToString()
    Return cell
End Function
4

2 回答 2

2

如果您从本文下载代码并查看 ExcelInterface.vb,您将看到一些基于 (ECMA-376 Part 1, 18.8.30) 检测隐式单元格格式的代码。您也应该能够适应它来设置它们。另请参阅将 Excel 日期和时间与 .NET 相互转换的例程,因为您需要将 Excel(电子表格)日期值放入日期格式的单元格中。

于 2012-09-11T15:25:39.497 回答
0

请注意,CellValues.Date枚举成员仅在 Microsoft Office 2010 及更高版本中可用(有关详细信息,请参阅MSDN库)。

因此,如果您使用 Microsoft Office 2007 打开包含类型单元格的 Excel 电子表格,CellValues.Date您将收到错误消息。

此外,类型单元格的值CellValues.Date必须采用 ISO 8601 格式(请参阅 Office Open XML 第 1 部分规范,第 18.17.4.1 节)。

总结 ISO 8601 格式:

  • ISO 8601 中的日期以下列格式表示:YYYY-MM-DD.
  • 时间以下列格式存储:hh:mm:ss.
  • 日期和时间使用大写字母 T: 分隔YYYY-MM-DDThh:mm:ss

有关 ISO 8601 格式的更多信息 ( WIKIPEDIA ),请参阅以下文章。

以下代码示例显示了类型单元格的创建CellValues.Date

Protected Shared Function CreateCell(columnIndex As Integer, rowIndex As Integer, value As DateTime, styleIndex As Integer) As Cell

  Dim cell As Cell = New Cell()

  cell.DataType = CellValues.Date

  Dim v As CellValue = New CellValue()

  v.Text = value.ToString("yyyy-MM-ddThh:mm:ss") ' Use ISO 8601 format for date value
  cell.CellReference = "" ' Set cell reference here! E.g. A1
  cell.CellValue = v
  cell.StyleIndex = styleIndex

  Return cell

End Function    

Protected Function CreateNumberingFormatForDateCells() As NumberingFormat

  Dim numberingFormat As NumberingFormat = New NumberingFormat()

  numberingFormat.NumberFormatId = CType(165U, UInt32Value)
  numberingFormat.FormatCode = "dd-mm-yyyy"

  return numberingFormat

End Function

Protected Function CreateCellFormatForDateCells() As CellFormat

  Dim cellFormat As CellFormat = New CellFormat()

  cellFormat.NumberFormatId = CType(165U, UInt32Value) 
  cellFormat.ApplyNumberFormat = true

  return cellFormat

End Function

Sub Main()

  ' ... Code to get/create your workbook
  Dim workbookPart As WorkbookPart ...

  ' Add number format and cell style for date cells.
  Dim nf As NumberingFormats = New NumberingFormats()

  workbookPart.WorkbookStylesPart.Stylesheet.NumberingFormats = nf
  workbookPart.WorkbookStylesPart.Stylesheet.NumberingFormats.Append(CreateNumberingFormatForDateCells());
  workbookPart.WorkbookStylesPart.Stylesheet.CellFormats.Append(CreateCellFormatForDateCells());

  ' Call CreateCell() to create date cells
  Dim c As Cell = CreateCell(0,0,DateTime.Now, workbookPart.WorkbookStylesPart.Stylesheet.CellFormats.Count())

  ' Code to append cell to spreadsheet

End Sub

请注意,通过将单元格类型设置为CellValues.Date我们仅指定日期值以 ISO 8601 格式存储。我们仍然需要为日期指定一个显示单元格样式。在上面的示例中,我创建了一个单元格样式(并设置了单元格样式索引),以便告诉 excel 如何显示日期值。

于 2012-07-02T18:15:11.047 回答