C#NPOI操作Excel,实现Excel数据导入导出(支持多个sheet)
首先在项目中引用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、数据库与excel表格的数据导入导出
1.居民用户界面中,excel数据导入导出: 2.其他5张表数据显示到本角色主页的container容器中.
- java中 Excel表实现数据导入导出
需要引入依赖: <!-- https://mvnrepository.com/artifact/org.apache.poi/poi --> <dependency> < ...
- SQL SERVER 与ACCESS、EXCEL的数据导入导出转换
* 说明:复制表(只复制结构,源表名:a 新表名:b) select * into b from a where 1<>1 * 说明:拷贝表(拷贝数据,源表名:a 目标表名:b) ...
- 使用openpyxl模块将Excel中的数据导入数据库
这里将不介绍openpyxl模块的详细操作. 主要就是记录一个使用openpyxl模块将Excel表格的数据导入数据库中的实例. from openpyxl import load_workbook ...
- SQL SERVER 和ACCESS、EXCEL的数据导入导出
SQL SERVER 与ACCESS.EXCEL之间的数据转换SQL SERVER 和ACCESS的数据导入导出[日期:2007-05-06] 来源:Linux公社 作者:Linux 熟 悉 ...
- ThinkPHP使用PHPExcel实现Excel数据导入导出完整实例
这篇文章主要介绍了ThinkPHP使用PHPExcel实现Excel数据导入导出,非常实用的功能,需要的朋友可以参考下 本文所述实例是使用在Thinkphp的开发框架上,要是使用在其他框架也是同样的方 ...
- jsp+servlet上传excel并将数据导入到数据库表的实现方法
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...
- 使用Python将Excel中的数据导入到MySQL
使用Python将Excel中的数据导入到MySQL 工具 Python 2.7 xlrd MySQLdb 安装 Python 对于不同的系统安装方式不同,Windows平台有exe安装包,Ubunt ...
- 图解如何 将Excel里的数据导入到sql server数据库中
项目中,经常会碰到如何将Excel里的数据导入到sql server中的问题. 下面,图解如何实现导入Excel中的数据到sql server 2008 R2: Excel截图如下: 查询pub数据库 ...
- ssm框架之将数据库的数据导入导出为excel文件
在这里首先我要将自己遇到的各种问题,以及需求记录下来,做一个备忘,便于以后查看: 需求:主要实现两个功能,将oracle数据库里的数据导出为excel,同时需要将excel表格的数据导入到数据库 环境 ...
随机推荐
- zephyr的GPIOTE驱动开发记录——基于nordic的NCS
简介: 本次测试了zephyr的中断驱动方式(GPIOTE),在这可以去看zephyr的官方文档对zephyr的中断定义,连接如下,Interrupts - Zephyr Project Docume ...
- 【iOS逆向】某营业厅算法分析
阅读此文档的过程中遇到任何问题,请关注公众号[移动端Android和iOS开发技术分享]或加QQ群[812546729] 1.目标 使用frida stalker分析某营业厅的签名算法. 2.操作环境 ...
- VMware 虚拟机打开电源失败
vmware上虚拟机关机导出ovf失败后,再次启动虚拟机,突然无法打开虚拟机,并伴随如下报错: 模块"disk"打开电源失败,无法打开磁盘/***/.../***.vmdk 解决方 ...
- 1759D(数位变0)
题目链接 题目大意: 给你两个整数n, m.你需要求一个数,它满足如下条件: 是n的整数倍,且倍数小于m. 你应该使其末尾的0尽可能的多(如100后面有2个零,1020后面有一个零,我们应该输出100 ...
- i春秋exec
打开是一个gif,提示文字未登录 话不多说,查看源码 发现vim字样,可能是文件泄露 直接在url后加/.index.php.swp来下载泄露文件 下载好了之后放vm上使用vim -r .index ...
- 在服务器上搭建Jenkins自动化部署工具
在公司发现很多时候都需要手动部署,然后有天听到自动部署这个词想着有没有什么工具能够自动部署项目,最好能自动化部署前后端生成 docker images 运行方便管理.最后经过我各种筛查,发现用 jen ...
- C++编程笔记(多线程学习)
目录 一.线程创建 二.线程的相关操作 2.1 join 2.2 detach 2.3 joinable 三.线程参数 3.1传参所引发的资源回收问题 3.2 将对象的成员函数作为入口函数 四.线程的 ...
- vulnhub靶场渗透实战12-driftingblues2
vbox导入,网络桥接. 靶机下载地址:https://download.vulnhub.com/driftingblues/driftingblues2.ova 一:信息收集 1:主机发现. 2: ...
- js修改数组中的属性名
将数组 [{id:"1",name:"AAA"}] 修改为 ===> [{id:"1",text:"AAA",va ...
- 解决MVVMLight导航VM不重置问题
问题阐述:使用MVVMLight导航发现导航后VM里面的数据并未进行重置,需要界面跳转后,历史VM也进行销毁重置,并释放 解决办法: 方法一:在当前界面进行Unloaded进行VM注销并进行重新注入代 ...