asp.net 使用NPOI讀取excel文件

来源:https://www.cnblogs.com/laoq112/archive/2019/11/21/11903684.html

asp.net 使用NPOI讀取excel文件內容 NPOI下載地址:NPOI public class ExcelHelper { /// <summary> /// 讀取Excel文件數據到DataSet,一個Sheet對應一個DataTable /// </summary> /// <para ...


asp.net 使用NPOI讀取excel文件內容

NPOI下載地址:NPOI

public class ExcelHelper
{
    /// <summary>
    /// 讀取Excel文件數據到DataSet,一個Sheet對應一個DataTable
    /// </summary>
    /// <param name="strExcelFilePath">Excel文件的物理路徑</param>
    /// <returns></returns>
    public static DataSet GetDataFromExcel(string strExcelPhysicalPath, out string strError)
    {
        try
        {
            DataSet dsResult = new DataSet();
            strError = "";

            IWorkbook wbook = null;
            using (FileStream fs = new FileStream(strExcelPhysicalPath, FileMode.Open, FileAccess.Read))
            {
                if (strExcelPhysicalPath.IndexOf(".xlsx") > 0)
                {
                    wbook = new XSSFWorkbook(fs);
                }
                else
                {
                    wbook = new HSSFWorkbook(fs);
                }
            }

            for (int i = 0; i < wbook.NumberOfSheets; i++)
            {
                ISheet wsheet = wbook.GetSheetAt(i);
                if (wsheet == null) continue;

                DataTable dtSheet = GetDataFromSheet(wsheet, out strError);
                if (dtSheet != null)
                {
                    dtSheet.TableName = wsheet.SheetName.Trim();
                    dsResult.Tables.Add(dtSheet);
                }
                else
                {
                    dsResult = null;
                    break;
                }
            }
            return dsResult;
        }
        catch (Exception ex)
        {
            strError = ex.Message.ToString();
            return null;
        }
    }

    private static DataTable GetDataFromSheet(ISheet wsheet, out string strError)
    {
        try
        {
            DataTable dtResult = new DataTable();
            strError = "";

            //取sheet最大列數
            int max_column = 0;
            for (int i = wsheet.FirstRowNum; i <= wsheet.LastRowNum; i++)
            {
                IRow rsheet = wsheet.GetRow(i);
                if (rsheet != null && rsheet.LastCellNum > max_column)
                {
                    max_column = rsheet.LastCellNum;
                }
            }
            //給DataTable添加列
            for (int i = 0; i < max_column; i++)
            {
                dtResult.Columns.Add("A" + i.ToString());
            }

            for (int i = wsheet.FirstRowNum; i <= wsheet.LastRowNum; i++)
            {
                DataRow dRow = dtResult.NewRow();
                IRow rsheet = wsheet.GetRow(i);

                if (rsheet == null) continue;

                for (int j = rsheet.FirstCellNum; j < rsheet.LastCellNum; j++)
                {
                    ICell csheet = rsheet.GetCell(j);

                    if (csheet == null) continue;

                    switch (csheet.CellType)
                    {
                        case CellType.Blank:
                            dRow[j] = "";
                            break;
                        case CellType.Boolean:
                            dRow[j] = csheet.BooleanCellValue;
                            break;
                        case CellType.Error:
                            dRow[j] = csheet.ErrorCellValue;
                            break;
                        case CellType.Formula:
                            try
                            {
                                dRow[j] = csheet.NumericCellValue;

                                short format1 = csheet.CellStyle.DataFormat;
                                if (format1 == 177 || format1 == 178 || format1 == 188)
                                {
                                    dRow[j] = csheet.NumericCellValue.ToString("#0.00");
                                }
                            }
                            catch
                            {
                                dRow[j] = csheet.StringCellValue.Trim();
                            }
                            break;
                        case CellType.Numeric:
                            try
                            {
                                short format2 = csheet.CellStyle.DataFormat;
                                if (format2 == 14 || format2 == 31 || format2 == 57 || format2 == 58)
                                {
                                    dRow[j] = csheet.DateCellValue;
                                }
                                else
                                {
                                    dRow[j] = csheet.NumericCellValue;
                                }
                                if (format2 == 177 || format2 == 178 || format2 == 188)
                                {
                                    dRow[j] = csheet.NumericCellValue.ToString("#0.00");
                                }
                            }
                            catch
                            {
                                dRow[j] = csheet.StringCellValue.Trim();
                            }
                            break;
                        case CellType.String:
                            dRow[j] = csheet.StringCellValue.Trim();
                            break;
                        default:
                            dRow[j] = csheet.StringCellValue.Trim();
                            break;
                    }
                }

                dtResult.Rows.Add(dRow);
            }
            return dtResult;
        }
        catch (Exception ex)
        {
            strError = ex.Message.ToString();
            return null;
        }
    }
}

 


您的分享是我們最大的動力!

更多相關文章
  • 首先,小編要告訴大家一個殘酷的現實,那就是layui對按鈕沒有提供點擊事件的支持… 這裡的點擊事件是指單純的點擊事件,而不是提交事件,或者是數據表格中內嵌的button,對於這兩者,layui是有lay-submit和lay-event這個屬性進行支持的,所以這裡只能使用最原始的js和jq進行監聽點 ...
  • 本文梯子 前言 1、.net core 框架性能測試 2、.net core 執行過程 3、中間件執行過程 4、AOP切麵 5、整體框架結構與資料庫表UML 一、創建第一個Core 1、SDK 安裝 2、新建項目 2、新建項目(3.0SDK) 3、項目整體結構分析 二、重要文件說明 1、Progra ...
  • //接收的為空時,則表示客戶端下線,跳出迴圈 if (r == 0) { break; }; string str = Encoding.UTF8.GetString(buffer, 0, r); //RemoteEndPoint:可以得到遠程客戶端的IP和埠號。 ShowMsg(socketSe... ...
  • static void CopyFiles() { string sourceDir = @"D:\C\ll"; string destDir = @"D:\LL"; if (!Directory.Exists(destDir)) { Directo... ...
  • //加密 public static string GDEncode(string data, string Key) { Key = "12345678"; byte[] byKey = System.Text.ASCIIEncoding.ASCII.GetBytes(Key); byte[] b ...
  • 當我們的系統時間不正常,比如設置一個日期-1999年9月9日,會引發證書問題。 系統時間不正常-IE有概率能訪問 觸發NavigateError事件,異常代碼INET_E_INVALID_CERTIFICATE -- 這是一個必要不充分條件,系統時間不正常時IE有相關證書異常,更新時間能解決此類異常 ...
  • asp.net 使用 Application 限制單一登錄 原理:用戶登錄後系統會分配一個與用戶唯一對應的SessionID,將當前用戶ID與其SessionID對應保存在Application中,一旦該用戶在其他地方重覆登錄則Application中保存的SessionID就會被更新,導致當前se ...
  • 場景 使用Visual Studio 開發Winform程式,使用SVN進行項目版本管理。 在添加引用時,會出現在A電腦中添加了絕對路徑的引用,在B電腦中就會出現找不到 並且將此引用標識為?的狀態。 註: 博客主頁: https://blog.csdn.net/badao_liumang_qizhi ...
一周排行
  • 前言 上一篇文章介紹IOptions的註冊,本章我們繼續往下看 IOptions IOptions是一個介面裡面只有一個Values屬性,該介面通過OptionsManager實現 OptionsManager OptionsManager實現了IOptions和IOptionsSnapshot,他 ...
  • 在 EF 里有個 `ShadowProperty` (陰影屬性/影子屬性)的概念,你可以通過 FluentAPI 的方式來定義一個不在 .NET model 里定義的屬性,只能通過 EF 里的 `Change Tracker` 來操作這種屬性。 在導出 Excel 的時候,可能希望導出的列並不... ...
  • 使用NPOI操作Excel,無需Office COM組件 部分代碼來自於:https://docs.microsoft.com/zh-tw/previous-versions/ee818993(v=msdn.10)?redirectedfrom=MSDN using System.Data; usi ...
  • Spire.Cloud.Word.Sdk提供了介面SetBackgroudColor()、SetBackgroudImage()、DeleteBackground()、GetBackgroudColor()用於設置、刪除及讀取Word文檔背景。本文將以C#程式為例演示如何來調用API介面實現以上內容 ...
  • 說明:在同一視窗打開鏈接,只要稍加改造就可以實現,這裡實現的是在新Tab頁打開鏈接,並且支持帶type="POST" target="_blank"的鏈接 github和bitbucket上相關問題: 1、WPF empty POST data when using custom popup htt ...
  • 前言 公司項目需要做個畫線縮放,我司稱之為瞳距縮放,簡而言之就是:2張圖,從第一張圖畫一條線,再從第二個圖畫一條線,第二條線以第一條為基準,延長到一致的長度,並同比縮放圖片;文字太枯燥,請先實例圖 例子1:以皮卡丘為例,我要把路飛的拳頭縮放到皮卡丘頭那麼大 例子2:以皮卡丘的基準,縮小路飛,與其身高 ...
  • 9月份的時候,微軟宣佈正式發佈C 8.0,作為.NET Core 3.0發行版的一部分。C 8.0的新特性之一就是預設介面實現。在本文中,我們將一起來聊聊預設介面實現。 作者:依樂祝 原文鏈接:https://www.cnblogs.com/yilezhu/p/12034584.html 提前說下: ...
  • 對於地圖坐標偏移,以leaflet為例,有如下解決辦法 方法1、修改leaflet源碼,解決地圖坐標偏移問題 方法2、將點位真實的經緯度經過偏移演算法,添加到加密的地圖上 方法3、直接對離線地圖瓦片進行糾偏 方法1需要修改源碼 方法2有缺陷,地圖依然是偏移的,如果把地圖經緯度顯示出來,經緯度也是不對的 ...
  • 引用類庫 1.Install-Package Microsoft.Extensions.Caching.Memory MemoryCacheOptions 緩存配置 1.ExpirationScanFrequency 獲取或設置對過期項的連續掃描之間的最短時間間隔 2.SizeLimit 緩存是沒有 ...
  • 原文:https://blogs.msdn.microsoft.com/mazhou/2017/12/12/c-7-series-part-7-ref-returns/ 背景 有兩種方法可以將一個值傳遞給一個方法: 例如,FCL(.NET Framework Class Library)中的Arra ...
x