關於NPOI的一點補充和示例
最近看到很多人分享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的一點補充和示例的更多相关文章
- [Xamarin] 關於發出Notification 的大小事 (转帖)
關於Anroid 的使用者來說,Notification 是一個非常會看到且用到的功能 他可以提醒使用者甚麼東西需要待處理,像是郵件或是會議的提醒等.. 甚至有些APP ,直接使用Notificati ...
- 在laravel下關於blade模板的嘗試
Blade模板 關於模板繼承和分區段 @section和@yield的實驗 ①關於@section...@show嘗試 測試1 {{--appV2test.blade.php--}} <html ...
- 開博客了, 因為搞Delphi 開發的關於Delphi學習
開博客了, 因為搞Delphi 開發的關於Delphi學習,之前都是用本地TXT文件保存,發現在本地電腦保存非常不方面,而且只能在一台電腦上保存,不容易查看和修改內容.便於以後的記錄只用,以及經驗交流 ...
- 關於Validform 控件 值得注意的地方
Validform控件其實用起來挺方便的,直接百度就能找到官網,有直接的demo做參考.這些我就不提了,我所要說的是關於Validform控件的ajax的提交. Validform中有個參數ajaxP ...
- JDK1.6历史版本的下载(關於TLSv1.2)Oracle的官方文檔
[资源描述]:对于部分老项目 仍然采用的是JDK1.6 版本 但是打开官方 JDK 都是最新的 版本 想找 历史版本 不容易找到 [资源详情]:提供下载链接: http://www.oracle.co ...
- 關於imagick不得不說的一些事
PHP建圖通常都用GD庫,因為是內置的不需要在服務器上額外安裝插件,所以用起來比較省心,但是如果你的程序主要的功能就是處理圖像,那麼就不建議用GD了,因為GD不但低效能而且能力也比較弱,佔用的系統資源 ...
- 關於 WebClient wc = new WebClient() 下載第三方數據不能進安安信任異常
報錯異常:The underlying connection was closed: Could not establish trust relationship for SSL/TLS secure ...
- Python 基礎 - 淺copy補充說明
在 import copy 這個模塊裡 基於第一個列表來做淺copy,實際上第二個列表裡的元素,是第一個列表的 引用. 接下來介紹 淺copy有三種方式可以使用 #!/usr/bin/env pyth ...
- [Xamarin] 關於Internal Storage ,存取App內部使用資料 (转帖)
最近在開發App,會使用到必須要處理一些App所使用的資料,上網路查一下Android 得作法,包含我自己也實作了一下,可能是因為對Java || Android 不是很孰悉,常常錯在 java.la ...
随机推荐
- 1891: 丘比特的烦恼 - BZOJ
Description 随着社会的不断发展,人与人之间的感情越来越功利化.最近,爱神丘比特发现,爱情也已不再是完全纯洁的了.这使得丘比特很是苦恼,他越来越难找到合适的男女,并向他们射去丘比特之箭.于是 ...
- javascript小实例,PC网页里的拖拽(转)
这是现在的效果,可能改了一些,原来的效果是,里面的这张图是可以上下左右拖动的,然后房子上面的显示的楼栋号,也跟着图片一起移动,当时js能力还不行,未能实现项目经理的要求,不过后来项目经理又把这个效果推 ...
- mybatis集成spring的事务管理
第一 创建一个测试实体 public class Order { private int id; private String orderName; public Order(String order ...
- NYOJ-44 子串和 AC 分类: NYOJ 2014-01-04 22:53 154人阅读 评论(0) 收藏
作为菜鸟一枚,对子串和的代码完全就是硬算 的..结果是TLE #include<stdio.h> int jh(int x,int y,int num[],int sum[]); int ...
- Win 7怎样拒绝所有可移动存储设备的所有权限
在Windows 7中,我们可拒绝对任何可移动存储类的权限.下面让我来教大家怎样在组策略中启用“所有可移动存储类:拒绝所有权限”策略,具体操作步骤如下所述: 步骤/方法 在开始搜索框中键入“gpedi ...
- DevOps 和技术债务偿还自动化
当企业想要迁移到一个 DevOps 模型时,经常需要偿还高等级的技术债务 说得更明确一点,机构往往陷入「技术债务的恶性循环」中,以至于任何迅速.敏捷的迁移方式都无法使用.这是技术债务中的希腊债务危机水 ...
- Unique Binary Search Tree II
Given n, generate all structurally unique BST's (binary search trees) that store values 1...n. For e ...
- Oracle 9 - redo和undo
1.redo redo 有在线redo日志和归档redo日志, 从Oracle 10g开始还新增加了flashback技术. 每个Oracle数据库至少有2个在线重做日志组,循环写. 只有INSERT ...
- nmap使用详解
nmap是一个网络探测和安全扫描程序, 系统管理者和个人可以使用这个软件扫描大型的网络,获取那台主机正在运行以及提供什么服务等信息.nmap支持很多扫描技术,例如:UDP.TCP connect(). ...
- java 多线程 CountDownLatch用法
CountDownLatch,一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待. 主要方法 public CountDownLatch(int count); pu ...