NPOI对Excel的操作(Sheet转DataTable、List

时间:2021-05-26 19:42:09

通过NPOI对Excel进行操作,这里主要是读取的操作。封装到ExcelHelper操作类中。

NPOI对Excel的操作(Sheet转DataTable、List<T>)
  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>)