首先在项目中引用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);

以上基本实现WEB通过NPOI操作Excel数据导入导出的功能。其他可自行研究。

C#NPOI操作Excel,实现Excel数据导入导出(支持多个sheet)的更多相关文章

  1. 1、数据库与excel表格的数据导入导出

    1.居民用户界面中,excel数据导入导出: 2.其他5张表数据显示到本角色主页的container容器中.

  2. java中 Excel表实现数据导入导出

    需要引入依赖: <!-- https://mvnrepository.com/artifact/org.apache.poi/poi --> <dependency> < ...

  3. SQL SERVER 与ACCESS、EXCEL的数据导入导出转换

    * 说明:复制表(只复制结构,源表名:a 新表名:b)      select * into b from a where 1<>1 * 说明:拷贝表(拷贝数据,源表名:a 目标表名:b) ...

  4. 使用openpyxl模块将Excel中的数据导入数据库

    这里将不介绍openpyxl模块的详细操作. 主要就是记录一个使用openpyxl模块将Excel表格的数据导入数据库中的实例. from openpyxl import load_workbook ...

  5. SQL SERVER 和ACCESS、EXCEL的数据导入导出

    SQL SERVER 与ACCESS.EXCEL之间的数据转换SQL SERVER 和ACCESS的数据导入导出[日期:2007-05-06]     来源:Linux公社  作者:Linux 熟 悉 ...

  6. ThinkPHP使用PHPExcel实现Excel数据导入导出完整实例

    这篇文章主要介绍了ThinkPHP使用PHPExcel实现Excel数据导入导出,非常实用的功能,需要的朋友可以参考下 本文所述实例是使用在Thinkphp的开发框架上,要是使用在其他框架也是同样的方 ...

  7. jsp+servlet上传excel并将数据导入到数据库表的实现方法

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  8. 使用Python将Excel中的数据导入到MySQL

    使用Python将Excel中的数据导入到MySQL 工具 Python 2.7 xlrd MySQLdb 安装 Python 对于不同的系统安装方式不同,Windows平台有exe安装包,Ubunt ...

  9. 图解如何 将Excel里的数据导入到sql server数据库中

    项目中,经常会碰到如何将Excel里的数据导入到sql server中的问题. 下面,图解如何实现导入Excel中的数据到sql server 2008 R2: Excel截图如下: 查询pub数据库 ...

  10. ssm框架之将数据库的数据导入导出为excel文件

    在这里首先我要将自己遇到的各种问题,以及需求记录下来,做一个备忘,便于以后查看: 需求:主要实现两个功能,将oracle数据库里的数据导出为excel,同时需要将excel表格的数据导入到数据库 环境 ...

随机推荐

  1. Python基础之数据库:5、创建表的完整语法、MySQL数据类型

    一.创建表的完整语法 1.创建表的语法 create table 表名( ​ 字段名1 字段类型(数字) 约束条件, ​ 字段名2 字段类型(数字) 约束条件, ​ 字段名3 字段类型(数字) 约束条 ...

  2. Java锁的逻辑(结合对象头和ObjectMonitor)

    我们都知道在Java编程中多线程的同步使用synchronized关键字来标识,那么这个关键字在JVM底层到底是如何实现的呢. 我们先来思考一下如果我们自己实现的一个锁该怎么做呢: 首先肯定要有个标记 ...

  3. day25 前端

    https://www.dcloud.io/hbuilderx.html 下载HbuilderX,直接解压缩双击打开 html5 <!DOCTYPE html><!-- 文档类型,声 ...

  4. Google Chrome(谷歌浏览器)安装使用

    谷歌浏览器官网https://www.google.cn/chrome/ Chrome是由Google开发的一款简单便捷的网页浏览工具.谷歌浏览器(Google Chrome)可以提帮助你快速.安全的 ...

  5. SQL语句查询关键字 多表查询

    目录 SQL语句查询关键字 select from 编写顺序和查询数据 前期数据准备 编写SQL语句的小技巧 查询关键字之筛选 where 逻辑运算符 not and or between not b ...

  6. SQLMap入门——判断文本中的请求是否存在注入

    从文件中加载HTTP请求,SQLMap可以从一个文本文件中获取HTTP请求,这样就可以不设置其他参数(如cookie.POST数据等),txt文件中的内容为Web数据包 文本文件如图(请求数据可以通过 ...

  7. IE浏览器卸载

    1.打开此电脑,点击上箭头,打开控制面板: 2.选择卸载程序: 3.点击启用或关闭Windows功能: 4.弹出Windows功能对话框,找到Inetrnet Explorer 11,取消勾选: 5. ...

  8. 【FAQ】申请Health Kit权限的常见问题及解答

    华为运动健康服务(HUAWEI Health Kit)提供原子化数据开放,用户数据被授权获取后,应用可通过接口访问运动健康数据,对相关数据进行增.删.改.查等操作.这篇文章汇总了申请开通Health ...

  9. python 之用户自定义函数

    什么是函数? 函数无非就是将代码块进行封装,想用的时候拿来用,减少代码量,提高效率. 函数的定义 定义一个函数需要: 1.def关键字,def 后面空一格输入函数名称,函数命名时尽量简短,且具有意义, ...

  10. 微信小程序地区和location_id对应关系

    点击查看代码 location_list = [ {'location_id': '101010100', 'location_name': ['北京', '北京', '北京']}, {'locati ...