ExcelHandler.cs 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. using System.IO;
  2. using System.Data;
  3. using System;
  4. using NPOI.HSSF.UserModel;
  5. using NPOI.SS.UserModel;
  6. using NPOI.HSSF.Util;
  7. using NPOI.SS.Formula.Eval;
  8. namespace UAS_MES.DataOperate
  9. {
  10. class ExcelHandler
  11. {
  12. DataHelper dh = new DataHelper();
  13. /// <summary>
  14. /// 导出Excel,返回文件在客户端的路径
  15. /// </summary>
  16. public string ExportExcel(DataTable dt, string FolderPath)
  17. {
  18. //创建一个内存流,用来接收转换成Excel的内容
  19. MemoryStream ms;
  20. ms = DataTableToExcel(dt);
  21. //以系统当前时间命名文件,FileMode.Create表示创建文件,FileAccess.Write表示拥有写的权限
  22. string filePath = @FolderPath + "\\" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".xls";
  23. FileStream fs = new FileStream(filePath, FileMode.Create, FileAccess.Write);
  24. byte[] data = ms.ToArray();
  25. fs.Write(data, 0, data.Length);
  26. fs.Flush();
  27. //释放当前Excel文件,否则打开文件的时候会显示文件被占用
  28. ms.Dispose();
  29. fs.Dispose();
  30. return filePath;
  31. }
  32. /// <summary>
  33. /// 导入Excel
  34. /// </summary>
  35. public DataTable ImportExcel(string FolderPath, string TableName)
  36. {
  37. DataTable dt = new DataTable();
  38. dt.TableName = TableName;
  39. if (FolderPath.Contains(".xls") || FolderPath.Contains(".xlsx"))
  40. {
  41. using (FileStream file = new FileStream(FolderPath, FileMode.Open, FileAccess.Read))
  42. {
  43. //获取文件流
  44. HSSFWorkbook workbook = new HSSFWorkbook(file);
  45. ISheet sheet = workbook.GetSheetAt(0);
  46. //获取所有的列名
  47. foreach (ICell item in sheet.GetRow(sheet.FirstRowNum).Cells)
  48. {
  49. dt.Columns.Add(item.ToString(), typeof(string));
  50. }
  51. System.Collections.IEnumerator rows = sheet.GetRowEnumerator();
  52. while (rows.MoveNext())
  53. {
  54. IRow row = (HSSFRow)rows.Current;
  55. if (row.RowNum == sheet.FirstRowNum)
  56. {
  57. continue;
  58. }
  59. DataRow dr = dt.NewRow();
  60. foreach (ICell item in row.Cells)
  61. {
  62. switch (item.CellType)
  63. {
  64. case CellType.BOOLEAN:
  65. dr[item.ColumnIndex] = item.BooleanCellValue;
  66. break;
  67. case CellType.ERROR:
  68. dr[item.ColumnIndex] = ErrorEval.GetText(item.ErrorCellValue);
  69. break;
  70. case CellType.FORMULA:
  71. switch (item.CachedFormulaResultType)
  72. {
  73. case CellType.BOOLEAN:
  74. dr[item.ColumnIndex] = item.BooleanCellValue;
  75. break;
  76. case CellType.ERROR:
  77. dr[item.ColumnIndex] = ErrorEval.GetText(item.ErrorCellValue);
  78. break;
  79. case CellType.NUMERIC:
  80. if (DateUtil.IsCellDateFormatted(item))
  81. {
  82. dr[item.ColumnIndex] = item.DateCellValue.ToString("yyyy-MM-dd hh:MM:ss");
  83. }
  84. else
  85. {
  86. dr[item.ColumnIndex] = item.NumericCellValue;
  87. }
  88. break;
  89. case CellType.STRING:
  90. string str = item.StringCellValue;
  91. if (!string.IsNullOrEmpty(str))
  92. {
  93. dr[item.ColumnIndex] = str.ToString();
  94. }
  95. else
  96. {
  97. dr[item.ColumnIndex] = null;
  98. }
  99. break;
  100. case CellType.Unknown:
  101. case CellType.BLANK:
  102. default:
  103. dr[item.ColumnIndex] = string.Empty;
  104. break;
  105. }
  106. break;
  107. case CellType.NUMERIC:
  108. if (DateUtil.IsCellDateFormatted(item))
  109. {
  110. dr[item.ColumnIndex] = item.DateCellValue.ToString("yyyy-MM-dd hh:MM:ss");
  111. }
  112. else
  113. {
  114. dr[item.ColumnIndex] = item.NumericCellValue;
  115. }
  116. break;
  117. case CellType.STRING:
  118. string strValue = item.StringCellValue;
  119. if (string.IsNullOrEmpty(strValue))
  120. {
  121. dr[item.ColumnIndex] = strValue.ToString();
  122. }
  123. else
  124. {
  125. dr[item.ColumnIndex] = null;
  126. }
  127. break;
  128. case CellType.Unknown:
  129. case CellType.BLANK:
  130. default:
  131. dr[item.ColumnIndex] = string.Empty;
  132. break;
  133. }
  134. }
  135. dt.Rows.Add(dr);
  136. }
  137. }
  138. }
  139. return dt;
  140. }
  141. /// <summary>
  142. /// 将DataTable形式的数据转成Excel格式的,然后用字节流的形式写入文件
  143. /// </summary>
  144. /// <param name="DataTable"></param>
  145. /// <returns></returns>
  146. public MemoryStream DataTableToExcel(DataTable DataTable)
  147. {
  148. //创建内存流
  149. MemoryStream ms = new MemoryStream();
  150. //创建一个Book,相当于一个Excel文件
  151. HSSFWorkbook book = new HSSFWorkbook();
  152. //Excel中的Sheet
  153. ISheet sheet = book.CreateSheet("sheet1");
  154. //获取行数量和列数量
  155. int rowNum = DataTable.Rows.Count;
  156. int columnNum = DataTable.Columns.Count;
  157. //设置列的宽度,根据首行的列的内容的长度来设置
  158. for (int i = 0; i < columnNum; i++)
  159. {
  160. int dataLength = DataTable.Columns[i].ColumnName.Length;
  161. sheet.SetColumnWidth(i, dataLength * 700);
  162. }
  163. //首先画好第一行带颜色的,单独写出来,避免写在循环里面
  164. IRow row = sheet.CreateRow(0);
  165. //冻结第一行
  166. sheet.CreateFreezePane(0, 1, 0, 1);
  167. ICellStyle style = book.CreateCellStyle();
  168. style.FillForegroundColor = HSSFColor.PALE_BLUE.index;
  169. style.FillPattern = FillPatternType.BIG_SPOTS;
  170. style.FillBackgroundColor = HSSFColor.LIGHT_GREEN.index;
  171. //设置边框
  172. style.BorderBottom = BorderStyle.THICK;
  173. style.BorderLeft = BorderStyle.THICK;
  174. style.BorderRight = BorderStyle.THICK;
  175. style.BorderTop = BorderStyle.THICK;
  176. row.HeightInPoints = 20;
  177. //固定第一行
  178. //row.RowStyle.IsLocked=true;
  179. //给第一行的标签赋值样式和值
  180. for (int j = 0; j < columnNum; j++)
  181. {
  182. row.CreateCell(j);
  183. row.Cells[j].CellStyle = style;
  184. row.Cells[j].CellStyle.VerticalAlignment = VerticalAlignment.CENTER;
  185. row.Cells[j].CellStyle.Alignment = HorizontalAlignment.CENTER;
  186. row.Cells[j].SetCellValue(DataTable.Columns[j].ColumnName);
  187. }
  188. //将DataTable的值循环赋值给book,Aligment设置居中
  189. //之前已经画了带颜色的第一行,所以从i=1开始画
  190. for (int i = 0; i < rowNum; i++)
  191. {
  192. IRow row1 = sheet.CreateRow(i + 1);
  193. row1.HeightInPoints = 20;
  194. for (int j = 0; j < columnNum; j++)
  195. {
  196. row1.CreateCell(j);
  197. row1.Cells[j].SetCellValue(DataTable.Rows[i][j].ToString());
  198. row1.GetCell(j).CellStyle.VerticalAlignment = VerticalAlignment.CENTER;
  199. }
  200. }
  201. //将book的内容写入内存流中返回
  202. book.Write(ms);
  203. return ms;
  204. }
  205. }
  206. }