C#使用NOPI库实现导入Excel文档
作者:易墨 时间:2022-12-23 07:56:28
使用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
0
投稿
猜你喜欢
一文带你全面了解Java Hashtable
2021-09-19 01:39:39
简单谈谈java自定义注解
2021-07-21 18:40:53
总结Java对象被序列化的两种方法
2023-05-11 09:46:52
C#事件(event)使用方法详解
2023-12-24 14:35:05
解决idea 暂存文件或idea切换分支代码丢失的问题
2023-09-11 07:52:41
OpenGL实现Bezier曲线的方法示例
2023-06-30 05:06:22
基于Java实现简单贪吃蛇游戏
2022-08-07 02:09:44
springboot整合shiro多验证登录功能的实现(账号密码登录和使用手机验证码登录)
2023-05-25 18:53:29
Idea自动生成Entity实现过程详解
2022-06-03 12:18:24
java多线程并发中使用Lockers类将多线程共享资源锁定
2021-11-14 11:08:37
IDEA远程管理docker镜像及容器服务的实现
2022-01-07 16:26:48
Java实现读取文章中重复出现的中文字符串
2022-04-27 04:29:05
springboot中通过lua脚本来获取序列号的方法
2023-05-05 04:25:44
C#结束进程及子进程
2021-06-22 15:18:10
Java实现贪吃蛇游戏(1小时学会)
2023-06-29 00:54:02
Android仿QQ圆形头像个性名片
2021-08-24 02:40:46
Android自定义textview实现竖直滚动跑马灯效果
2023-09-30 07:42:05
C#实现炫酷启动图-动态进度条效果
2022-01-04 22:22:10
C#设计模式之Mediator中介者模式解决程序员的七夕缘分问题示例
2021-10-05 16:28:14
C#实现导出List数据到xml文件的方法【附demo源码下载】
2022-02-13 10:32:14