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内的数据.载入到程序中进行处理.可是如何有效率的读取,如何使程序 ...
随机推荐
- 倍数提高工作效率的 Android Studio 奇技
来源:JeremyHe 链接:http://zlv.me/posts/2015/07/13/14_android-studio-tips/ 这是从Philippe Breault的系列文章<An ...
- QT TableWidget 应用笔记
QT TableWidget应用笔记 分类: QT2013-05-21 16:22 2561人阅读 评论(0) 收藏 举报 1.设置表头及大小 QStringList header; header&l ...
- Winform控件重写
Winform控件重写 因为最近的项目中越来越多的遇到了比较特殊的一些控件,有时候我们自己封装一下可能更加方便我们的使用,下面是我们项目中用到的,简单做一个记录. TextBox控件重写 主要的控制代 ...
- 背水一战 Windows 10 (3) - UI: 窗口全屏, 窗口尺寸
[源码下载] 背水一战 Windows 10 (3) - UI: 窗口全屏, 窗口尺寸 作者:webabcd 介绍背水一战 Windows 10 之 UI 窗口全屏 窗口尺寸 示例1.窗口全屏UI/F ...
- 用于PHP的Gearman Worker管理工具GearmanManager
项目地址:https://github.com/brianlmoon/GearmanManager PHP环境要求 PHP 5.5.9 POSIX extension Process Control ...
- Scalaz(10)- Monad:就是一种函数式编程模式-a design pattern
Monad typeclass不是一种类型,而是一种程序设计模式(design pattern),是泛函编程中最重要的编程概念,因而很多行内人把FP又称为Monadic Programming.这其中 ...
- 算法实质【Matrix67】
动态规划 :你追一个MM的时候,需要对该MM身边的各闺中密友都好,这样你追MM这个问题 就分解为对其MM朋友的问题,只有把这些问题都解决了,最终你才能追到MM. 因此,该问题适用于聪明的MM,懂得“看 ...
- Linux学习笔记14-权限基础
权限基础 权限:操作系统限制对资源访问的机制,一般分为读.写.执行.每个文件都拥有特定权限,通过所属用户及所属组来限制哪些用户.组可以对特定文件进行什么样的操作. 每个进程都是以某个用户的身份运行,进 ...
- Android ant自动打包脚本:自动替换友盟渠道、版本号、包名
本文最后修改时间:2014-3-10 Android项目开发时,给公司人员安装,频繁升级,版本号总需要改,太麻烦,跟着时间变,自动升级才方便. Android项目开发新版时,手机上可能要装两个版本,一 ...
- MagicSuggest – Bootstrap 主题的多选组合框
MagicSuggest 是专为 Bootstrap 主题开发的多选组合框.它支持自定义呈现,数据通过 Ajax 异步获取,使用组件自动过滤.它允许空间免费项目,也有动态加载固定的建议. 您可能感兴趣 ...