广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C#操作NPOI实现Excel数据导入导出
  • 609
分享到

C#操作NPOI实现Excel数据导入导出

摘要

目录1.NpoiexcelHelper.cs  Npoi操作Excel类2.WEB项目的调用方法首先在项目中引用NPOI,通过管理NuGet程序包,搜索NPOI,

首先在项目中引用NPOI,通过管理NuGet程序包,搜索NPOI,选择版本2.3.0(支持.net Framework 4.0)根据自己项目选择适当版本。

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>
        /// 根据Excel文件类型返回IWorkbook
        /// </summary>
        /// <param name="fileName">文件路径/文件名称(含后缀名)</param>
        /// <param name="rowNum">Excel行数</param>
        /// <param name="colNum">Excel列数</param>
        /// <param name="isFirstRowColumn">第一行是否是标题</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中的数据导入到excel中(第一行是标题)
        /// 支持根据Excel数据自动分页(多个Sheet)
        /// </summary>
        /// <param name="dt">DataTable</param>
        /// <param name="fileName">文件路径/文件名称(含后缀名)</param>
        /// <param name="columnFieldText">字段对应中文 顺序需要跟Excel中数据顺序一致</param>
        /// <param name="sheetName">Excel中Sheet名称(多个sheet时 名字后面自动加上数字序号)</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);//创建工作表

                #region 标题
                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]);//设置列的内容
                        }
                    }
                    else
                    {
                        //数据列数超过了Excel的列数
                    }
                }
                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);//设置列的内容     
                        }
                    }
                    else
                    {
                        //数据列数超过了Excel的列数
                    }
                }
                #endregion
                #region 填充数据

                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());//设置列的内容
                            }
                        }
                        else
                        {
                            //数据列数超过了Excel的列数
                        }
                    }
                    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());//设置列的内容     
                            }
                        }
                        else
                        {
                            //数据列数超过了Excel的列数
                        }
                    }
                }
                #endregion
            }
            #region 输出Excel
            using (MemoryStream stream = new MemoryStream())
            {
                workbook.Write(stream);
                return stream.ToArray();
            }
            #endregion
        }

        /// <summary>
        /// 将excel中的数据导入到DataTable中(第一行是标题)
        /// 支持多个sheet数据导入(建议多个sheet的数据格式保持一致,将没有数据的sheet删除)
        /// </summary>
        /// <param name="fileName">文件路径(含文件名称后缀名)</param>
        /// <param name="columnFieldText">字段对应中文 顺序需要跟Excel中数据顺序一致</param>
        /// <param name="sheetName">指定Excel中Sheet名称 如果为null时,读取所有sheet中的数据</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; //一行最后一个cell的编号 即总的列数

                        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;

                            //最后一列的标号
                            int rowCount = sheet.LastRowNum;
                            for (int i = startRow; i <= rowCount; ++i)
                            {
                                IRow row = sheet.GetRow(i);
                                if (row == null) continue; //没有数据的行默认是null       

                                DataRow dataRow = data.NewRow();
                                for (int j = row.FirstCellNum; j < cellCount; ++j)
                                {
                                    if (row.GetCell(j) != null) //同理,没有数据的单元格都默认是null
                                        dataRow[j] = row.GetCell(j).ToString();
                                }
                                data.Rows.Add(dataRow);
                            }
                        }
                        else
                        {
                            //数据列数超过了Excel的列数
                        }
                    }

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

2.WEB项目的调用方法

(1)数据导出到Excel中(支持根据DataTable数据及Excel自动分成多个Sheet)

调用方法:

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

                string fileName = "客户明细_" + DateTime.Now.ToString("MMddhhmmss") + ".xls";
                string sheetName = "客户明细";

                string[,] columnFieldText = new[,]{
                    { "ID", "编号" },
                    { "Name", "姓名" },
                    { "CreateTime", "创建时间" }
                };

                //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>
        /// 创建DataTable对象
        /// </summary>
        public DataTable CreateDataTable(int record)
        {
            //创建DataTable
            DataTable dt = new DataTable("NewDt");

            //创建自增长的ID列
            DataColumn dc = dt.Columns.Add("ID", Type.GetType("System.Int32"));
            dc.AutoIncrement = true;  //自动增加
            dc.AutoIncrementSeed = 1; //起始为1
            dc.AutoIncrementStep = 1; //步长为1
            dc.AllowDBNull = false;  //非空

            //创建其它列表
            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中数据导入DataTable中(支持指定Sheet名称 / 多个数据格式一致的Shee)

string fileName = "客户明细_0213023109.xls";
                string sheetName = "客户明细1";

                string[,] columnFieldText = new[,]{
                    { "ID", "编号" },
                    { "Name", "姓名" },
                    { "CreateTime", "创建时间" }
                };

                //string[,] columnFieldText = null;

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

到此这篇关于C#操作NPOI实现Excel数据导入导出的文章就介绍到这了,更多相关C# NPOIExcel数据导入导出内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C#操作NPOI实现Excel数据导入导出

本文链接: https://www.lsjlt.com/news/196114.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C#操作NPOI实现Excel数据导入导出
    目录1.NpoiExcelHelper.cs  Npoi操作Excel类2.WEB项目的调用方法首先在项目中引用NPOI,通过管理NuGet程序包,搜索NPOI,...
    99+
    2023-02-15
    C# NPOI Excel数据导入导出 C# Excel数据导入导出 C# NPOIExcel
  • C#通过NPOI导入导出数据EXCEL
    本文实例为大家分享了C#通过NPOI导入导出数据EXCEL的具体代码,供大家参考,具体内容如下 其实从数据库到服务器导入导出有很多方法,但是比较简单的有NPOI这个方法 准备工作,先...
    99+
    2022-11-13
  • C#使用NPOI实现Excel导入导出功能
    本文实例为大家分享了C#使用NPOI实现Excel导入导出的具体代码,供大家参考,具体内容如下 Excel导入 使用OpenFileDiolog控件和button结合,选择文件导入,...
    99+
    2022-11-13
  • C#使用NPOI对Excel数据进行导入导出
    目录一、概述1、操作Excel的类库:2、引用DLL程序集构成二、通过NPOI,将Excel文件导到数据表DataTable四、常见用法:1、查找2、插入图片五、填充Excel模板六...
    99+
    2022-11-13
  • C#用NPOI导出导入Excel帮助类
    本文实例为大家分享了C#用NPOI导出导入Excel帮助类的具体代码,供大家参考,具体内容如下 1、准备工作 在管理NuGet程序包中搜索 NPOI,安装 NPOI 到要项目中。 2...
    99+
    2022-11-13
  • C#如何使用NPOI对Excel数据进行导入导出
    本篇内容介绍了“C#如何使用NPOI对Excel数据进行导入导出”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、概述NPOI 是 POI ...
    99+
    2023-07-02
  • C#中如何使用NPOI实现Excel导入导出功能
    本文小编为大家详细介绍“C#中如何使用NPOI实现Excel导入导出功能”,内容详细,步骤清晰,细节处理妥当,希望这篇“C#中如何使用NPOI实现Excel导入导出功能”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧...
    99+
    2023-06-29
  • C#实现NPOI的Excel导出详解
    技术点: 1.自定义attribute属性 2.通过反射取类及其属性的attribute属性值 3.NPOI包常用属性及方法(我也仅仅知道用到过的,陌生的要么见名知意,要么百度查) ...
    99+
    2022-11-13
  • 怎么用C#实现NPOI的Excel导出
    这篇文章主要讲解了“怎么用C#实现NPOI的Excel导出”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用C#实现NPOI的Excel导出”吧!技术点:自定义attribute属性通过反...
    99+
    2023-06-26
  • fastadmin实现导出Excel和导入Excel数据
    public function export() { if ($this->request->isPost()) { require_once(VENDOR_...
    99+
    2023-08-31
    php Powered by 金山文档
  • Java实现Excel导入导出操作详解
    目录前言1. 功能测试1.1 测试准备1.2 数据导入1.2.1 导入解析为JSON1.2.2 导入解析为对象(基础)1.2.3 导入解析为对象(字段自动映射)1.2.4 ...
    99+
    2022-11-13
  • Java怎么实现Excel导入导出操作
    今天小编给大家分享一下Java怎么实现Excel导入导出操作的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1. 功能测试1....
    99+
    2023-06-29
  • C#使用NPOI将List数据导出到Excel文档
    NPOI是一个开源的C#读写Excel、WORD等微软OLE2组件文档的项目。使用 NPOI 可以在没有安装 Office 或者相应环境的机器上对 WORD/EXCEL 文档进行读写...
    99+
    2022-11-13
  • java如何实现Excel的导入、导出操作
    这篇文章主要为大家展示了java如何实现Excel的导入、导出操作,内容简而易懂,希望大家可以学习一下,学习完之后肯定会有收获的,下面让小编带大家一起来看看吧。一、Excel的导入导入可采用两种方式,一种是JXL,另一种是POI,但前者不能...
    99+
    2023-05-31
    java excel
  • Oracle 数据导出,导入操作
    原理:通过Oracle BIN目录的exp.exe工具进行数据导出2019.01.10  cmd窗口导入导出表 .sql文件2019.04.30  PL/SQL工具导入导出表 .pde文件  --数据量大的...
    99+
    2022-10-18
  • C#中如何使用NPOI将List数据导出到Excel文档
    今天小编给大家分享一下C#中如何使用NPOI将List数据导出到Excel文档的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。...
    99+
    2023-06-29
  • Python数据处理-导入导出excel数据
    目录一.xlwt库将数据导入Excel1.将数据写入一个Excel文件2.定制Excel表格样式3.元格对齐4.单元格的背景色5.单元格边框二、xlrd库读取Excel中的数据1.读...
    99+
    2022-11-13
  • React实现导入导出Excel文件
    目录表示层 业务层 核心插件xlsx excel 导入 excel 导出 excel 导出插件(js-export-excel) 实现效果结语 表示层 这里我是使用的是antd的U...
    99+
    2022-11-12
  • JavaScript实现excel文件导入导出
    目录一、需求场景描述1.此时前端上传解析excel文件可能更合适2.此时前端下载excel文件可能优雅一些二、实现思路分析1.导入excel文件实现思路分析2.导出excel文件实现...
    99+
    2022-11-13
  • Springboot实现导入导出Excel的方法
    目录一、添加poi的maven依赖二、自定义注解(Excel属性标题、位置等)三、CustomExcelUtils编写四、定义导出实体类五、Controller层代码编写一、添加po...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作