關於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(0)
        For i = 0 To dt.Columns.Count - 1
            row.CreateCell(i).SetCellValue(dt.Columns(i).ColumnName)
        Next
        For i = 0 To dt.Rows.Count - 1
            Dim row2 As HSSFRow = sheet.CreateRow(i + 1)
            For j = 0 To dt.Columns.Count - 1
                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之後請自行處理.  

时间: 2024-10-09 08:46:33

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

【求助】關於OleDbParameter的問題

小弟做簡單測試時遇到一個很奇怪的問題. 以前一直用sqlParameter比較多,第一次用OleDbParameter.debug卻感覺沒有把值傳過去導致查不到結果. 只有一個參數,所以不存在順序的問題. 還望大神指點一二.謝謝. .net 4.0+vs 2013+c# 1 protected void Button1_Click(object sender, EventArgs e) 2 { 3 string StrSQL = @"select * from acoa1002 where [e

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

報錯異常:The underlying connection was closed: Could not establish trust relationship for SSL/TLS secure channel(中文版為: 基礎連接已關閉: 無法為 SSL/TLS 安全通道建立信任關係.)WebClient wc = new WebClient();//用这个密匙字符串获取我(me)的相册  graph_url = "https://graph.facebook.com/" +

關於博客資源下載(第1次必看)

本博客所有資源下載方法.(新人必看!!!) 1. 圖片種子下載.    關於圖片資源的,只要把圖片另存為到桌面. 名字改成  xxx.rar   或者  xxx.7z   xxx.7zip  只要改名為你電腦上有的壓縮軟體後輟即可. 2. BAT種子下載.    關於BAT資源, 只要把BAT數據複製下來,然後到桌面上新建個txt空文檔. 然後把複製的BAT數據粘貼進空文檔裏面. 然後保存為 xxx.bat 雙擊即可. 3. 字符種子下載.    用到時再講. 4. 待更新... 關於博客資源下

關於php接ICBC的支付接口的解決方案

一:背景: 目前項目使用的是php語言開發,需要接入中國工商銀行的ICBC的線上支付接口. 二:遇到的問題:支付時需要對數據簽名,但是銀行那邊不提供php版本的程序,只有java版本的,以下是對接人回復的郵件: 三:思路: 目前大概有3種解決方案: 1.  通過使用一個叫 php-java-bridge 的插件,在php中調用java的函數 2. 把java的函數改寫成php版本 3. 在服務器配置javaWeb環境,通過http請求把簽名的參數傳入,從而獲取簽名 四: 具體做法: 我採取的是第

關於隱私數據賣錢那點事

美國一家名為 Reputation 的網站即將發布一款可以讓人們出售自己的隱私數據換取折扣或者好處的產品,終於可以用自己的數據換點零花錢了. 互聯網已經固定的商業模式:大公司通過收集用戶的隱私數據來為企業提供收費服務以支撐公司發展,同時以免費的網路服務來補償用戶.想想看,Facebook.百度.Google 等網站都是這樣的模式,用戶免費用產品,但是無法得到看得見的實惠. 到今年年底,互聯網用戶將會得到一個將自己的隱私數據變現的機會,屆時用戶不再是互聯網的被動者,而將在互聯網盈利模式中獲得一個更

VS 中關於附加到進程中調試 的問題。

在使用Vs 2012 時,項目發佈到Local IIS 中,如果在調試某個頁面中時,都要F5--> Login --> Debug 很繁瑣,下列有一種較快捷的方式,能夠更快的調試代碼. 1. IIS中設置: 如上圖,在IIS 中找到發佈的項目,右鍵-->管理應用程序--> 高級設置-->物理路徑憑證-->選擇特定用戶,然後設置賬戶密碼,此處用的是Windows Administrator 賬號. 2. 第1點設置之後,便可在VS 中添加斷點,然後調試-->附加到進

REVIT開發隨筆,關於二進制序列化

想把項目中所有元素的List預存,考慮到狀態的完美恢復,首先想到的是二進制序列化. 畢竟多年不堆碼,等解決了IGROUPING,LOOKUP不能序列化,自動屬性不能直接標註非序列化后,編譯一切順利. 然而,第一次運行,這個錯誤打擊了我. Element不能序列化,看來只能試試只存儲ElementId了,不過也不樂觀.明天試試.

關於那我的編程歷史..

2000年  “小霸王电脑学习机”(FC游戏机为内核的中英文电脑学习机)那是再熟悉不过的了,想当年曾经是风靡一时,那时候要是能拥有一部小霸王学习机简直是天大的梦想了.当时我还在上小学,好多同学家里面都有一部小霸王,虽然美其名曰“学习机”,但是大多数真正的用途是用来玩游戏的,因为当时好玩的东西太少啦,用小霸王来玩游戏机就是我们唯一的消遣,“小霸王学习机,其乐无穷”,那是当时喊出的口号.而我每次只能跑到别人家里跟他们一起玩游戏,比如经典的游戏魂斗罗.双截龙和超级玛莉等等,玩得真是非常的过瘾,自己真的

[Node.js] 關於 console.log 的格式化輸出

Node.js 當中的 console.log,除了基本字串的輸出之外,還可以利用 %s.%d.%j 格式化的輸出,就讓我們來看些例子吧! 一.範例1 (字串輸出):console.js console.log('%s', 'This is String.'); console.log('%s %s %s', 'This', 'is', 'String.'); console.log('%s', 'This', 'is', 'String.'); console.log('%s:%s', 'Th