最近有个项目需要用到excel导入,要求是excel有哪些字段不固定,对应到数据库的字段需要动态配置,而且客户可以随意修改,在网上也找了一些方法,也做过一些测试,最终选择NPOI,于此相关的帖子网上也有很多,在此,我只是记录下研究的成果,如果代码有什么问题,还请大家不吝赐教。。。。以下只是读取excel部分。。。

1 public class DataTableRenderToExcel
2 {
3 public DataTableRenderToExcel()
4 {
5 //
6 // TODO: 在此加入建構函式的程式碼
7 //
8 }
9 static private IWorkbook workbook = null;
10 static private ISheet sheet = null;
11 static private DataTable dt_data = null;
12
13 static private string _filepath;
14 static public string FilePath
15 {
16 set { _filepath = value; }
17 get { return _filepath; }
18 }
19 static private string _sheetname;
20 static public string SheetName
21 {
22 set { _sheetname = value; }
23 get { return _sheetname; }
24 }
25
26
27 #region NPOI导入EXCEL
28 /// <summary>
29 /// 创建工作簿
30 /// </summary>
31 private static IWorkbook CreateWorkBook()
32 {
33 try
34 {
35 using (FileStream fs = new FileStream(FilePath, FileMode.Open, FileAccess.Read))
36 {
37 if (FilePath.IndexOf(".xlsx") > 0) // 2007或2010版本
38 return new XSSFWorkbook(fs);
39 else
40 return new HSSFWorkbook(fs); // 2003版本
41 }
42 }
43 catch (Exception ex)
44 {
45 throw ex;
46 }
47 }
48 /// <summary>
49 /// 获取EXCEL工作表sheet集合
50 /// </summary>
51 /// <param name="fileName"></param>
52 /// <returns></returns>
53 public static List<string> ExcelSheetToDT()
54 {
55 List<string> sheetName = new List<string>();
56 try
57 {
58 if (workbook == null)
59 workbook = CreateWorkBook();
60
61 int sheetCount = workbook.NumberOfSheets;
62
63 for (int i = 0; i < sheetCount; i++)
64 {
65 sheetName.Add(workbook.GetSheetName(i));
66 }
67 }
68 catch (Exception ex)
69 {
70 throw ex;
71 }
72 return sheetName;
73 }
74 /// <summary>
75 /// 返回EXCEL工作簿sheet
76 /// </summary>
77 /// <param name="sheetName"></param>
78 /// <returns></returns>
79 private static ISheet GetExcelSheet()
80 {
81 try
82 {
83 if (workbook == null)
84 workbook = CreateWorkBook();
85
86 if (SheetName == string.Empty)
87 SheetName = ExcelSheetToDT()[0].ToString();
88
89 return workbook.GetSheet(SheetName);
90 }
91 catch (Exception ex)
92 {
93 throw ex;
94 }
95 }
96 /// <summary>
97 /// 获取EXCEL列名
98 /// </summary>
99 /// <param name="sheetName"></param>
100 /// <param name="firstRowNum"></param>
101 /// <returns></returns>
102 public static DataTable GetExcelHeader()
103 {
104 DataTable dt = new DataTable();
105 dt_data = new DataTable();
106 try
107 {
108 if (sheet == null)
109 sheet = GetExcelSheet();
110
111 dt.Columns.Add("COLUMNS", typeof(string));
112 IRow header = sheet.GetRow(sheet.FirstRowNum);
113 for (int i = header.FirstCellNum, len = header.LastCellNum; i < len; i++)
114 {
115 object obj = GetValueTypeForXlsx(header.GetCell(i) as XSSFCell);
116 if (obj == null || obj.ToString() == string.Empty)
117 {
118 dt.Rows.Add(new DataColumn("Columns" + i.ToString()));
119 dt_data.Columns.Add(new DataColumn("Columns" + i.ToString()));
120 }
121 else
122 {
123 dt.Rows.Add(new DataColumn(obj.ToString()));
124 dt_data.Columns.Add(new DataColumn(obj.ToString()));
125 }
126 }
127 }
128 catch (Exception ex)
129 {
130 throw ex;
131 }
132 return dt;
133 }
134 /// <summary>
135 /// 获取EXCEL数据
136 /// </summary>
137 /// <returns></returns>
138 public static DataTable GetExcelData()
139 {
140 try
141 {
142 if (sheet == null)
143 sheet = GetExcelSheet();
144 for (int i = sheet.FirstRowNum + 1, len = sheet.LastRowNum; i <= len; i++)
145 {
146 DataRow dr = dt_data.NewRow();
147 bool hasValue = false;
148 for (int j = 0; j < sheet.GetRow(sheet.FirstRowNum).LastCellNum; j++)
149 {
150 dr[j] = GetValueTypeForXlsx(sheet.GetRow(i).GetCell(j) as XSSFCell);
151 if (dr[j] != null && dr[j].ToString() != string.Empty)
152 hasValue = true;
153 }
154 if (hasValue)
155 {
156 dt_data.Rows.Add(dr);
157 }
158 }
159 }
160 catch (Exception ex)
161 {
162 throw ex;
163 }
164 return dt_data;
165 }
166
167 /// <summary>
168 /// 获取数据类型
169 /// </summary>
170 /// <param name="cell"></param>
171 /// <returns></returns>
172 private static object GetValueTypeForXlsx(XSSFCell cell)
173 {
174 if (cell == null)
175 return null;
176 switch (cell.CellType)
177 {
178 case CellType.Blank:
179 return null;
180 case CellType.Boolean:
181 return cell.BooleanCellValue;
182 case CellType.Numeric:
183 return cell.NumericCellValue;
184 case CellType.Error:
185 return cell.ErrorCellValue;
186 case CellType.Formula:
187 return cell.CellFormula;
188 case CellType.String:
189 return cell.StringCellValue;
190 default:
191 return cell.StringCellValue;
192 }
193 }
194 #endregion
195 }
来源:https://www.cnblogs.com/luole/p/3958073.html
