最近看到很多人分享NPOI的用法.

但是很多都不是完整示例或者並沒有實戰效果.

剛好最近有個VB.NET的項目有升級原有的oledb select sheet$的做法.

很明顯,NPOI有更好的穩定性和兼容性.

2進制的處理方式排除了server和client端有沒有office excel的諸多影響和限制.如office版本,系統編碼問題.以及server端是否需要安裝office excel.

2.0版本之後更是支持.xlsx格式等等..

那直接上代碼:

要先引用HSSF和XSSF(for .xlsx support).

下載Excel.沒有寫下載成xlsx的格式了.沒必要.如果一定要download成xlsx.使用對應的XSSF命名空間下的XSSFWorkbook等即可

Imports NPOI.HSSF.UserModel
Imports NPOI.XSSF.UserModel Public Shared Function DownLoadToExcel(ByVal dt As DataTable)
Dim book As HSSFWorkbook = New HSSFWorkbook()
Dim sheet As HSSFSheet = book.CreateSheet("Your_Sheet_Name")
Dim row As HSSFRow = sheet.CreateRow()
For i = To dt.Columns.Count -
row.CreateCell(i).SetCellValue(dt.Columns(i).ColumnName)
Next
For i = To dt.Rows.Count -
Dim row2 As HSSFRow = sheet.CreateRow(i + )
For j = To dt.Columns.Count -
row2.CreateCell(j).SetCellValue(dt.Rows(i)(j).ToString)
Next
Next
Dim ms As System.IO.MemoryStream = New System.IO.MemoryStream()
book.Write(ms)
HttpContext.Current.Response.AddHeader("Content-Disposition", String.Format("attachment;filename={0}.xls", Now.ToString))
HttpContext.Current.Response.BinaryWrite(ms.ToArray())
book = Nothing
ms.Close()
ms.Dispose()
End Function

上傳EXCEL.

通常我們實際做項目的時候,需要通過導入excel再進行處理而不是單純的重複insert DB.

那我們直接獲取datatable.

支持xls和.xlsx格式上傳. 這裏的lofile 就是HtmlInputFile控件.調用方法的時候直接將這個對象傳過來即可.

我這裏是web項目.如果是winform.lofile完全不用save之後再處理.直接傳path過來就可以.同樣請將對應的HttpContext改成Context.

Public Shared Function GetTabelFromExcel(ByVal lofile As HtmlInputFile) As DataTable

        Dim filepath As String = Path.Combine(HttpContext.Current.Server.MapPath("bin"), Path.GetFileName(lofile.PostedFile.FileName))
Dim fileExt As String = Path.GetExtension(lofile.PostedFile.FileName)
Try
lofile.PostedFile.SaveAs(filepath)
Dim tempname As String = Guid.NewGuid().ToString
Dim tempfilepath As String = Path.Combine(HttpContext.Current.Server.MapPath("bin"), tempname & fileExt)
File.Move(filepath, tempfilepath)
File.Delete(filepath)
filepath = tempfilepath
If fileExt = ".xlsx" Then '.xlsx 2007
Try
Dim wb As XSSFWorkbook
Dim file As System.IO.FileStream = New System.IO.FileStream(filepath, System.IO.FileMode.Open, System.IO.FileAccess.Read)
Using file
wb = New XSSFWorkbook(file)
End Using
Dim sheet As XSSFSheet = CType(wb.GetSheetAt(0), XSSFSheet)
Dim rows As System.Collections.IEnumerator = sheet.GetRowEnumerator()
Dim dt As DataTable = New DataTable()
For i As Integer = 0 To CInt(sheet.GetRow(0).LastCellNum) - 1
dt.Columns.Add(System.Convert.ToChar(65 + i).ToString())
Next
While rows.MoveNext()
Dim row As XSSFRow = CType(rows.Current, XSSFRow)
Dim dr As DataRow = dt.NewRow()
For j As Integer = 0 To CInt(row.LastCellNum) - 1
Dim cell As XSSFCell = CType(row.GetCell(j), XSSFCell)
If cell Is Nothing Then
dr(j) = Nothing
Else
dr(j) = cell.ToString()
End If
Next
dt.Rows.Add(dr)
End While
dt.Rows.RemoveAt(0)
Return dt
Catch e As System.Exception
Throw New Exception("文件第一行不允許有空白欄位或文件正在使用,請先關閉正在打開的文件!" & e.Message)
End Try
ElseIf fileExt = ".xls" Then 'office 2003
Try
Dim wb As HSSFWorkbook
Dim file As System.IO.FileStream = New System.IO.FileStream(filepath, System.IO.FileMode.Open, System.IO.FileAccess.Read)
Using file
wb = New HSSFWorkbook(file)
End Using Dim sheet As HSSFSheet = CType(wb.GetSheetAt(0), HSSFSheet)
Dim rows As System.Collections.IEnumerator = sheet.GetRowEnumerator()
Dim dt As DataTable = New DataTable()
For i As Integer = 0 To CInt(sheet.GetRow(0).LastCellNum) - 1
dt.Columns.Add(System.Convert.ToChar(65 + i).ToString())
Next
While rows.MoveNext()
Dim row As HSSFRow = CType(rows.Current, HSSFRow)
Dim dr As DataRow = dt.NewRow()
For j As Integer = 0 To CInt(row.LastCellNum) - 1
Dim cell As HSSFCell = CType(row.GetCell(j), HSSFCell)
If cell Is Nothing Then
dr(j) = Nothing
Else
dr(j) = cell.ToString()
End If
Next
dt.Rows.Add(dr)
End While
dt.Rows.RemoveAt(0)
Return dt Catch e As System.Exception
Throw New Exception("文件第一行不允許有空白欄位或文件正在使用,請先關閉正在打開的文件!" & e.Message)
End Try
Else
Throw New Exception("請選擇office excel文件!")
End If Catch ex As Exception
Throw New Exception("請選擇office excel文件!" & ex.Message)
Finally
File.Delete(filepath)
End Try End Function

得到datatable之後請自行處理.  

關於NPOI的一點補充和示例的更多相关文章

  1. [Xamarin] 關於發出Notification 的大小事 (转帖)

    關於Anroid 的使用者來說,Notification 是一個非常會看到且用到的功能 他可以提醒使用者甚麼東西需要待處理,像是郵件或是會議的提醒等.. 甚至有些APP ,直接使用Notificati ...

  2. 在laravel下關於blade模板的嘗試

    Blade模板 關於模板繼承和分區段 @section和@yield的實驗 ①關於@section...@show嘗試 測試1 {{--appV2test.blade.php--}} <html ...

  3. 開博客了, 因為搞Delphi 開發的關於Delphi學習

    開博客了, 因為搞Delphi 開發的關於Delphi學習,之前都是用本地TXT文件保存,發現在本地電腦保存非常不方面,而且只能在一台電腦上保存,不容易查看和修改內容.便於以後的記錄只用,以及經驗交流 ...

  4. 關於Validform 控件 值得注意的地方

    Validform控件其實用起來挺方便的,直接百度就能找到官網,有直接的demo做參考.這些我就不提了,我所要說的是關於Validform控件的ajax的提交. Validform中有個參數ajaxP ...

  5. JDK1.6历史版本的下载(關於TLSv1.2)Oracle的官方文檔

    [资源描述]:对于部分老项目 仍然采用的是JDK1.6 版本 但是打开官方 JDK 都是最新的 版本 想找 历史版本 不容易找到 [资源详情]:提供下载链接: http://www.oracle.co ...

  6. 關於imagick不得不說的一些事

    PHP建圖通常都用GD庫,因為是內置的不需要在服務器上額外安裝插件,所以用起來比較省心,但是如果你的程序主要的功能就是處理圖像,那麼就不建議用GD了,因為GD不但低效能而且能力也比較弱,佔用的系統資源 ...

  7. 關於 WebClient wc = new WebClient() 下載第三方數據不能進安安信任異常

    報錯異常:The underlying connection was closed: Could not establish trust relationship for SSL/TLS secure ...

  8. Python 基礎 - 淺copy補充說明

    在 import copy 這個模塊裡 基於第一個列表來做淺copy,實際上第二個列表裡的元素,是第一個列表的 引用. 接下來介紹 淺copy有三種方式可以使用 #!/usr/bin/env pyth ...

  9. [Xamarin] 關於Internal Storage ,存取App內部使用資料 (转帖)

    最近在開發App,會使用到必須要處理一些App所使用的資料,上網路查一下Android 得作法,包含我自己也實作了一下,可能是因為對Java || Android 不是很孰悉,常常錯在 java.la ...

随机推荐

  1. NeatUpload 同时选择并上传多个文件

    neatUpload是asp.net 中可以同时上传多个文件的控件,主页:http://neatupload.codeplex.com/. 效果如下图(显示有点不正常...): 使用步骤: 1. 在a ...

  2. 【转】解析Java finally

    下文写的关于Java中的finally语句块什么时候执行的问题.什么时候执行呢?和return.continue.break.exit都有关系,尤其return语句非常有意思,于是分享给大家.谢谢Sm ...

  3. UML: CIM & PIM

    CIM-1:定义业务流程 定义及分析业务流程(Business Process)是为了尽快理清系统范围,以便估算开发成本及时间,可不是为了要改造业务流程.系统分析员千万别误解了此步骤的目的.所以,系统 ...

  4. [设计模式] 16 迭代器模式 Iterator Pattern

    在GOF的<设计模式:可复用面向对象软件的基础>一书中对迭代器模式是这样说的:提供一种方法顺序访问一个聚合对象中各个元素,而又不需要暴露该对象的内部表示. 类图和实例: 迭代器模式由以下角 ...

  5. 精通ASP.Net MVC 3 框架(第三版)学习笔记

    精通ASP.Net MVC 3 框架(第三版)学习笔记 代码才是王道. http://pan.baidu.com/s/1pJyL1cn

  6. prefix springmvc

    设置了@RequestMapping("/jsp/info.do"),也可以写成"jsp/info.act"不影响 retuen "index&quo ...

  7. C# 知识笔记

    HttpContext.Request.Form.ToString() 获取Form表单中的内容 /// <summary> /// 获取 GET 提交方式值 /// </summa ...

  8. URAL 1073 Square Country(DP)

    题目链接 题意 :这个人要投资地,每块地都是正方形并且边长都是整数,他希望他要买的地尽量的少碎块.每买一块地要付的钱是边长的平方,而且会得到一个一份证书,给你一个钱数,让你求出能得到的证书个数. 思路 ...

  9. TDD三个阶段

    TDD的三个阶段 红灯.绿灯.重构 :明确了实施TDD所要遵循的工作流 (需求--->测试-->代码[重构]) 红灯阶段:      为不存在的代码编写测试 绿灯阶段:      仅编写适 ...

  10. 用Delphi创建服务程序

    用Delphi创建服务程序 日期:2005年11月29日 作者:sunmohe 人气: 3154 查看:[大字体 中字体 小字体] Windows 2000/XP和2003等支持一种叫做"服 ...