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. linxu信号种类

    使用kill -l 命令,可看到linux支持的信号列表: 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGB ...

  2. Codeforces Round #438 C - Qualification Rounds 思维

    C. Qualification Rounds time limit per test 2 seconds memory limit per test 256 megabytes input stan ...

  3. Matplotlib 图表的基本参数设置

    1.图名,图例,轴标签,轴边界,轴刻度,轴刻度标签 # 图名,图例,轴标签,轴边界,轴刻度,轴刻度标签等 df = pd.DataFrame(np.random.rand(10,2),columns= ...

  4. 17-比赛1 F - 较小元素 Weak in the Middle (set)

    Seg-El has last chance to make the final changes in order to prevent the destruction of Krypton. He ...

  5. TouTiao开源项目 分析笔记19 问答内容

    1.真实页面预览 1.1.成果预览 首先是问答列表 然后每个item设置点击事件,进入问答内容列表 然后每一个问答内容也设置点击事件,进入问答详情 1.2.触发事件. 在WendaArticleOne ...

  6. [Jenkins]持续集成环境下fingbug插件的安装使用与配置

    参考:https://wiki.jenkins.io/display/JENKINS/FindBugs+Plugin 突然,天降杂事.我是想安安静静的做个美丽的测试...但是事与愿违,项目经理叫我帮忙 ...

  7. 实际遭遇GC回收造成的Web服务器CPU跑高

    今天下午有段时间访问园子感觉不如以前那么快的流畅,上Web服务器一看,果然,负载均衡中的1台云服务器CPU跑高. 上图中红色曲线表示的是CPU占用率.正常情况下,CPU占用率一般在40%以下. 这台云 ...

  8. 服务过美国总统竞选的非传统投票UI【demo已放出】

    =============================== 更新:DEMO和分析已经放出,地址在这里   http://www.cnblogs.com/arfeizhang/p/faceoffde ...

  9. 转:Redis设置认证密码 Redis使用认证密码登录 在Redis集群中使用认证密码

    Redis默认配置是不需要密码认证的,也就是说只要连接的Redis服务器的host和port正确,就可以连接使用.这在安全性上会有一定的问题,所以需要启用Redis的认证密码,增加Redis服务器的安 ...

  10. JS——BOM、DOM

    BOM.DOM BOM window对象 history对象 location对象 screen对象 DOM DOM对HTML元素访问操作 HTML DOM树 DOM 节点 DOM访问HTML元素 D ...