通过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. 控件使用经验-MVP模式+控件封装

    项目背景 几年前参与了一个面向学校的人事管理软件的开发,基于WinForm平台.今天主要想谈一谈其中关于控件的使用经验.这个项目我们大量使用了第三方控件.由于这个产品的生命周期很长,我们在设计时要考虑 ...

  2. Java基础复习笔记系列 五 常用类

    Java基础复习笔记系列之 常用类 1.String类介绍. 首先看类所属的包:java.lang.String类. 再看它的构造方法: 2. String s1 = “hello”: String ...

  3. CI框架源码阅读笔记5 基准测试 BenchMark.php

    上一篇博客(CI框架源码阅读笔记4 引导文件CodeIgniter.php)中,我们已经看到:CI中核心流程的核心功能都是由不同的组件来完成的.这些组件类似于一个一个单独的模块,不同的模块完成不同的功 ...

  4. Java空白final

    Java 1.1允许我们创建"空白final",它们属于一些特殊的字段.尽管被申明为final,但却未得到一个初始值. 无论在哪种情况下,空白final都必须在实际使用前得到正确的 ...

  5. 网上图书商城3--Book模块

    小技巧一:分页 ①PageBean<Book> findByCriteria(List<Expression> exprList, int pc)  --- 通用的查询方法(p ...

  6. reset

    html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, ...

  7. jQuery Tocify 定位导航

    Tocify是一个jQuery插件,能够动态的生成文章目录,Tocify可以随意的设置Twitter Bootstrap 或者 jQueryUI Themeroller支持的可选动画和jQuery的显 ...

  8. 基于RulesEngine的业务规则实现

    规则引擎由推理引擎发展而来,是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策.接受数据输入,解释业务规则,并根据业务规则做出业务决策.比较常见 ...

  9. HTML5&CSS3经典动态表格

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. 尝试加载 Oracle 客户端库时引发 BadImageFormatException。问题记录

    电脑是win8 64位,安装oracle 11g r2 64位的,谁知道一切装完毕后,打开项目却连不上oracle数据了...首先是pl/sql连不上,装了oracle服务器,应该是不用再装客户端,p ...