1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using NPOI.SS.UserModel; 6 using NPOI.XSSF.UserModel; 7 using NPOI.HSSF.UserModel; 8 using System.IO; 9 using System.Data; 10 11 namespace NetUtilityLib 12 { 13 public class ExcelHelper : IDisposable 14 { 15 private string fileName = null; //文件名 16 private IWorkbook workbook = null; 17 private FileStream fs = null; 18 private bool disposed; 19 20 public ExcelHelper(string fileName) 21 { 22 this.fileName = fileName; 23 disposed = false; 24 } 25 26 /// <summary> 27 /// 将DataTable数据导入到excel中 28 /// </summary> 29 /// <param name="data">要导入的数据</param> 30 /// <param name="isColumnWritten">DataTable的列名是否要导入</param> 31 /// <param name="sheetName">要导入的excel的sheet的名称</param> 32 /// <returns>导入数据行数(包含列名那一行)</returns> 33 public int DataTableToExcel(DataTable data, string sheetName, bool isColumnWritten) 34 { 35 int i = 0; 36 int j = 0; 37 int count = 0; 38 ISheet sheet = null; 39 40 fs = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite); 41 if (fileName.IndexOf(".xlsx") > 0) // 2007版本 42 workbook = new XSSFWorkbook(); 43 else if (fileName.IndexOf(".xls") > 0) // 2003版本 44 workbook = new HSSFWorkbook(); 45 46 try 47 { 48 if (workbook != null) 49 { 50 sheet = workbook.CreateSheet(sheetName); 51 } 52 else 53 { 54 return -1; 55 } 56 57 if (isColumnWritten == true) //写入DataTable的列名 58 { 59 IRow row = sheet.CreateRow(0); 60 for (j = 0; j < data.Columns.Count; ++j) 61 { 62 row.CreateCell(j).SetCellValue(data.Columns[j].ColumnName); 63 } 64 count = 1; 65 } 66 else 67 { 68 count = 0; 69 } 70 71 for (i = 0; i < data.Rows.Count; ++i) 72 { 73 IRow row = sheet.CreateRow(count); 74 for (j = 0; j < data.Columns.Count; ++j) 75 { 76 row.CreateCell(j).SetCellValue(data.Rows[i][j].ToString()); 77 } 78 ++count; 79 } 80 workbook.Write(fs); //写入到excel 81 return count; 82 } 83 catch (Exception ex) 84 { 85 Console.WriteLine("Exception: " + ex.Message); 86 return -1; 87 } 88 } 89 90 /// <summary> 91 /// 将excel中的数据导入到DataTable中 92 /// </summary> 93 /// <param name="sheetName">excel工作薄sheet的名称</param> 94 /// <param name="isFirstRowColumn">第一行是否是DataTable的列名</param> 95 /// <returns>返回的DataTable</returns> 96 public DataTable ExcelToDataTable(string sheetName, bool isFirstRowColumn) 97 { 98 ISheet sheet = null; 99 DataTable data = new DataTable(); 100 int startRow = 0; 101 try 102 { 103 fs = new FileStream(fileName, FileMode.Open, FileAccess.Read); 104 if (fileName.IndexOf(".xlsx") > 0) // 2007版本 105 workbook = new XSSFWorkbook(fs); 106 else if (fileName.IndexOf(".xls") > 0) // 2003版本 107 workbook = new HSSFWorkbook(fs); 108 109 if (sheetName != null) 110 { 111 sheet = workbook.GetSheet(sheetName); 112 if (sheet == null) //如果没有找到指定的sheetName对应的sheet,则尝试获取第一个sheet 113 { 114 sheet = workbook.GetSheetAt(0); 115 } 116 } 117 else 118 { 119 sheet = workbook.GetSheetAt(0); 120 } 121 if (sheet != null) 122 { 123 IRow firstRow = sheet.GetRow(0); 124 int cellCount = firstRow.LastCellNum; //一行最后一个cell的编号 即总的列数 125 126 if (isFirstRowColumn) 127 { 128 for (int i = firstRow.FirstCellNum; i < cellCount; ++i) 129 { 130 ICell cell = firstRow.GetCell(i); 131 if (cell != null) 132 { 133 string cellValue = cell.StringCellValue; 134 if (cellValue != null) 135 { 136 DataColumn column = new DataColumn(cellValue); 137 data.Columns.Add(column); 138 } 139 } 140 } 141 startRow = sheet.FirstRowNum + 1; 142 } 143 else 144 { 145 startRow = sheet.FirstRowNum; 146 } 147 148 //最后一列的标号 149 int rowCount = sheet.LastRowNum; 150 for (int i = startRow; i <= rowCount; ++i) 151 { 152 IRow row = sheet.GetRow(i); 153 if (row == null) continue; //没有数据的行默认是null 154 155 DataRow dataRow = data.NewRow(); 156 for (int j = row.FirstCellNum; j < cellCount; ++j) 157 { 158 if (row.GetCell(j) != null) //同理,没有数据的单元格都默认是null 159 dataRow[j] = row.GetCell(j).ToString(); 160 } 161 data.Rows.Add(dataRow); 162 } 163 } 164 165 return data; 166 } 167 catch (Exception ex) 168 { 169 Console.WriteLine("Exception: " + ex.Message); 170 return null; 171 } 172 } 173 174 public void Dispose() 175 { 176 Dispose(true); 177 GC.SuppressFinalize(this); 178 } 179 180 protected virtual void Dispose(bool disposing) 181 { 182 if (!this.disposed) 183 { 184 if (disposing) 185 { 186 if (fs != null) 187 fs.Close(); 188 } 189 190 fs = null; 191 disposed = true; 192 } 193 } 194 } 195 }
时间: 2024-10-29 14:25:24