使用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
相关文章:
浙江网站制作公司有哪些,浙江栢塑信息技术有限公司定制网站做的怎么样?
,想在网上投简历,哪几个网站比较好?
宿州网站制作公司兴策,安徽省低保查询网站?
如何选择长沙网站建站模板?H5响应式与品牌定制哪个更优?
网站网页制作电话怎么打,怎样安装和使用钉钉软件免费打电话?
小型网站建站如何选择虚拟主机?
韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐
建站之星后台管理如何实现高效配置?
如何选购建站域名与空间?自助平台全解析
网站制作需要会哪些技术,建立一个网站要花费多少?
教育培训网站制作流程,请问edu教育网站的域名怎么申请?
c# 在高并发场景下,委托和接口调用的性能对比
网站图片在线制作软件,怎么在图片上做链接?
广州建站公司哪家好?十大优质服务商推荐
历史网站制作软件,华为如何找回被删除的网站?
网站制作价目表怎么做,珍爱网婚介费用多少?
定制建站模板如何实现SEO优化与智能系统配置?18字教程
安云自助建站系统如何快速提升SEO排名?
赚钱网站制作软件,建一个网站怎样才能赚钱?是如何盈利的?
制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?
制作网站外包平台,自动化接单网站有哪些?
如何用景安虚拟主机手机版绑定域名建站?
如何在橙子建站上传落地页?操作指南详解
建站主机数据库如何配置才能提升网站性能?
网站制作公司,橙子建站是合法的吗?
如何制作一个表白网站视频,关于勇敢表白的小标题?
网站制作企业,网站的banner和导航栏是指什么?
建站之星如何快速生成多端适配网站?
太原网站制作公司有哪些,网约车营运证查询官网?
网站代码制作软件有哪些,如何生成自己网站的代码?
制作电商网页,电商供应链怎么做?
建站主机解析:虚拟主机配置与服务器选择指南
b2c电商网站制作流程,b2c水平综合的电商平台?
一键网站制作软件,义乌购一件代发流程?
XML的“混合内容”是什么 怎么用DTD或XSD定义
javascript中的try catch异常捕获机制用法分析
建站之星IIS配置教程:代码生成技巧与站点搭建指南
购物网站制作公司有哪些,哪个购物网站比较好?
实惠建站价格推荐:2025年高性价比自助建站套餐解析
定制建站流程步骤详解:一站式方案设计与开发指南
实现点击下箭头变上箭头来回切换的两种方法【推荐】
如何快速生成ASP一键建站模板并优化安全性?
如何快速搭建FTP站点实现文件共享?
如何在Golang中处理模块冲突_解决依赖版本不兼容问题
移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?
建站VPS能否同时实现高效与安全翻墙?
如何在云指建站中生成FTP站点?
免费ppt制作网站,有没有值得推荐的免费PPT网站?
如何在阿里云ECS服务器部署织梦CMS网站?
网站企业制作流程,用什么语言做企业网站比较好?
*请认真填写需求信息,我们会在24小时内与您取得联系。