欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#操作NPOI實(shí)現(xiàn)Excel數(shù)據(jù)導(dǎo)入導(dǎo)出

 更新時(shí)間:2023年02月15日 08:26:14   作者:£冷☆月№  
這篇文章主要為大家詳細(xì)介紹了C#如何操作NPOI實(shí)現(xiàn)Excel數(shù)據(jù)導(dǎo)入導(dǎo)出功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

首先在項(xiàng)目中引用NPOI,通過管理NuGet程序包,搜索NPOI,選擇版本2.3.0(支持.NET Framework 4.0)根據(jù)自己項(xiàng)目選擇適當(dāng)版本。

1.NpoiExcelHelper.cs  Npoi操作Excel類

using System.Data;
using System.IO;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using NPOI.HSSF.UserModel;

    /// <summary>
    /// Npoi操作Excel類
    /// </summary>
    public static class NpoiExcelHelper
    {
        /// <summary>
        /// 根據(jù)Excel文件類型返回IWorkbook
        /// </summary>
        /// <param name="fileName">文件路徑/文件名稱(含后綴名)</param>
        /// <param name="rowNum">Excel行數(shù)</param>
        /// <param name="colNum">Excel列數(shù)</param>
        /// <param name="isFirstRowColumn">第一行是否是標(biāo)題</param>
        /// <returns></returns>
        public static IWorkbook GetWorkbook(string fileName, out int rowNum, out int colNum, bool isFirstRowColumn = true)
        {
            bool isXlsx = Path.GetExtension(fileName).Equals(".xlsx");
            if (isXlsx)
            {
                if (isFirstRowColumn)
                {
                    rowNum = 1048575;
                }
                else
                {
                    rowNum = 1048576;
                }
                colNum = 16384;
            }
            else
            {
                if (isFirstRowColumn)
                {
                    rowNum = 65535;
                }
                else
                {
                    rowNum = 65536;
                }
                colNum = 256;
            }
            
            if (File.Exists(fileName))
            {
                
                using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read))
                {
                    if (isXlsx)
                    {
                        return new XSSFWorkbook(fs);
                    }
                    else
                    {
                        return new HSSFWorkbook(fs);
                    }
                }
            }
            else
            {
                if (isXlsx)
                {
                    return new XSSFWorkbook();
                }
                else
                {
                    return new HSSFWorkbook();
                }
            }
        }

        /// <summary>
        /// 將DataTable中的數(shù)據(jù)導(dǎo)入到excel中(第一行是標(biāo)題)
        /// 支持根據(jù)Excel數(shù)據(jù)自動(dòng)分頁(多個(gè)Sheet)
        /// </summary>
        /// <param name="dt">DataTable</param>
        /// <param name="fileName">文件路徑/文件名稱(含后綴名)</param>
        /// <param name="columnFieldText">字段對應(yīng)中文 順序需要跟Excel中數(shù)據(jù)順序一致</param>
        /// <param name="sheetName">Excel中Sheet名稱(多個(gè)sheet時(shí) 名字后面自動(dòng)加上數(shù)字序號)</param>
        /// <returns></returns>
        public static byte[] DataTableToExcel(DataTable dt, string fileName, string[,] columnFieldText = null, string sheetName = null)
        {
            int rowNum = 0;
            int colNum = 0;
            IWorkbook workbook = GetWorkbook(fileName, out rowNum, out colNum);
            
            var recordNum = dt.Rows.Count;
            int totalPage = recordNum % rowNum == 0 ? recordNum / rowNum : recordNum / rowNum + 1;

            for (var p = 0; p < totalPage; p++)
            {
                if (string.IsNullOrEmpty(sheetName))
                {
                    sheetName = dt.TableName;
                }

                if (totalPage > 1)
                {
                    if (string.IsNullOrEmpty(sheetName))
                    {
                        sheetName = "Sheet";
                    }

                    sheetName = sheetName + (p + 1).ToString();
                }
                else
                {
                    if (string.IsNullOrEmpty(sheetName))
                    {
                        sheetName = "Sheet1";
                    }
                }

                ISheet sheet = workbook.CreateSheet(sheetName);//創(chuàng)建工作表

                #region 標(biāo)題
                IRow row = sheet.CreateRow(0);//在工作表中添加一行
                if (columnFieldText != null)
                {
                    var dataColumn = columnFieldText.GetLength(0);
                    if (dataColumn <= colNum)
                    {
                        for (int m = 0; m < dataColumn; m++)
                        {
                            ICell cell = row.CreateCell(m);//在行中添加一列
                            cell.SetCellValue(columnFieldText[m, 1]);//設(shè)置列的內(nèi)容
                        }
                    }
                    else
                    {
                        //數(shù)據(jù)列數(shù)超過了Excel的列數(shù)
                    }
                }
                else
                {
                    var dataColumn = dt.Columns.Count;
                    if (dataColumn <= colNum)
                    {
                        for (int i = 0; i < dataColumn; i++)
                        {
                            ICell cell = row.CreateCell(i);//在行中添加一列
                            cell.SetCellValue(dt.Columns[i].ColumnName);//設(shè)置列的內(nèi)容     
                        }
                    }
                    else
                    {
                        //數(shù)據(jù)列數(shù)超過了Excel的列數(shù)
                    }
                }
                #endregion
                #region 填充數(shù)據(jù)

                int startIndex = p * rowNum;
                int endindex = (p + 1) * rowNum - 1;
                if (endindex >= recordNum)
                {
                    endindex = recordNum - 1;
                }

                for (int i = startIndex; i <= endindex; i++)//遍歷DataTable行
                {
                    DataRow dataRow = dt.Rows[i];
                    
                    row = sheet.CreateRow(i - startIndex + 1);//在工作表中添加一行

                    if (columnFieldText != null)
                    {
                        var dataColumn = columnFieldText.GetLength(0);
                        if (dataColumn <= colNum)
                        {
                            for (int m = 0; m < dataColumn; m++)
                            {
                                ICell cell = row.CreateCell(m);//在行中添加一列
                                cell.SetCellValue(dataRow[columnFieldText[m, 0]].ToString());//設(shè)置列的內(nèi)容
                            }
                        }
                        else
                        {
                            //數(shù)據(jù)列數(shù)超過了Excel的列數(shù)
                        }
                    }
                    else
                    {
                        var dataColumn = dt.Columns.Count;
                        if (dataColumn <= colNum)
                        {
                            for (int j = 0; j < dt.Columns.Count; j++)//遍歷DataTable列
                            {
                                ICell cell = row.CreateCell(j);//在行中添加一列
                                cell.SetCellValue(dataRow[j].ToString());//設(shè)置列的內(nèi)容     
                            }
                        }
                        else
                        {
                            //數(shù)據(jù)列數(shù)超過了Excel的列數(shù)
                        }
                    }
                }
                #endregion
            }
            #region 輸出Excel
            using (MemoryStream stream = new MemoryStream())
            {
                workbook.Write(stream);
                return stream.ToArray();
            }
            #endregion
        }

        /// <summary>
        /// 將excel中的數(shù)據(jù)導(dǎo)入到DataTable中(第一行是標(biāo)題)
        /// 支持多個(gè)sheet數(shù)據(jù)導(dǎo)入(建議多個(gè)sheet的數(shù)據(jù)格式保持一致,將沒有數(shù)據(jù)的sheet刪除)
        /// </summary>
        /// <param name="fileName">文件路徑(含文件名稱后綴名)</param>
        /// <param name="columnFieldText">字段對應(yīng)中文 順序需要跟Excel中數(shù)據(jù)順序一致</param>
        /// <param name="sheetName">指定Excel中Sheet名稱 如果為null時(shí),讀取所有sheet中的數(shù)據(jù)</param>
        /// <returns>返回的DataTable</returns>
        public static DataTable ExcelToDataTable(string fileName, string[,] columnFieldText = null, string sheetName = null)
        {
            DataTable data = new DataTable();
            int rowNum = 0;
            int colNum = 0;
            IWorkbook workbook = GetWorkbook(fileName, out rowNum, out colNum);

            for (int e = 0; e < workbook.NumberOfSheets; e++)
            {
                ISheet sheet = workbook.GetSheetAt(e);
                if (sheet != null)
                {
                    var currentSheetIndex = 0;
                    if (!string.IsNullOrEmpty(sheetName))
                    {
                        if (sheet.SheetName == sheetName)
                        {
                            currentSheetIndex = e;
                        }
                    }

                    IRow firstRow = sheet.GetRow(0);
                    if (firstRow != null)
                    {
                        int cellCount = firstRow.LastCellNum; //一行最后一個(gè)cell的編號 即總的列數(shù)

                        var dataColumn = columnFieldText != null ? columnFieldText.GetLength(0) : cellCount;
                        int startRow = sheet.FirstRowNum;
                        if (dataColumn <= colNum)
                        {
                            if (e == currentSheetIndex)
                            {
                                for (int i = firstRow.FirstCellNum; i < cellCount; ++i)
                                {
                                    ICell cell = firstRow.GetCell(i);
                                    if (cell != null)
                                    {
                                        string cellValue = cell.StringCellValue;
                                        if (cellValue != null)
                                        {
                                            DataColumn column = new DataColumn((columnFieldText != null ? columnFieldText[i, 0] : cellValue));
                                            data.Columns.Add(column);
                                        }
                                    }
                                }
                            }

                            startRow = sheet.FirstRowNum + 1;

                            //最后一列的標(biāo)號
                            int rowCount = sheet.LastRowNum;
                            for (int i = startRow; i <= rowCount; ++i)
                            {
                                IRow row = sheet.GetRow(i);
                                if (row == null) continue; //沒有數(shù)據(jù)的行默認(rèn)是null       

                                DataRow dataRow = data.NewRow();
                                for (int j = row.FirstCellNum; j < cellCount; ++j)
                                {
                                    if (row.GetCell(j) != null) //同理,沒有數(shù)據(jù)的單元格都默認(rèn)是null
                                        dataRow[j] = row.GetCell(j).ToString();
                                }
                                data.Rows.Add(dataRow);
                            }
                        }
                        else
                        {
                            //數(shù)據(jù)列數(shù)超過了Excel的列數(shù)
                        }
                    }

                    if (!string.IsNullOrEmpty(sheetName))
                    {
                        if (sheet.SheetName == sheetName)
                        {
                            break;
                        }
                    }
                }
            }
            return data;
        }
    }

2.WEB項(xiàng)目的調(diào)用方法

(1)數(shù)據(jù)導(dǎo)出到Excel中(支持根據(jù)DataTable數(shù)據(jù)及Excel自動(dòng)分成多個(gè)Sheet)

調(diào)用方法:

int record = 500;
                DataTable data = CreateDataTable(record);

                string fileName = "客戶明細(xì)_" + DateTime.Now.ToString("MMddhhmmss") + ".xls";
                string sheetName = "客戶明細(xì)";

                string[,] columnFieldText = new[,]{
                    { "ID", "編號" },
                    { "Name", "姓名" },
                    { "CreateTime", "創(chuàng)建時(shí)間" }
                };

                //string[,] columnFieldText = null;

                var buf = NpoiExcelHelper.DataTableToExcel(data, fileName, columnFieldText, sheetName);

                Response.Buffer = true;
                Response.Clear();
                Response.ClearHeaders();
                Response.ClearContent();
                Response.Charset = "UTF8";
                Response.ContentEncoding = Encoding.UTF8;
                Response.ContentType = "application/vnd.ms-excel";
                string browser = Request.Browser.Browser;
                if (browser.Contains("InternetExplorer"))
                    Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(fileName, Encoding.UTF8));
                else
                    Response.AddHeader("Content-Disposition", "attachment; filename=" + fileName);

                Response.AddHeader("Content-Length", buf.Length.ToString());

                Response.Flush();
                Response.BinaryWrite(buf);
/// <summary>
        /// 創(chuàng)建DataTable對象
        /// </summary>
        public DataTable CreateDataTable(int record)
        {
            //創(chuàng)建DataTable
            DataTable dt = new DataTable("NewDt");

            //創(chuàng)建自增長的ID列
            DataColumn dc = dt.Columns.Add("ID", Type.GetType("System.Int32"));
            dc.AutoIncrement = true;  //自動(dòng)增加
            dc.AutoIncrementSeed = 1; //起始為1
            dc.AutoIncrementStep = 1; //步長為1
            dc.AllowDBNull = false;  //非空

            //創(chuàng)建其它列表
            dt.Columns.Add(new DataColumn("Name", Type.GetType("System.String")));
            dt.Columns.Add(new DataColumn("CreateTime", Type.GetType("System.DateTime")));

            DataRow dr;
            for (int i = 0; i < record; i++)
            {
                dr = dt.NewRow();
                dr["Name"] = "名字" + i.ToString();
                dr["CreateTime"] = DateTime.Now;
                dt.Rows.Add(dr);
            }
            return dt;
        }

(2)Excel中數(shù)據(jù)導(dǎo)入DataTable中(支持指定Sheet名稱 / 多個(gè)數(shù)據(jù)格式一致的Shee)

string fileName = "客戶明細(xì)_0213023109.xls";
                string sheetName = "客戶明細(xì)1";

                string[,] columnFieldText = new[,]{
                    { "ID", "編號" },
                    { "Name", "姓名" },
                    { "CreateTime", "創(chuàng)建時(shí)間" }
                };

                //string[,] columnFieldText = null;

                var dt = NpoiExcelHelper.ExcelToDataTable(Server.MapPath(fileName), columnFieldText, sheetName);

到此這篇關(guān)于C#操作NPOI實(shí)現(xiàn)Excel數(shù)據(jù)導(dǎo)入導(dǎo)出的文章就介紹到這了,更多相關(guān)C# NPOIExcel數(shù)據(jù)導(dǎo)入導(dǎo)出內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論