NPOI对Excel的操作(Sheet转DataTable、List<T>)
通过NPOI对Excel进行操作,这里主要是读取的操作。封装到ExcelHelper操作类中。

1 using System.Collections.Generic;
2 using NPOI.HSSF.UserModel;
3 using NPOI.SS.UserModel;
4 using NPOI.XSSF.UserModel;
5 using System.IO;
6 using System.Data;
7 using System;
8
9 namespace CommonHelper
10 {
11 public class ExcelHelper
12 {
13
14 public ExcelHelper() { }
15
16 /// <summary>
17 /// 文件流初始化对象
18 /// </summary>
19 /// <param name="stream"></param>
20 public ExcelHelper(Stream stream)
21 {
22 _IWorkbook = CreateWorkbook(stream);
23 }
24
25 /// <summary>
26 /// 传入文件名
27 /// </summary>
28 /// <param name="fileName"></param>
29 public ExcelHelper(string fileName)
30 {
31 using (FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read))
32 {
33 _IWorkbook = CreateWorkbook(fileStream);
34 }
35 }
36
37 /// <summary>
38 /// 工作薄
39 /// </summary>
40 private IWorkbook _IWorkbook;
41
42 /// <summary>
43 /// 创建工作簿对象
44 /// </summary>
45 /// <param name="stream"></param>
46 /// <returns></returns>
47 private IWorkbook CreateWorkbook(Stream stream)
48 {
49 try
50 {
51 return new XSSFWorkbook(stream); //07
52 }
53 catch
54 {
55 return new HSSFWorkbook(stream); //03
56 }
57
58 }
59
60 /// <summary>
61 /// 把Sheet中的数据转换为DataTable
62 /// </summary>
63 /// <param name="sheet"></param>
64 /// <returns></returns>
65 private DataTable ExportToDataTable(ISheet sheet)
66 {
67 DataTable dt = new DataTable();
68
69 //默认,第一行是字段
70 IRow headRow = sheet.GetRow(0);
71
72 //设置datatable字段
73 for (int i = headRow.FirstCellNum, len = headRow.LastCellNum; i < len; i++)
74 {
75 dt.Columns.Add(headRow.Cells[i].StringCellValue);
76 }
77 //遍历数据行
78 for (int i = (sheet.FirstRowNum + 1), len = sheet.LastRowNum + 1; i < len; i++)
79 {
80 IRow tempRow = sheet.GetRow(i);
81 DataRow dataRow = dt.NewRow();
82
83 //遍历一行的每一个单元格
84 for (int r = 0, j = tempRow.FirstCellNum, len2 = tempRow.LastCellNum; j < len2; j++, r++)
85 {
86
87 ICell cell = tempRow.GetCell(j);
88
89 if (cell != null)
90 {
91 switch (cell.CellType)
92 {
93 case CellType.STRING:
94 dataRow[r] = cell.StringCellValue;
95 break;
96 case CellType.NUMERIC:
97 dataRow[r] = cell.NumericCellValue;
98 break;
99 case CellType.BOOLEAN:
100 dataRow[r] = cell.BooleanCellValue;
101 break;
102 default: dataRow[r] = "ERROR";
103 break;
104 }
105 }
106 }
107 dt.Rows.Add(dataRow);
108 }
109 return dt;
110 }
111
112 /// <summary>
113 /// Sheet中的数据转换为List集合
114 /// </summary>
115 /// <param name="sheet"></param>
116 /// <param name="fields"></param>
117 /// <returns></returns>
118 private IList<T> ExportToList<T>(ISheet sheet,string[] fields) where T:class,new()
119 {
120 IList<T> list = new List<T>();
121
122 //遍历每一行数据
123 for (int i = sheet.FirstRowNum + 1, len = sheet.LastRowNum + 1; i < len; i++)
124 {
125 T t=new T();
126 IRow row = sheet.GetRow(i);
127
128 for (int j = 0, len2 = fields.Length; j < len2; j++)
129 {
130 ICell cell=row.GetCell(j);
131 object cellValue= null;
132
133 switch (cell.CellType)
134 {
135 case CellType.STRING: //文本
136 cellValue = cell.StringCellValue;
137 break;
138 case CellType.NUMERIC: //数值
139 cellValue =Convert.ToInt32(cell.NumericCellValue);//Double转换为int
140 break;
141 case CellType.BOOLEAN: //bool
142 cellValue = cell.BooleanCellValue;
143 break;
144 case CellType.BLANK: //空白
145 cellValue = "";
146 break;
147 default: cellValue = "ERROR";
148 break;
149 }
150
151 typeof(T).GetProperty(fields[j]).SetValue(t,cellValue,null);
152 }
153 list.Add(t);
154 }
155
156 return list;
157 }
158
159 /// <summary>
160 /// 获取第一个Sheet的第X行,第Y列的值。起始点为1
161 /// </summary>
162 /// <param name="X">行</param>
163 /// <param name="Y">列</param>
164 /// <returns></returns>
165 public string GetCellValue(int X, int Y)
166 {
167 ISheet sheet = _IWorkbook.GetSheetAt(0);
168
169 IRow row = sheet.GetRow(X-1);
170
171 return row.GetCell(Y-1).ToString();
172 }
173
174 /// <summary>
175 /// 获取一行的所有数据
176 /// </summary>
177 /// <param name="X">第x行</param>
178 /// <returns></returns>
179 public string[] GetCells(int X)
180 {
181 List<string> list = new List<string>();
182
183 ISheet sheet = _IWorkbook.GetSheetAt(0);
184
185 IRow row = sheet.GetRow(X-1);
186
187 for (int i = 0, len = row.LastCellNum; i < len; i++)
188 {
189 list.Add(row.GetCell(i).StringCellValue);//这里没有考虑数据格式转换,会出现bug
190 }
191 return list.ToArray();
192 }
193
194 /// <summary>
195 /// 第一个Sheet数据,转换为DataTable
196 /// </summary>
197 /// <returns></returns>
198 public DataTable ExportExcelToDataTable()
199 {
200 return ExportToDataTable(_IWorkbook.GetSheetAt(0));
201 }
202
203 /// <summary>
204 /// 第sheetIndex表数据,转换为DataTable
205 /// </summary>
206 /// <param name="sheetIndex">第几个Sheet,从1开始</param>
207 /// <returns></returns>
208 public DataTable ExportExcelToDataTable(int sheetIndex)
209 {
210 return ExportToDataTable(_IWorkbook.GetSheetAt(sheetIndex-1));
211 }
212
213
214 /// <summary>
215 /// Excel中默认第一张Sheet导出到集合
216 /// </summary>
217 /// <param name="fields">Excel各个列,依次要转换成为的对象字段名称</param>
218 /// <returns></returns>
219 public IList<T> ExcelToList<T>(string[] fields) where T:class,new ()
220 {
221 return ExportToList<T>(_IWorkbook.GetSheetAt(0),fields);
222 }
223
224 /// <summary>
225 /// Excel中指定的Sheet导出到集合
226 /// </summary>
227 /// <param name="sheetIndex">第几张Sheet,从1开始</param>
228 /// <param name="fields">Excel各个列,依次要转换成为的对象字段名称</param>
229 /// <returns></returns>
230 public IList<T> ExcelToList<T>(int sheetIndex,string[] fields) where T:class,new()
231 {
232 return ExportToList<T>(_IWorkbook.GetSheetAt(sheetIndex-1), fields);
233 }
234
235 }
236 }

NPOI对Excel的操作(Sheet转DataTable、List<T>)的更多相关文章
- excel to datatable (c#用NPOI将excel文件内容读取到datatable数据表中)
将excel文件内容读取到datatable数据表中,支持97-2003和2007两种版本的excel 1.第一种是根据excel文件路径读取excel并返回datatable /// <sum ...
- C#NPOI对Excel的操作、导入导出时异常处理、最全的NPOI资料在这里~
一.Excel理论知识 最新版NPOI2.4.1链接:https://pan.baidu.com/s/1iTgJi2hGsRQHyw2S_4dIUw 提取码:adnq • 整个Excel表格叫做工作 ...
- NPOI - .NET Excel & Word操作组件
概要 NPOI 是 POI 项目的 .NET 版本.POI是一个开源的Java读写Excel.WORD等微软OLE2组件文档的项目. NPOI是构建在POI 3.x版本之上的,它可以在没有安装Offi ...
- 利用NPOI组件产Excel完整操作
最终还是要使用NPOi了.刚开始做的是用com组件,发现如果本机不按照excel就不能使用,后来把其中一支改为了用Itextsharp产生pdf,但是还有几支批次要产生Excel,只能改用NPOI了. ...
- NPOI导出Excel表功能实现(多个工作簿)(备用)
Excel生成操作类: 代码 using System; using System.Collections.Generic; using System.Text; using System.IO; u ...
- 使用NPOI读取Excel到DataTable
一.NPOI介绍: 使用 NPOI 你就可以在没有安装 Office 或者相应环境的机器上对 WORD/EXCEL 文档进行读写.NPOI是构建在POI 3.x版本之上的,它可以在没有安装Office ...
- 【个人使用.Net类库】(3)Excel文件操作类(基于NPOI)
Web开发工作中经常要根据业务的需要生成对应的报表.经常采用的方法如下: 将DataTable导出至Excel文件; 读取模板Excel文件; 修改模板Excel文件对应的内容. 因此,便想到封装一个 ...
- 用NPOI从Excel到DataTable
NPOI功能强大,不用装Excel,就可以操作表格中数据----Excel.Sheet------>DataTable private IWorkbook workbook = null; pr ...
- 使用NPOI读取Excel数据到DataTable
如今XML文件的存储格式大行其道,可是也不是适用于全部情况,非常多单位的数据交换还是使用Excel的形式.这就使得我们须要读取Excel内的数据.载入到程序中进行处理.可是如何有效率的读取,如何使程序 ...
随机推荐
- MVVM-Sidekick 之SendToEventRouterAction使用
在WP开发中点击列表项跳转到详情页是一个很常用的功能,但是有可能项模板中还有其他的区域,比如点击标题跳转到详情页,点击"赞"图标送一个赞,点击"踩"图标踩一下, ...
- LINQ的Except方法
在两个集合中,左边集合减去右边集合的元素: source code: List<int> a = new List<int>{ { }, { }, { } }; List< ...
- asp.net中Ajax控件的用途(二)
1.个人觉得对于新手最为实用的PopupControlExtender,弹出层载体,在实例中可以弹出登录框,百度的登陆页面基本都用的这种形式,可以把浮动的panel宽高都设置为100%,以屏蔽底层操作 ...
- OpenSNS开发笔记(1)
数据分页: $Data = M('Channel'); // 实例化Data数据模型 $content = $Data->page($page, 4)->select(); $totalC ...
- net发布的dll方法和类显示注释信息(字段说明信息)[图解]
自己发布的dll添加的另一个项目中突然没有字段说明信息了,给使用带来了很多的不便,原因是为了跨项目引用,所以导致不显示注释信息的,一下是解决这个问题的方法. 在要发布(被引用)的项目上右键 => ...
- C# AD(Active Directory)域信息同步,组织单位、用户等信息查询
示例准备 打开上一篇文章配置好的AD域控制器 开始菜单-->管理工具-->Active Directory 用户和计算机 新建组织单位和用户 新建层次关系如下: 知识了解 我们要用C# ...
- mysql学习笔记 第六天
改变数据表的结构: alter table tb_name action,[action,action](使用alter table 之前,需要查看数据表的当前定义,需要执行show create t ...
- x8086汇编实现dos清屏(clear screen)
题目要求:x8086汇编实现dos下的清屏功能 80X25彩色字符模式显示缓冲区的结构: 在内存地址结构中,B8000H~BFFFFH共32KB的空间,为80x25彩色字符模式的显示缓冲区.向这个地址 ...
- IT职业思考 谈谈IT外包公司
个人能力强才是王道 1. 为什么像BAT.HP.IBM.华为这些大公司还需要外包,他们已经有那么多的技术人员 一个公司,如果没有那么多项目,光养这些技术人员,实际的经营成本确实不低,但是这些技术人员又 ...
- yii2 advance 安装
1. 前提条件,php版本得> 5.4 D:\phpStudy>php -v PHP (cli) (built: Sep ::) Copyright (c) - The PHP Group ...