注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

樱之花

叶散的时候,你明白欢聚;花谢的时候,你明白青春.

 
 
 

日志

 
 
关于我

分类中“我的实验室”是我在日常工作中的一些知识总结,有些写的比较匆忙,可能大家在阅读时会产生困扰,后期有时间我会重新整理编辑,谢谢大家的到访,您们的支持是我前进的动力!

网易考拉推荐

028 数据表的数据自动生成到EXCEL文件  

2014-06-05 15:09:26|  分类: 我的实验室 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

起因:

最近用户总是需要我们协助抽取系统中的数据,由于数据跨期较大,我们只能通过数据库后台导出EXCEL,再整理成需要的格式发送给用户,比如修改列标题,因为数据库里是英文的,需要改成中文描述。项目中功能模块较多,数据种类同样庞大,用户隔三岔五地麻烦我们,很多数据都是几十W行的,在后台等待数据的响应占用了我们很长时间,对此,我想到是否做一个自动生成EXCEL的工具,通过输入SQL脚本,定时运行,用户需要什么样的数据,直接把已经生成好的文件发送给他们。如果做的再完善点,做一个下载页面,让用户自己去下载,下载前发一个验证码给他们,这样防止没有权限的人访问。

方法:

在开发这样的工具过程中,我是把数据填充到datatable里导出到EXCEL的,碰到的麻烦是如果把数据导出到EXCEL里,首先写了一个通过遍历datatable的行和列,循环写入到EXCEL,不过这样碰到一个问题,比如文字格式的数据在EXCEL中显示会自动把前置0替换掉。例如,我有一个编号是'0001',生成XLS文件后,打开发现只看到'1',0被替换了。

改进:

想到可以通过EXCEL组件来生成XLS文件,不过我不想这样做,因为它要求使用的电脑必须安装EXCEL软件。是否还有其他方法。于是,在网上找到了NPOI的开源项目,使用了它的控件,可以实现我想要的功能,前置0能够显示啦。

部分代码:

Imports System.IO
Imports NPOI.HSSF.UserModel
Imports NPOI.HPSF
Imports NPOI.POIFS.FileSystem
Imports NPOI.SS.UserModel
Public Class NPOIExcel

    '最大数据条数
    Private EXCEL03_MaxRow As Integer = 65535

 

    Public Function DataTable2Excel_tofile(ByVal dt As DataTable, ByVal sheetName As String, ByVal filename As String) As Boolean
        Dim book As IWorkbook = New HSSFWorkbook
        If dt.Rows.Count < EXCEL03_MaxRow Then
            DataWrite2Sheet(dt, 0, dt.Rows.Count - 1, book, sheetName)
        Else
            Dim page As Integer = dt.Rows.Count / EXCEL03_MaxRow
            For i As Integer = 0 To page - 1
                Dim start As Integer = i * EXCEL03_MaxRow
                Dim send As Integer = (i * EXCEL03_MaxRow) + EXCEL03_MaxRow - 1
                DataWrite2Sheet(dt, start, send, book, sheetName + i.ToString)
            Next

            '最后一页剩余的
            Dim lastPageItemCount As Integer = dt.Rows.Count Mod EXCEL03_MaxRow
            DataWrite2Sheet(dt, dt.Rows.Count - lastPageItemCount, dt.Rows.Count - 1, book, sheetName + page.ToString)
        End If

        If Not File.Exists(filename) Then
            Dim outFs As FileStream = New FileStream(filename, FileMode.CreateNew)
            book.Write(outFs)
            outFs.Close()
        End If

        Return True
    End Function


    Private Sub DataWrite2Sheet(ByVal dt As DataTable, ByVal startRow As Integer, ByVal endRow As Integer, ByVal book As IWorkbook, ByVal sheetName As String)
        Dim sheet As ISheet = book.CreateSheet(sheetName)
        Dim header As IRow = sheet.CreateRow(0)

        '标题行
        For i As Integer = 0 To dt.Columns.Count - 1
            Dim cell As ICell = header.CreateCell(i)
            Dim val As String = dt.Columns(i).Caption()
            cell.SetCellValue(val)
        Next

        Dim rowIndex As Integer = 1

        For i As Integer = startRow To endRow
            Dim dtRow As DataRow = dt.Rows(i)

            Dim excelRow As IRow = sheet.CreateRow(rowIndex)
            For j As Integer = 0 To dtRow.ItemArray.Length - 1
                excelRow.CreateCell(j).SetCellValue(dtRow(j).ToString)
            Next
            rowIndex = rowIndex + 1
        Next
    End Sub
End Class

 调用:
Dim npoixls As NPOIExcel = New NPOIExcel
npoixls.DataTable2Excel_tofile(datatable_test, "sheet", "test.xls")
  评论这张
 
阅读(547)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017