using System.Collections.Generic;
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using System.IO;
using System.Data;
using System; namespace CommonHelper
{
public class ExcelHelper
{ public ExcelHelper() { } /// <summary>
/// 文件流初始化对象
/// </summary>
/// <param name="stream"></param>
public ExcelHelper(Stream stream)
{
_IWorkbook = CreateWorkbook(stream);
} /// <summary>
/// 传入文件名
/// </summary>
/// <param name="fileName"></param>
public ExcelHelper(string fileName)
{
using (FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read))
{
_IWorkbook = CreateWorkbook(fileStream);
}
} /// <summary>
/// 工作薄
/// </summary>
private IWorkbook _IWorkbook; /// <summary>
/// 创建工作簿对象
/// </summary>
/// <param name="stream"></param>
/// <returns></returns>
private IWorkbook CreateWorkbook(Stream stream)
{
try
{
return new XSSFWorkbook(stream); //
}
catch
{
return new HSSFWorkbook(stream); //
} } /// <summary>
/// 把Sheet中的数据转换为DataTable
/// </summary>
/// <param name="sheet"></param>
/// <returns></returns>
private DataTable ExportToDataTable(ISheet sheet)
{
DataTable dt = new DataTable(); //默认,第一行是字段
IRow headRow = sheet.GetRow(); //设置datatable字段
for (int i = headRow.FirstCellNum, len = headRow.LastCellNum; i < len; i++)
{
dt.Columns.Add(headRow.Cells[i].StringCellValue);
}
//遍历数据行
for (int i = (sheet.FirstRowNum + ), len = sheet.LastRowNum + ; i < len; i++)
{
IRow tempRow = sheet.GetRow(i);
DataRow dataRow = dt.NewRow(); //遍历一行的每一个单元格
for (int r = , j = tempRow.FirstCellNum, len2 = tempRow.LastCellNum; j < len2; j++, r++)
{ ICell cell = tempRow.GetCell(j); if (cell != null)
{
switch (cell.CellType)
{
case CellType.STRING:
dataRow[r] = cell.StringCellValue;
break;
case CellType.NUMERIC:
dataRow[r] = cell.NumericCellValue;
break;
case CellType.BOOLEAN:
dataRow[r] = cell.BooleanCellValue;
break;
default: dataRow[r] = "ERROR";
break;
}
}
}
dt.Rows.Add(dataRow);
}
return dt;
} /// <summary>
/// Sheet中的数据转换为List集合
/// </summary>
/// <param name="sheet"></param>
/// <param name="fields"></param>
/// <returns></returns>
private IList<T> ExportToList<T>(ISheet sheet,string[] fields) where T:class,new()
{
IList<T> list = new List<T>(); //遍历每一行数据
for (int i = sheet.FirstRowNum + , len = sheet.LastRowNum + ; i < len; i++)
{
T t=new T();
IRow row = sheet.GetRow(i); for (int j = , len2 = fields.Length; j < len2; j++)
{
ICell cell=row.GetCell(j);
object cellValue= null; switch (cell.CellType)
{
case CellType.STRING: //文本
cellValue = cell.StringCellValue;
break;
case CellType.NUMERIC: //数值
cellValue =Convert.ToInt32(cell.NumericCellValue);//Double转换为int
break;
case CellType.BOOLEAN: //bool
cellValue = cell.BooleanCellValue;
break;
case CellType.BLANK: //空白
cellValue = "";
break;
default: cellValue = "ERROR";
break;
} typeof(T).GetProperty(fields[j]).SetValue(t,cellValue,null);
}
list.Add(t);
} return list;
} /// <summary>
/// 获取第一个Sheet的第X行,第Y列的值。起始点为1
/// </summary>
/// <param name="X">行</param>
/// <param name="Y">列</param>
/// <returns></returns>
public string GetCellValue(int X, int Y)
{
ISheet sheet = _IWorkbook.GetSheetAt(); IRow row = sheet.GetRow(X-); return row.GetCell(Y-).ToString();
} /// <summary>
/// 获取一行的所有数据
/// </summary>
/// <param name="X">第x行</param>
/// <returns></returns>
public string[] GetCells(int X)
{
List<string> list = new List<string>(); ISheet sheet = _IWorkbook.GetSheetAt(); IRow row = sheet.GetRow(X-); for (int i = , len = row.LastCellNum; i < len; i++)
{
list.Add(row.GetCell(i).StringCellValue);//这里没有考虑数据格式转换,会出现bug
}
return list.ToArray();
} /// <summary>
/// 第一个Sheet数据,转换为DataTable
/// </summary>
/// <returns></returns>
public DataTable ExportExcelToDataTable()
{
return ExportToDataTable(_IWorkbook.GetSheetAt());
} /// <summary>
/// 第sheetIndex表数据,转换为DataTable
/// </summary>
/// <param name="sheetIndex">第几个Sheet,从1开始</param>
/// <returns></returns>
public DataTable ExportExcelToDataTable(int sheetIndex)
{
return ExportToDataTable(_IWorkbook.GetSheetAt(sheetIndex-));
} /// <summary>
/// Excel中默认第一张Sheet导出到集合
/// </summary>
/// <param name="fields">Excel各个列,依次要转换成为的对象字段名称</param>
/// <returns></returns>
public IList<T> ExcelToList<T>(string[] fields) where T:class,new ()
{
return ExportToList<T>(_IWorkbook.GetSheetAt(),fields);
} /// <summary>
/// Excel中指定的Sheet导出到集合
/// </summary>
/// <param name="sheetIndex">第几张Sheet,从1开始</param>
/// <param name="fields">Excel各个列,依次要转换成为的对象字段名称</param>
/// <returns></returns>
public IList<T> ExcelToList<T>(int sheetIndex,string[] fields) where T:class,new()
{
return ExportToList<T>(_IWorkbook.GetSheetAt(sheetIndex-), fields);
} }
}

npoi导出excel 导出List<T>的更多相关文章

  1. 并发编程概述 委托(delegate) 事件(event) .net core 2.0 event bus 一个简单的基于内存事件总线实现 .net core 基于NPOI 的excel导出类,支持自定义导出哪些字段 基于Ace Admin 的菜单栏实现 第五节:SignalR大杂烩(与MVC融合、全局的几个配置、跨域的应用、C/S程序充当Client和Server)

    并发编程概述   前言 说实话,在我软件开发的头两年几乎不考虑并发编程,请求与响应把业务逻辑尽快完成一个星期的任务能两天完成绝不拖三天(剩下时间各种浪),根本不会考虑性能问题(能接受范围内).但随着工 ...

  2. C#中用NPOI的excel导出

    //机构表导出 private static List<User2> amininf = new BLL.Bll().GetUser2s(); //定义数据源导出对象 #region 导出 ...

  3. C# 实现NPOI的Excel导出

    技术点: 1.自定义attribute属性 2.通过反射取类及其属性的attribute属性值 3.NPOI包常用属性及方法(我也仅仅知道用到过的,陌生的要么见名知意,要么百度查) 实现功能点: Li ...

  4. WPF 导出Excel 导出图片

    /// <summary> /// 导出Excel /// </summary> private void ExportExcel(DataTable ExcelDt) { / ...

  5. yii2 数据导出 excel导出以及导出数据时列超过26列时解决办法

    作者:白狼 出处:http://www.manks.top/article/yii2_excel_extension​ 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给 ...

  6. PowerBuilder中调用NPOI进行Excel导出格式设置示例

    // 功能 :新建excel带边框的单元格,格式为数字并显示为美元货币 // 参数 :ai_row,行号:ai_col,列号 // 返回值 :true/false // 作者 :潮崖之飔 // 日期 ...

  7. C#导出Excel那些事

    Excel导出 Excel导出的意义 因为在项目中有些报表数据客户需要导出功能,那么导出为Excel就十分有必要了,可是有些客户的机器上并没有安装Excel或者安装的版本参差不一.那么我们在这样的情况 ...

  8. .NET Excel导出方法及其常见问题详解

    摘要:.NET Excel导出方法及其常见问题详解. 一.Excel导出的实现方法 在.net 程序开发中,对于Excel文件的导出我们一共有三种导出方式: 利用文件输出流进行读写操作 这种方式的导出 ...

  9. 导入/导出Excel

    --从Excel文件中,导入数据到SQL数据库中,很简单,直接用下面的语句:/*============================================================ ...

随机推荐

  1. python flask豆瓣微信小程序案例

    项目步骤 定义首页模板index.html <!DOCTYPE html> <html lang="en"> <head> <meta c ...

  2. Android Studio的Log日志调试

    本人菜鸟一枚,极大发挥了搜索的功能.现记录一番,以备后患. 用断点真的很烦,因为之前写linux的时候,就是用最蠢但是也是挺有帮助的printf()来进行调试. 其实用Log输出日志的原理也是差不多的 ...

  3. anr trace文件分析

    测试给的trace文件好几万行,怎么看? 1.搜索 你的包名,看它报错误报在你代码的哪里 2.在你代码里面分析 还有,synchronized 就是用来防止多线程调用的,没有那么神奇.

  4. 公布一些常用的WebServices

    天气预报Web服务,数据来源于中国气象局  Endpoint   Disco   WSDL IP地址来源搜索 WEB 服务(是目前最完整的IP地址数据)  Endpoint   Disco   WSD ...

  5. dealloc时取weakself引起崩溃

    今天无意这中遇到一个奇怪的崩溃,先上引起崩溃的代码: - (void)dealloc { __weak __typeof(self)weak_self = self; NSLog(@"%@& ...

  6. 【Lowest Common Ancestor of a Binary Tree】cpp

    题目: Given a binary tree, find the lowest common ancestor (LCA) of two given nodes in the tree. Accor ...

  7. os--留

    os.path.abspath(path) #返回绝对路径    绝对路径和文件路径的区别,绝对路径是当前在操作文本的路径,文件路径是当前文本的文件的路径 os.path.basename(path) ...

  8. ASP.NET Core 2.1 源码学习之 Options[2]:IOptions 【转】

    原文链接:https://www.cnblogs.com/RainingNight/p/strongly-typed-options-ioptions-in-asp-net-core.html 在 上 ...

  9. NYOJ 简单数据结构

    NYOJ 2 括号配对问题 栈的简单应用.可使用STL. #include <iostream> #include <cstdio> #include <cstring& ...

  10. JavaWeb笔记(七)Filter&Listener

    Filter 实现Filter接口 一般用于完成通用的操作,如:登陆验证.统一编码处理.敏感字符过滤等 执行流程 执行过滤器 执行放行后的资源 继续执行过滤器放行代码下的代码 配置 拦截路径配置 注解 ...