简体   繁体   中英

Create Excel table with headers

I wrote a code using OpenXML to convert datatable to Excel. Now I want to format table so that it looks like Excel table with header. I assume I need to add header styles and to set table range but I still wasn't able to achieve that. Here is my code for converting from datatable to Excel:

Dim oData As New ReportData(_ReportObject.ConnectionString)
Dim source As DataTable = oData.GetDataTable(_ReportObject.DataSource, _ReportObject.Parameters)
Dim cellData As Object

Dim draftFile As String = _ReportObject.Tmp & "\" & Guid.NewGuid().ToString() & ".tmp"
Using xl As SpreadsheetDocument = SpreadsheetDocument.Create(draftFile, SpreadsheetDocumentType.Workbook)
  Dim oxa As List(Of OpenXmlAttribute)
  Dim oxw As OpenXmlWriter

  xl.AddWorkbookPart()
  Dim wsp As WorksheetPart = xl.WorkbookPart.AddNewPart(Of WorksheetPart)()

  oxw = OpenXmlWriter.Create(wsp)
  oxw.WriteStartElement(New Worksheet())
  oxw.WriteStartElement(New SheetData())

  ' add header
  oxa = New List(Of OpenXmlAttribute)()
  oxa.Add(New OpenXmlAttribute("r", Nothing, "1"))
  oxw.WriteStartElement(New Row(), oxa)
  For Each header As DataColumn In source.Columns
    oxa = New List(Of OpenXmlAttribute)()
    oxa.Add(New OpenXmlAttribute("t", Nothing, "str"))
    oxw.WriteStartElement(New Cell(), oxa)
    oxw.WriteElement(New CellValue(header.Caption))
    oxw.WriteEndElement()
  Next
  oxw.WriteEndElement()

  For i As Integer = 0 To source.Rows.Count - 1
    Dim rowData As DataRow = source.Rows(i)
    oxa = New List(Of OpenXmlAttribute)()
    ' this is the row index
    oxa.Add(New OpenXmlAttribute("r", Nothing, (i + 2).ToString()))

    oxw.WriteStartElement(New Row(), oxa)

    For j As Integer = 0 To source.Columns.Count - 1
      oxa = New List(Of OpenXmlAttribute)()
      oxa.Add(New OpenXmlAttribute("t", Nothing, "str"))

      oxw.WriteStartElement(New Cell(), oxa)

      cellData = rowData(j)
      If IsDBNull(cellData) Then cellData = String.Empty
      oxw.WriteElement(New CellValue(cellData))

      ' this is for Cell
      oxw.WriteEndElement()
    Next

    ' this is for Row
    oxw.WriteEndElement()
  Next

  ' this is for SheetData
  oxw.WriteEndElement()
  ' this is for Worksheet
  oxw.WriteEndElement()
  oxw.Close()

  oxw = OpenXmlWriter.Create(xl.WorkbookPart)
  oxw.WriteStartElement(New Workbook())
  oxw.WriteStartElement(New Sheets())

  Dim sheet As New Sheet()
  sheet.Name = "Sheet1"
  sheet.SheetId = 1
  sheet.Id = xl.WorkbookPart.GetIdOfPart(wsp)
  oxw.WriteElement(sheet)

  ' this is for Sheets
  oxw.WriteEndElement()
  ' this is for Workbook
  oxw.WriteEndElement()
  oxw.Close()

  xl.Close()
End Using

You can type it manually in code like this:

Sheet.Cells(1, 1).value = "Header for cell A1"
Sheet.Cells(1, 2).value = "Header for cell B1"
Sheet.Cells(1, 3).value = "Header for cell C1"

CMIIW :)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM