C# .NET8使用NPOI导出数据到Excel文件
C# .NET8使用NPOI导出数据到Excel文件网上找的C#例子,改良后分享给大家。
NPOIExportExcel 工具类
C# Code:
/// <summary>
/// NPOI导出数据到Excel文件
/// </summary>
/// <typeparam name="T"></typeparam>
public class NPOIExportExcel<T> where T : class
{
private readonly string _savePath;
private readonly bool _firstRowIsHeader;
private readonly List<T> _list;
private readonly ISheet _sheet;
private readonly IWorkbook _workbook;
private readonly List<Action<T, ICell>> _actions = new List<Action<T, ICell>>();
/// <summary>
/// NPOI工具构造器
/// </summary>
/// <param name="list">数据源</param>
/// <param name="excelfile">导出的excel文件</param>
/// <param name="firstRowIsHeader">首行是标题行</param>
public NPOIExportExcel(List<T> list, string excelfile, bool firstRowIsHeader)
{
_firstRowIsHeader = firstRowIsHeader;
_savePath = excelfile;
_list = list;
if (_list == null || _list.Count == 0)
{
throw new Exception("导出数据不能为空");
}
var file = new FileStream(_savePath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);
string fileExt = Path.GetExtension(excelfile).ToLower();
//XSSFWorkbook 适用XLSX格式,HSSFWorkbook 适用XLS格式
if (fileExt == ".xlsx")
{
_workbook = new XSSFWorkbook(file);
}
else if (fileExt == ".xls")
{
_workbook = new HSSFWorkbook(file);
}
else
{
throw new Exception("不支持的文件格式");
}
_sheet = _workbook.GetSheetAt(0);
}
/// <summary>
/// 添加列的取值逻辑及数据类型
/// </summary>
/// <param name="func">取值逻辑</param>
/// <returns></returns>
public NPOIExportExcel<T> AddField(Func<T, object> func, Type dataType)
{
_actions.Add((item, cell) =>
{
//取字段的值
var o = func(item);
if (o != null)
{
var value = System.ComponentModel.TypeDescriptor.GetConverter(dataType).ConvertFromString(o.ToString());
//SetCellValue方法仅支持的值类型
if (false) { }
else if (dataType == typeof(System.String)) cell.SetCellValue((String)value);
else if (dataType == typeof(Boolean)) cell.SetCellValue((Boolean)value);
else if (dataType == typeof(DateTime)) cell.SetCellValue((DateTime)value);
else if (dataType == typeof(Double)) cell.SetCellValue((Double)value);
}
else
{
cell.SetCellValue(String.Empty);
}
});
return this;
}
/// <summary>
/// 保存Excel
/// </summary>
public int Save()
{
int rowIndex = _firstRowIsHeader ? 1 : 0; //因为第一行是表头,特殊表头需要单独处理
foreach (var item in _list)
{
IRow row = _sheet.GetRow(rowIndex) ?? _sheet.CreateRow(rowIndex);
for (int i = 0; i < _actions.Count; i++)
{
ICell cell = row.GetCell(i) ?? row.CreateCell(i);
_actions[i](item, cell);
}
rowIndex++;
}
using (var fileStream = new FileStream(_savePath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite))
{
_workbook.Write(fileStream);
_workbook.Close();
}
return _list.Count;
}
}
//来源:C/S框架网 | www.csframework.com | QQ:23404761
/// NPOI导出数据到Excel文件
/// </summary>
/// <typeparam name="T"></typeparam>
public class NPOIExportExcel<T> where T : class
{
private readonly string _savePath;
private readonly bool _firstRowIsHeader;
private readonly List<T> _list;
private readonly ISheet _sheet;
private readonly IWorkbook _workbook;
private readonly List<Action<T, ICell>> _actions = new List<Action<T, ICell>>();
/// <summary>
/// NPOI工具构造器
/// </summary>
/// <param name="list">数据源</param>
/// <param name="excelfile">导出的excel文件</param>
/// <param name="firstRowIsHeader">首行是标题行</param>
public NPOIExportExcel(List<T> list, string excelfile, bool firstRowIsHeader)
{
_firstRowIsHeader = firstRowIsHeader;
_savePath = excelfile;
_list = list;
if (_list == null || _list.Count == 0)
{
throw new Exception("导出数据不能为空");
}
var file = new FileStream(_savePath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);
string fileExt = Path.GetExtension(excelfile).ToLower();
//XSSFWorkbook 适用XLSX格式,HSSFWorkbook 适用XLS格式
if (fileExt == ".xlsx")
{
_workbook = new XSSFWorkbook(file);
}
else if (fileExt == ".xls")
{
_workbook = new HSSFWorkbook(file);
}
else
{
throw new Exception("不支持的文件格式");
}
_sheet = _workbook.GetSheetAt(0);
}
/// <summary>
/// 添加列的取值逻辑及数据类型
/// </summary>
/// <param name="func">取值逻辑</param>
/// <returns></returns>
public NPOIExportExcel<T> AddField(Func<T, object> func, Type dataType)
{
_actions.Add((item, cell) =>
{
//取字段的值
var o = func(item);
if (o != null)
{
var value = System.ComponentModel.TypeDescriptor.GetConverter(dataType).ConvertFromString(o.ToString());
//SetCellValue方法仅支持的值类型
if (false) { }
else if (dataType == typeof(System.String)) cell.SetCellValue((String)value);
else if (dataType == typeof(Boolean)) cell.SetCellValue((Boolean)value);
else if (dataType == typeof(DateTime)) cell.SetCellValue((DateTime)value);
else if (dataType == typeof(Double)) cell.SetCellValue((Double)value);
}
else
{
cell.SetCellValue(String.Empty);
}
});
return this;
}
/// <summary>
/// 保存Excel
/// </summary>
public int Save()
{
int rowIndex = _firstRowIsHeader ? 1 : 0; //因为第一行是表头,特殊表头需要单独处理
foreach (var item in _list)
{
IRow row = _sheet.GetRow(rowIndex) ?? _sheet.CreateRow(rowIndex);
for (int i = 0; i < _actions.Count; i++)
{
ICell cell = row.GetCell(i) ?? row.CreateCell(i);
_actions[i](item, cell);
}
rowIndex++;
}
using (var fileStream = new FileStream(_savePath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite))
{
_workbook.Write(fileStream);
_workbook.Close();
}
return _list.Count;
}
}
//来源:C/S框架网 | www.csframework.com | QQ:23404761
使用方法
C# Code:
var listTmp = _BLL.GetSource();
var targetFile = @"c:\abc.xlsx";
//导出数据
var export = new NPOIExportExcel<ImportLanguageData_DataModel>(listTmp, targetFile, true);
var rows = export.AddField(x => x.ObjectID, typeof(String))
.AddField(x => x.ObjectType, typeof(String))
.AddField(x => x.SourceLanType, typeof(String))
.AddField(x => x.SourceLanData, typeof(String))
.AddField(x => x.TargetLanType, typeof(String))
.AddField(x => x.TargetLanData, typeof(String))
.Save();
//来源:C/S框架网 | www.csframework.com | QQ:23404761
var targetFile = @"c:\abc.xlsx";
//导出数据
var export = new NPOIExportExcel<ImportLanguageData_DataModel>(listTmp, targetFile, true);
var rows = export.AddField(x => x.ObjectID, typeof(String))
.AddField(x => x.ObjectType, typeof(String))
.AddField(x => x.SourceLanType, typeof(String))
.AddField(x => x.SourceLanData, typeof(String))
.AddField(x => x.TargetLanType, typeof(String))
.AddField(x => x.TargetLanData, typeof(String))
.Save();
//来源:C/S框架网 | www.csframework.com | QQ:23404761
导出数据的Excel文件


参考文档:
EFCore+.NET8:使用Oracle数据库提交大图片文件需要指定BLOB类型|C/S开发框架
C#使用SqlBulkCopy快速导入Excel文件(xls/xlsx)-C/S开发框架
C#导出数据到Excel 源码大全
CSFrameworkV6旗舰版 | 导入导出Excel文件数据开发教程|C/S开发框架
OLEDB创建DbConnection连接Excel文件报错:未在本地计算机上注册ACE.OLEDB
解决方案:FastReport.NET导出Excel文件单元格的数据空白
C#操作Excel合并多个Excel文件
ORACLE 使用 expdp 命令导出dmp数据库文件|C/S开发框架
使用.NET8/EFCore访问达梦数据库|C/S框架网|C/S开发框架
使用Winform代码生成器生成FastReport.NET报表模板文件(frx文件)
C# ASP.NET使用ashx一般处理程序实现上传文件功能-C/S开发框架
C#多线程使用读写锁ReaderWriterLockSlim同步写入文件-C/S开发框架
在基类窗体扩展一个通用导出Excel文件的按钮(支持导出所有表格的数据到Xlsx文件)
C# Excel xls文件导入程序Excel数据库通用类XlsFileDB
C#读取Excel文件提示:未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”
C#使用Multipart form-data方式上传文件及提交其他数据
EFCore+.NET8:使用Oracle数据库提交大图片文件需要指定BLOB类型|C/S开发框架
C#使用SqlBulkCopy快速导入Excel文件(xls/xlsx)-C/S开发框架
C#导出数据到Excel 源码大全
CSFrameworkV6旗舰版 | 导入导出Excel文件数据开发教程|C/S开发框架
OLEDB创建DbConnection连接Excel文件报错:未在本地计算机上注册ACE.OLEDB
解决方案:FastReport.NET导出Excel文件单元格的数据空白
C#操作Excel合并多个Excel文件
ORACLE 使用 expdp 命令导出dmp数据库文件|C/S开发框架
使用.NET8/EFCore访问达梦数据库|C/S框架网|C/S开发框架
使用Winform代码生成器生成FastReport.NET报表模板文件(frx文件)
C# ASP.NET使用ashx一般处理程序实现上传文件功能-C/S开发框架
C#多线程使用读写锁ReaderWriterLockSlim同步写入文件-C/S开发框架
在基类窗体扩展一个通用导出Excel文件的按钮(支持导出所有表格的数据到Xlsx文件)
C# Excel xls文件导入程序Excel数据库通用类XlsFileDB
C#读取Excel文件提示:未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”
C#使用Multipart form-data方式上传文件及提交其他数据
其它资料:
什么是C/S结构? | C/S框架核心组成部分 | C/S框架-WebService部署图 | C/S框架-权限管理 | C/S结构系统框架 - 5.1旗舰版介绍 | C/S结构系统框架 - 功能介绍 | C/S结构系统框架 - 产品列表 | C/S结构系统框架 - 应用展示(图) | 三层体系架构详解 | C/S架构轻量级快速开发框架 | C/S框架网客户案例 | WebApi快速开发框架 | C/S框架代码生成器 | 用户授权注册软件系统 | 版本自动升级软件 | 数据库底层应用框架 | CSFramework.CMS内容管理系统 |
什么是C/S结构? | C/S框架核心组成部分 | C/S框架-WebService部署图 | C/S框架-权限管理 | C/S结构系统框架 - 5.1旗舰版介绍 | C/S结构系统框架 - 功能介绍 | C/S结构系统框架 - 产品列表 | C/S结构系统框架 - 应用展示(图) | 三层体系架构详解 | C/S架构轻量级快速开发框架 | C/S框架网客户案例 | WebApi快速开发框架 | C/S框架代码生成器 | 用户授权注册软件系统 | 版本自动升级软件 | 数据库底层应用框架 | CSFramework.CMS内容管理系统 |
在线客服
