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

本文是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的基本了解足够应对日常工作了

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,265评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,078评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,852评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,408评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,445评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,772评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,921评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,688评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,130评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,467评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,617评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,276评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,882评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,740评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,967评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,315评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,486评论 2 348

推荐阅读更多精彩内容

  • 转自链接 3.项目实践 3.1基于.xls模板生成Excel文件 3.2生成九九乘法表 3.3生成一张工资单 3....
    腿毛裤阅读 3,435评论 0 0
  • Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Ja...
    玩味Orz阅读 2,608评论 0 0
  • 一、SQL速成 结构查询语言(SQL)是用于查询关系数据库的标准语言,它包括若干关键字和一致的语法,便于数据库元件...
    shadow雨轩阅读 509评论 0 3
  • 转自链接 目录 1.认识NPOI 2.使用NPOI生成xls文件 2.1创建基本内容 2.1.1创建Workboo...
    腿毛裤阅读 10,481评论 1 3
  • 这句话出自唐代著名诗人、“诗史”杜甫的《望岳》,原文是:“岱宗夫如何?齐鲁青未了。造化钟神秀,阴阳割昏晓。荡胸生层...
    山色归读阅读 5,594评论 47 252