美文网首页
VB使用NPOI根据模板导出Excel分享-1

VB使用NPOI根据模板导出Excel分享-1

作者: 天然豆浆机 | 来源:发表于2019-10-29 14:05 被阅读0次

    本文是VB语法,相信写C#的同学一样能看懂能试用
    因微软自带操作Excel 受环境因素影响较大,所以把项目部分导出切换成NOPI导出

    版本区分

    这里说的版本是扩展名的区分,只此两种:xls、xlsx

    • xls版的主要命名空间

    MPOI.HSSF

    • xlsx 版的主要命名空间

    NPOI.XSSF

    遇到问题可以从使用的命名空间或者类上面看看是否用的对

    实例代码

    用在实际项目中验证过,导出效率还是不错的

    • 准备模板文件
     '准备模板
                Dim templateFileName As String = Application.StartupPath + "\xls\季度财报.xlsx" '模板文件
                Dim exportFileName As String = Application.StartupPath + "\Excel\季度财报.xlsx" '目的文件
                '文件COPY
                If System.IO.File.Exists(exportFileName) Then
                    System.IO.File.Copy(templateFileName, exportFileName, True)
                Else
                    System.IO.File.Copy(templateFileName, exportFileName)
                End If
                System.IO.File.SetAttributes(exportFileName, IO.FileAttributes.Normal) '目的文件属性修改
    
                Dim fs As FileStream = New FileStream(templateFileName, FileMode.Open, FileAccess.Read) '打开一个现有的Excel
    

    最后一行是打开这个excel为后面写数据做准备

    • 创建工作薄
    Dim workbook As XSSFWorkbook = New XSSFWorkbook(fs)
     Dim sheet As XSSFSheet = workbook.GetSheet("Sheet1")
    
    • 生成模板行
      正常模板只提供几行的模板行,实际数据可能远远超过这个行数,这就需要插入相同样式的行,保持模板表格的一致性
      1.生成模板行需要考虑表头占的行数
      2.NPOI的行索引是从0开始的
     '生成模板行
    ' ds 是要导出的数据集
                If ds.Tables(0).Rows.Count > 0 Then
                    For i As Integer = 0 To ds.Tables(0).Rows.Count - 1
    'NPOI的移动行,移动行就等于插入了一个新行,一次移动一行,相当于插入一行无样式空白行,0和1 已经被表头占用
    sheet.ShiftRows(2, sheet.LastRowNum, 1, True, False)
    '因为在2除移动行,默认向下移动,所以2处是新行,获取此行准备设置样式
     Dim rowInsert As IRow = sheet.CreateRow(2)
    '获取有模板样式的行
    '这里可以用sheet.GetRow(3) ,就算插入很多行,在下面也设置过样式的,理论上是可用的
    'sheet.GetRow(3 + i) 是原妈模板中的行
                        Dim rowSource As IRow = sheet.GetRow(3 + i)
    '设置新行的行样式
                        rowInsert.RowStyle = rowSource.RowStyle
    '设置新行的行高
                        rowInsert.Height = rowSource.Height
    '设置新行的所有单元格样式
                        For col As Integer = 0 To rowSource.LastCellNum
    '获取有样式行 相同y轴的单元格
                            Dim cellsource As ICell = rowSource.GetCell(col)
    '如果此单元格无效,则跳过此单元格的样式设置
                            If cellsource Is Nothing Then
                                Continue For
                            End If
    '新行创建 相同y轴的单元格
                            Dim cellInsert As ICell = rowInsert.CreateCell(col)
    '设置新行相同y轴单元格的样式
                            cellInsert.CellStyle = cellsource.CellStyle
    
                        Next
    
                    Next
    
                End If
    
    • 填充数据
      '循环数据
      For m As Integer = 0 To ds.Tables(0).Rows.Count - 1
      row = sheet.GetRow(2+ m)'获取行 0 1 被 表头占用

    '以下是设置对应单元格的值
    row.GetCell(0).SetCellValue(ds.Tables(0).Rows(m).Item("PART_NAME").ToString())
    row.GetCell(1).SetCellValue(ds.Tables(0).Rows(m).Item("TYPE_NAME").ToString())
    row.GetCell(2).SetCellValue(ds.Tables(0).Rows(m).Item("UNIT_NAME").ToString())
    row.GetCell(3).SetCellValue(ds.Tables(0).Rows(m).Item("MONTH_QTY").ToString())
    row.GetCell(4).SetCellValue(ds.Tables(0).Rows(m).Item("PRICE_AVG").ToString())
    row.GetCell(5).SetCellValue(ds.Tables(0).Rows(m).Item("AMOUNT_SUM").ToString())
    row.GetCell(6).SetCellValue(ds.Tables(0).Rows(m).Item("IN_QTY").ToString())
    row.GetCell(7).SetCellValue(ds.Tables(0).Rows(m).Item("IN_PRICE_AVG").ToString())
    row.GetCell(8).SetCellValue(ds.Tables(0).Rows(m).Item("IN_AMOUNT_SUM").ToString())
    row.GetCell(9).SetCellValue(ds.Tables(0).Rows(m).Item("OUT_QTY").ToString())
    row.GetCell(10).SetCellValue(ds.Tables(0).Rows(m).Item("OUT_PRICE_AVG").ToString())
    row.GetCell(11).SetCellValue(ds.Tables(0).Rows(m).Item("OUT_AMOUNT_SUM").ToString())
    row.GetCell(12).SetCellValue(ds.Tables(0).Rows(m).Item("LAST_QTY").ToString())
    row.GetCell(13).SetCellValue(ds.Tables(0).Rows(m).Item("LAST_PRICE_AVG").ToString())
    row.GetCell(14).SetCellValue(ds.Tables(0).Rows(m).Item("LAST_AMOUNT_SUM").ToString())

            Next
    
    • 写入到文件
      Dim fs1 = New FileStream(exportFileName, FileMode.Create) '另存一个Excel档
      workbook.Write(fs1) '把book存到文件中

    • 释放对象
      fs.Close() '释放对象
      fs1.Close() '释放对象
      sheet = Nothing '释放对象
      workbook = Nothing '释放对象

    完结

    做一个完整的模板导出业务后,对NPOI的基本了解足够应对日常工作了

    相关文章

      网友评论

          本文标题:VB使用NPOI根据模板导出Excel分享-1

          本文链接:https://www.haomeiwen.com/subject/iobwvctx.html