通过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>)的更多相关文章

  1. excel to datatable (c#用NPOI将excel文件内容读取到datatable数据表中)

    将excel文件内容读取到datatable数据表中,支持97-2003和2007两种版本的excel 1.第一种是根据excel文件路径读取excel并返回datatable /// <sum ...

  2. C#NPOI对Excel的操作、导入导出时异常处理、最全的NPOI资料在这里~

    一.Excel理论知识 最新版NPOI2.4.1链接:https://pan.baidu.com/s/1iTgJi2hGsRQHyw2S_4dIUw  提取码:adnq • 整个Excel表格叫做工作 ...

  3. NPOI - .NET Excel & Word操作组件

    概要 NPOI 是 POI 项目的 .NET 版本.POI是一个开源的Java读写Excel.WORD等微软OLE2组件文档的项目. NPOI是构建在POI 3.x版本之上的,它可以在没有安装Offi ...

  4. 利用NPOI组件产Excel完整操作

    最终还是要使用NPOi了.刚开始做的是用com组件,发现如果本机不按照excel就不能使用,后来把其中一支改为了用Itextsharp产生pdf,但是还有几支批次要产生Excel,只能改用NPOI了. ...

  5. NPOI导出Excel表功能实现(多个工作簿)(备用)

    Excel生成操作类: 代码 using System; using System.Collections.Generic; using System.Text; using System.IO; u ...

  6. 使用NPOI读取Excel到DataTable

    一.NPOI介绍: 使用 NPOI 你就可以在没有安装 Office 或者相应环境的机器上对 WORD/EXCEL 文档进行读写.NPOI是构建在POI 3.x版本之上的,它可以在没有安装Office ...

  7. 【个人使用.Net类库】(3)Excel文件操作类(基于NPOI)

    Web开发工作中经常要根据业务的需要生成对应的报表.经常采用的方法如下: 将DataTable导出至Excel文件; 读取模板Excel文件; 修改模板Excel文件对应的内容. 因此,便想到封装一个 ...

  8. 用NPOI从Excel到DataTable

    NPOI功能强大,不用装Excel,就可以操作表格中数据----Excel.Sheet------>DataTable private IWorkbook workbook = null; pr ...

  9. 使用NPOI读取Excel数据到DataTable

    如今XML文件的存储格式大行其道,可是也不是适用于全部情况,非常多单位的数据交换还是使用Excel的形式.这就使得我们须要读取Excel内的数据.载入到程序中进行处理.可是如何有效率的读取,如何使程序 ...

随机推荐

  1. SignalR入门之从外部访问持久性连接或Hub

    有的时候,需要从外部访问持久性连接或Hub服务. 比如,假设A和B两个客户端正在聊天,那么系统或第三方在不参与聊天的情况需要为他们发送系统消息,那么此时,就需要独立来访问持久性连接或Hub服务. 之前 ...

  2. C#的变迁史 - C# 3.0篇

    C# 3.0 (.NET 3.5, VS2008) 第三代C#在语法元素基本完备的基础上提供了全新的开发工具和集合数据查询方式,极大的方便了开发. 1. WPF,WCF,WF 这3个工程类型奠定了新一 ...

  3. jquery 删除cookie失效的解决方法

    最近在做网站退出功能的时候出现删除Cookie 的时候总是失效. 1.使用$.cookie("name","");  结果出来是生成了一个新的空值的cookie ...

  4. thinkphp端口配置

    <?php return array( //'配置项'=>'配置值' 'MODULE_ALLOW_LIST' => array('Home'), 'DEFAULT_MODULE' = ...

  5. SSH实例(3)

    src文件夹的结构如下: clasDao文件: package com.school.service; import java.util.List; import com.school.dao.Cla ...

  6. [转]以Facebook为案例剖析科技公司应有的工具文化

    原文:http://36kr.com/p/146507.html 这是一篇几年前的文章,但对于没有涉及到工具文化这个概念的人来说,还是很新的. 前言 前段时间和大众点评的 CEO 张涛聊天的时候碰到内 ...

  7. Scalaz(10)- Monad:就是一种函数式编程模式-a design pattern

    Monad typeclass不是一种类型,而是一种程序设计模式(design pattern),是泛函编程中最重要的编程概念,因而很多行内人把FP又称为Monadic Programming.这其中 ...

  8. GJM :用JIRA管理你的项目(三)基于LDAP用户管理 [转载]

    感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...

  9. HTTP协议(转)

    HTTP是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统.它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展.目前在WWW中使用的是HTTP/1.0的第 ...

  10. 哇 真的是一个好插件!!!Sublime Text编辑文件后快速刷新浏览器

    http://9iphp.com/web/html/sublime-text-refresh-browser.html这篇博文咯 来源:[Tips]Sublime Text编辑文件后快速刷新浏览器 - ...