NPOI读取Excel2003,2007

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Data;
  4 using System.IO;
  5 using System.Linq;
  6 using System.Text;
  7 using NPOI.HSSF.UserModel;
  8 using NPOI.SS.UserModel;
  9 using NPOI.XSSF.UserModel;
 10 
 11 namespace DMEnterpriseAdministration
 12 {
 13     public class Excel
 14     {
 15         public static MemoryStream WriteDataToExcel(DataSet ds)
 16         {
 17             MemoryStream memoryStream = new MemoryStream();
 18 
 19             try
 20             {
 21                 IWorkbook workbook = new HSSFWorkbook();
 22 
 23                 foreach (DataTable table in ds.Tables)
 24                 {
 25                     ISheet sheet = workbook.CreateSheet(table.TableName);
 26                     IRow headerRow = sheet.CreateRow(0);
 27 
 28                     foreach (DataColumn column in table.Columns)
 29                     {
 30                         headerRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName);
 31                     }
 32 
 33                     int rowIndex = 1;
 34 
 35                     foreach (DataRow row in table.Rows)
 36                     {
 37                         IRow dataRow = sheet.CreateRow(rowIndex);
 38 
 39                         foreach (DataColumn column in table.Columns)
 40                         {
 41                             dataRow.CreateCell(column.Ordinal).SetCellValue(row[column].ToString());
 42                         }
 43 
 44                         rowIndex++;
 45                     }
 46 
 47                     sheet = null;
 48                     headerRow = null;
 49                 }
 50 
 51                 workbook.Write(memoryStream);
 52 
 53                 workbook = null;
 54             }
 55             catch (Exception exception)
 56             {
 57                 throw exception;
 58             }
 59 
 60             return memoryStream;
 61         }
 62 
 63         public static DataSet ExcelToDataSet(string excelPath)
 64         {
 65             return ExcelToDataSet(excelPath, true);
 66         }
 67 
 68         public static DataSet ExcelToDataSet(string excelPath, bool firstRowAsHeader)
 69         {
 70             int sheetCount;
 71             return ExcelToDataSet(excelPath, firstRowAsHeader, out sheetCount);
 72         }
 73 
 74         public static DataSet ExcelToDataSet(string excelPath, bool firstRowAsHeader, out int sheetCount)
 75         {
 76             using (DataSet ds = new DataSet())
 77             {
 78                 using (FileStream fileStream = new FileStream(excelPath, FileMode.Open, FileAccess.Read))
 79                 {
 80                     IWorkbook workbook = new HSSFWorkbook(fileStream);
 81 
 82                     HSSFFormulaEvaluator evaluator = new HSSFFormulaEvaluator(workbook);
 83 
 84                     sheetCount = workbook.NumberOfSheets;
 85 
 86                     for (int i = 0; i < sheetCount; ++i)
 87                     {
 88                         ISheet sheet = workbook.GetSheetAt(i) as HSSFSheet;
 89                         DataTable dt = ExcelToDataTable(sheet, evaluator, firstRowAsHeader);
 90                         ds.Tables.Add(dt);
 91                     }
 92 
 93                     return ds;
 94                 }
 95             }
 96         }
 97 
 98         public static DataTable ExcelToDataTable(string excelPath, string sheetName)
 99         {
100             return ExcelToDataTable(excelPath, sheetName, true);
101         }
102 
103         public static DataTable ExcelToDataTable(string excelPath, string sheetName, bool firstRowAsHeader)
104         {
105             using (FileStream fileStream = new FileStream(excelPath, FileMode.Open, FileAccess.Read))
106             {
107                 IWorkbook workbook = null;
108                 IFormulaEvaluator evaluator = null;
109                 ISheet sheet  = null;
110                 if (excelPath.EndsWith(".xls"))
111                 {
112                     workbook = new HSSFWorkbook(fileStream);
113                     evaluator = new HSSFFormulaEvaluator(workbook);
114                     sheet = workbook.GetSheet(sheetName) as HSSFSheet;
115                     if (sheet == null)
116                     {
117                         sheet = workbook.GetSheetAt(0);
118                     }
119                 }
120                 else
121                 {
122                     workbook = new XSSFWorkbook(fileStream);
123                     evaluator = new XSSFFormulaEvaluator(workbook);
124                     sheet = workbook.GetSheet(sheetName) as XSSFSheet;
125                     if (sheet == null)
126                     {
127                         sheet = workbook.GetSheetAt(0);
128                     }
129                 }
130 
131                 return ExcelToDataTable(sheet, evaluator, firstRowAsHeader);
132             }
133         }
134 
135         private static DataTable ExcelToDataTable(ISheet sheet, IFormulaEvaluator evaluator, bool firstRowAsHeader)
136         {
137             if (firstRowAsHeader)
138             {
139                 return ExcelToDataTableFirstRowAsHeader(sheet, evaluator);
140             }
141             else
142             {
143                 return ExcelToDataTable(sheet, evaluator);
144             }
145         }
146 
147         private static DataTable ExcelToDataTableFirstRowAsHeader(ISheet sheet, IFormulaEvaluator evaluator)
148         {
149             using (DataTable dt = new DataTable())
150             {
151                 IRow firstRow = sheet.GetRow(0) as IRow;
152                 int cellCount = GetCellCount(sheet);
153 
154                 for (int i = 0; i < cellCount; i++)
155                 {
156                     if (firstRow.GetCell(i) != null)
157                     {
158                         dt.Columns.Add(firstRow.GetCell(i).StringCellValue ?? string.Format("F{0}", i + 1), typeof(string));
159                     }
160                     else
161                     {
162                         dt.Columns.Add(string.Format("F{0}", i + 1), typeof(string));
163                     }
164                 }
165 
166                 for (int i = 1; i <= sheet.LastRowNum; i++)
167                 {
168                     IRow row = sheet.GetRow(i) as IRow;
169                     DataRow dr = dt.NewRow();
170                     FillDataRowByHSSFRow(row, evaluator, ref dr);
171                     dt.Rows.Add(dr);
172                 }
173 
174                 dt.TableName = sheet.SheetName;
175                 return dt;
176             }
177         }
178 
179         private static DataTable ExcelToDataTable(ISheet sheet, IFormulaEvaluator evaluator)
180         {
181             using (DataTable dt = new DataTable())
182             {
183                 if (sheet.LastRowNum != 0)
184                 {
185                     int cellCount = GetCellCount(sheet);
186 
187                     for (int i = 0; i < cellCount; i++)
188                     {
189                         dt.Columns.Add(string.Format("F{0}", i), typeof(string));
190                     }
191 
192                     for (int i = 0; i < sheet.FirstRowNum; ++i)
193                     {
194                         DataRow dr = dt.NewRow();
195                         dt.Rows.Add(dr);
196                     }
197 
198                     for (int i = sheet.FirstRowNum; i <= sheet.LastRowNum; i++)
199                     {
200                         IRow row = sheet.GetRow(i) as IRow;
201                         DataRow dr = dt.NewRow();
202                         FillDataRowByHSSFRow(row, evaluator, ref dr);
203                         dt.Rows.Add(dr);
204                     }
205                 }
206 
207                 dt.TableName = sheet.SheetName;
208                 return dt;
209             }
210         }
211 
212         private static void FillDataRowByHSSFRow(IRow row, IFormulaEvaluator evaluator, ref DataRow dr)
213         {
214             if (row != null)
215             {
216                 for (int j = 0; j < dr.Table.Columns.Count; j++)
217                 {
218                     ICell cell = row.GetCell(j) as ICell;
219 
220                     if (cell != null)
221                     {
222                         switch (cell.CellType)
223                         {
224                             case CellType.Blank:
225                                 dr[j] = DBNull.Value;
226                                 break;
227                             case CellType.Boolean:
228                                 dr[j] = cell.BooleanCellValue;
229                                 break;
230                             case CellType.Numeric:
231                                 if (DateUtil.IsCellDateFormatted(cell))
232                                 {
233                                     dr[j] = cell.DateCellValue;
234                                 }
235                                 else
236                                 {
237                                     dr[j] = cell.NumericCellValue;
238                                 }
239                                 break;
240                             case CellType.String:
241                                 dr[j] = cell.StringCellValue;
242                                 break;
243                             case CellType.Error:
244                                 dr[j] = cell.ErrorCellValue;
245                                 break;
246                             case CellType.Formula:
247                                 cell = evaluator.EvaluateInCell(cell) as ICell;
248                                 dr[j] = cell.ToString();
249                                 break;
250                             default:
251                                 throw new NotSupportedException(string.Format("Catched unhandle CellType[{0}]", cell.CellType));
252                         }
253                     }
254                 }
255             }
256         }
257 
258         private static int GetCellCount(ISheet sheet)
259         {
260             int firstRowNum = sheet.FirstRowNum;
261 
262             int cellCount = 0;
263 
264             for (int i = sheet.FirstRowNum; i <= sheet.LastRowNum; ++i)
265             {
266                 IRow row = sheet.GetRow(i) as IRow;
267 
268                 if (row != null && row.LastCellNum > cellCount)
269                 {
270                     cellCount = row.LastCellNum;
271                 }
272             }
273 
274             return cellCount;
275         }
276     }
277 }
原文地址:https://www.cnblogs.com/plain-heart/p/3590122.html