使用NPOI做EXCEL檔的資料套表

使用NPOI做EXCEL檔的資料套表

前言

之前我們的套表是將EXCEL存成HTML格式,然後加上一些要置換的字,如#FLD_LOCATION#,然後去REPLACE它! 然後再將該檔案存成.XLS給Client端。可是當我的範本是要多個Sheet時,有些Client端的電腦會無法下載這些Sheet!

image

研究

因為目前我要套表的資料只有一筆,而且是有多個Sheet要套,所以就參考在 Server 端存取 Excel 檔案的利器:NPOI Library,使用NPOI然後將每個Sheet中的Cell換成該筆資料即可!

If File.Exists(strFileName) Then
  '開啟Excel 
  Dim fsExcel As New FileStream(strFileName, FileMode.Open, FileAccess.Read)
  Dim workbook As New HSSFWorkbook(fsExcel)
  Dim drData As DataRow = GetDataTable.Rows(0)
  For i As Integer = 0 To workbook.NumberOfSheets - 1
    '預設取10個sheet來處理
    Dim sheet As HSSFSheet
    sheet = workbook.GetSheetAt(i)
    '取得sheet,進行套表
    MergeSheetData(sheet, drData)
  Next
  Dim fsExcelNew As New FileStream("C:\NewExcel.xls", FileMode.Create)

  workbook.Write(fsExcelNew)
  workbook = Nothing
  fsExcelNew.Close()
  fsExcel.Close()
  MsgBox("執行完成!")
End If
''' 將一筆資料合併到Excel的Sheet中
''' </summary>
''' <param name="sheet"></param>
''' <param name="drData"></param>
''' <remarks></remarks>
Private Sub MergeSheetData(ByRef sheet As HSSFSheet, ByVal drData As DataRow)
  For i As Integer = sheet.FirstRowNum To sheet.LastRowNum
    Dim row As HSSFRow = sheet.GetRow(i)
    If IsNothing(row) = False Then
      For j As Integer = row.FirstCellNum To row.LastCellNum
        '依dataRow來Find並Replace #FLD_ COLUMN_NAME #
        For Each dcColumn As DataColumn In drData.Table.Columns
          Dim strSearchName As String = String.Format("#FLD_{0}#", dcColumn.ColumnName)
          If IsNothing(row.GetCell(j)) = False Then
            If row.GetCell(j).ToString.Contains(strSearchName) Then
              row.GetCell(j).SetCellValue(row.GetCell(j).ToString.Replace(strSearchName, drData(dcColumn.ColumnName)))
              Exit For
            End If
          End If
        Next
      Next
    End If
  Next
End Sub
NPOI 

結論

目前小弟沒有發現它有像Excel物件,可以直接使用Replace,所以就只好一個Cell一個Cell去比較及置換! 不過,起碼出來的是單個xls檔了!

大家如果有更好的方式,可以提供小弟哦! 謝謝!

測試範例

NPOITest.rar

Hi, 

亂馬客Blog已移到了 「亂馬客​ : Re:從零開始的軟體開發生活

請大家繼續支持 ^_^