最近看到很多人分享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. Ubuntu 12.4 下升级 Subversion 1.7

    Ubuntu 12.04 默认使用的是Subversion 1.6,而Ubutnu12.10开始,就使用的是Subversion 1.7. 如果从别人的地方拷过来的SVN目录,在使用SVN命令时会报以 ...

  2. <a href='?out=login'>是什么意思

    <a href='?out=login'>退出</a>前面加上问号?就是GET方式传递out=login是要传递的数据点这个链接就可以执行 接下来通过$_GET["o ...

  3. 3036: 绿豆蛙的归宿 - BZOJ

    Description 随着新版百度空间的下线,Blog宠物绿豆蛙完成了它的使命,去寻找它新的归宿. 给出一个有向无环的连通图,起点为1终点为N,每条边都有一个长度.绿豆蛙从起点出发,走向终点.到达每 ...

  4. Codeforces Round #327 (Div. 2) E. Three States

    题目链接: 题目 E. Three States time limit per test:5 seconds memory limit per test:512 megabytes 问题描述 The ...

  5. Vim 配置 winmanager

    问题描述: winmanager是vim中插件,可以方便的查看当前文件夹中文件,可以切换vim打开文件,非常方便 现在说明安装和使用winmanager 问题解决: (1)winmanager源文件 ...

  6. 【POJ】【3164】Commond Network

    最小树形图 最小树形图模板题,朱-刘算法. 题解:http://blog.csdn.net/shuangde800/article/details/8039359 这位大神代码写的非常通俗易懂,而且这 ...

  7. 【技术贴】解决MySql连接不上 ip远程连接Host is not allowed to conn

    落雨 如果你想连接远程IP的mysql的时候发生这个错误: ERROR 1130: Host '192.168.1.3' is not allowed to connect to this MySQL ...

  8. 140227项目开发及上线过程遇到的10个问题(重点: FCK过滤替换)

    1.替换条件判断问题 String s = (String)map2.get("contentIntro"); if(s != null && s.length() ...

  9. Python性能分析指南

    http://www.admin10000.com/document/2861.html 尽管并非每个你写的Python程序都需要严格的性能分析,但了解一下Python的生态系统中很多优秀的在你需要做 ...

  10. JsRender系列demo-10

    <!DOCTYPE html> <html> <head> <script src="http://code.jquery.com/jquery.j ...