C#使用NOPI库实现导入Excel文档
发布时间 - 2026-01-11 00:57:42 点击率:次使用NOPI导入Excel文档

NOPI版本:2.3.0,依赖于NPOI的SharpZipLib版本:0.86,经测试适用于.net4.0+
记录遇到的几个问题
1.NOPI中的IWorkbook接口:xls使用HSSFWorkbook类实现,xlsx使用XSSFWorkbook类实现
2.日期转换,判断row.GetCell(j).CellType == NPOI.SS.UserModel.CellType.Numeric && HSSFDateUtil.IsCellDateFormatted(row.GetCell(j)
不能直接使用row.GetCell(j).DateCellValue,这玩意会直接抛出异常来~
1. 将文件流转换为DataTable
/// <summary>
/// 根据Excel格式读取Excel
/// </summary>
/// <param name="stream">文件流</param>
/// <param name="type">Excel格式枚举类型,xls/xlsx</param>
/// <param name="sheetName">表名,默认取第一张</param>
/// <returns>DataTable</returns>
private static DataTable ImportExcel(Stream stream, ExcelExtType type, string sheetName)
{
DataTable dt = new DataTable();
IWorkbook workbook;
try
{
//xls使用HSSFWorkbook类实现,xlsx使用XSSFWorkbook类实现
switch (type)
{
case ExcelExtType.xlsx:
workbook = new XSSFWorkbook(stream);
break;
default:
workbook = new HSSFWorkbook(stream);
break;
}
ISheet sheet = null;
//获取工作表 默认取第一张
if (string.IsNullOrWhiteSpace(sheetName))
sheet = workbook.GetSheetAt(0);
else
sheet = workbook.GetSheet(sheetName);
if (sheet == null)
return null;
IEnumerator rows = sheet.GetRowEnumerator();
#region 获取表头
IRow headerRow = sheet.GetRow(0);
int cellCount = headerRow.LastCellNum;
for (int j = 0; j < cellCount; j++)
{
ICell cell = headerRow.GetCell(j);
if (cell != null)
{
dt.Columns.Add(cell.ToString());
}
else
{
dt.Columns.Add("");
}
}
#endregion
#region 获取内容
for (int i = (sheet.FirstRowNum + 1); i <= sheet.LastRowNum; i++)
{
IRow row = sheet.GetRow(i);
DataRow dataRow = dt.NewRow();
for (int j = row.FirstCellNum; j < cellCount; j++)
{
if (row.GetCell(j) != null)
{
//判断单元格是否为日期格式
if (row.GetCell(j).CellType == NPOI.SS.UserModel.CellType.Numeric && HSSFDateUtil.IsCellDateFormatted(row.GetCell(j)))
{
if (row.GetCell(j).DateCellValue.Year >=1970)
{
dataRow[j] = row.GetCell(j).DateCellValue.ToString();
}
else
{
dataRow[j] = row.GetCell(j).ToString();
}
}
else
{
dataRow[j] = row.GetCell(j).ToString();
}
}
}
dt.Rows.Add(dataRow);
}
#endregion
}
catch (Exception ex)
{
dt=null;
}
finally
{
//if (stream != null)
//{
// stream.Close();
// stream.Dispose();
//}
}
return dt;
}
2. 文件上载导入
/// <summary>
/// 上传Excel导入
/// </summary>
/// <param name="file">上载文件对象</param>
/// <param name="errorMsg">错误信息</param>
/// <param name="sheetName">表名,默认取第一张</param>
/// <returns></returns>
public static DataTable Import(System.Web.HttpPostedFileBase file, ref string errorMsg, string sheetName = "")
{
if (file == null || file.InputStream == null || file.InputStream.Length == 0)
{
errorMsg = "请选择要导入的Excel文件";
return null;
}
var excelType = GetExcelFileType(file.FileName);
if (excelType == null)
{
errorMsg = "请选择正确的Excel文件";
return null;
}
using (var stream = new MemoryStream())
{
file.InputStream.Position = 0;
file.InputStream.CopyTo(stream);
var dt = ImportExcel(stream, excelType.Value, sheetName);
if (dt == null)
errorMsg = "导入失败,请选择正确的Excel文件";
return dt;
}
}
3. 本地路径读取导入
/// <summary>
/// 根据文件路径导入Excel
/// </summary>
/// <param name="filePath"></param>
/// <param name="errorMsg">错误信息</param>
/// <param name="sheetName">表名,默认取第一张</param>
/// <returns>可能为null的DataTable</returns>
public static DataTable Import(string filePath, ref string errorMsg, string sheetName = "")
{
var excelType = GetExcelFileType(filePath);
if (GetExcelFileType(filePath) == null)
{
errorMsg = "请选择正确的Excel文件";
return null;
}
if (!File.Exists(filePath))
{
errorMsg = "没有找到要导入的Excel文件";
return null;
}
DataTable dt;
using (var stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
dt = ImportExcel(stream, excelType.Value, sheetName);
}
if (dt == null)
errorMsg = "导入失败,请选择正确的Excel文件";
return dt;
}
4.完整demo
附赠一个winform导入Excel的Demo。
https://github.com/yimogit/NopiExcelDemo
# nopi
# 导入
# excel
# npoi实现excel导入导出
# C#导入导出Excel数据的两种方法
# 让C# Excel导入导出 支持不同版本Office
# C#导入导出EXCEL文件的代码实例
# C#数据导入/导出Excel文件及winForm导出Execl总结
# C# Winform实现导入和导出Excel文件
# C#的Excel导入、导出
# C#使用NPOI导入Excel的方法详解
# C#实现Excel表数据导入Sql Server数据库中的方法
# C#数据导入到EXCEL的方法
# C#使用NPOI实现Excel导入导出功能
# 请选择
# 第一张
# 错误信息
# 适用于
# 能为
# 没有找到
# 抛出
# 单元格
# 上传
# 文档
# 依赖于
# ImportExcel
# static
# returns
# private
# gt
# summary
# dt
# param
# sheetName
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
非常酷的网站设计制作软件,酷培ai教育官方网站?
教你用AI润色文章,让你的文字表达更专业
Laravel如何实现密码重置功能_Laravel密码找回与重置流程
图册素材网站设计制作软件,图册的导出方式有几种?
javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】
Laravel如何与Pusher实现实时通信?(WebSocket示例)
济南网站建设制作公司,室内设计网站一般都有哪些功能?
如何破解联通资金短缺导致的基站建设难题?
使用Dockerfile构建java web环境
Android使用GridView实现日历的简单功能
Laravel如何设置自定义的日志文件名_Laravel根据日期或用户ID生成动态日志【技巧】
猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?
Win11应用商店下载慢怎么办 Win11更改DNS提速下载【修复】
Laravel怎么上传文件_Laravel图片上传及存储配置
Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理
Laravel怎么连接多个数据库_Laravel多数据库连接配置
Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧
Laravel怎么清理缓存_Laravel optimize clear命令详解
Laravel如何自定义分页视图?(Pagination示例)
如何在腾讯云服务器快速搭建个人网站?
Python数据仓库与ETL构建实战_Airflow调度流程详解
如何快速搭建个人网站并优化SEO?
Laravel如何处理异常和错误?(Handler示例)
如何在万网ECS上快速搭建专属网站?
如何在自有机房高效搭建专业网站?
如何在万网自助建站平台快速创建网站?
如何在企业微信快速生成手机电脑官网?
如何快速启动建站代理加盟业务?
胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?
SQL查询语句优化的实用方法总结
Python自动化办公教程_ExcelWordPDF批量处理案例
php在windows下怎么调试_phpwindows环境调试操作说明【操作】
进行网站优化必须要坚持的四大原则
如何安全更换建站之星模板并保留数据?
如何确保西部建站助手FTP传输的安全性?
nginx修改上传文件大小限制的方法
如何有效防御Web建站篡改攻击?
Laravel如何使用Laravel Vite编译前端_Laravel10以上版本前端静态资源管理【教程】
Laravel如何生成API文档?(Swagger/OpenAPI教程)
黑客入侵网站服务器的常见手法有哪些?
Linux虚拟化技术教程_KVMQEMU虚拟机安装与调优
Laravel的Blade指令怎么自定义_创建你自己的Laravel Blade Directives
Windows家庭版如何开启组策略(gpedit.msc)?(安装方法)
Laravel如何实现全文搜索功能?(Scout和Algolia示例)
如何在腾讯云服务器上快速搭建个人网站?
Laravel如何使用Scope本地作用域_Laravel模型常用查询逻辑封装技巧【手册】
如何打造高效商业网站?建站目的决定转化率
大学网站设计制作软件有哪些,如何将网站制作成自己app?
成都网站制作公司哪家好,四川省职工服务网是做什么用?
清除minerd进程的简单方法

