參考文檔有:
https://www.cnblogs.com/gossip/p/4307486.html
https://bbs.csdn.net/topics/391042064?page=1
效果圖:
需求分析:導出數據時能夠導出一段時間段內的所有產品質量數據,要求每天的數據放到一個Excel文件中,每天所有總成的數據按總成划分,每個總成一個工作簿,以此類推,導出后壓縮到文件夾中返回到瀏覽器供用戶查看。因為會存在某日沒有生產數據,但依然要導出Excel文件,起初的效果如下圖所示,為空白工作簿,沒有一個單元格。對於沒有數據的Excel導出文檔當然還是要有表頭和單元格的,如果能加上“無數據”的說明,就更人性化了
/// <summary> /// 每日所有數據按每個總成一個工作簿導出到excel中 /// </summary> /// <param name="exportDataList">某日的excel數據內容</param> /// <param name="fieldInfies">excel表頭</param> /// <returns></returns> public static HSSFWorkbook createHSSFWorkbook_Day(Dictionary<string, List<T>> exportDataList, List<ExportFieldInfo> fieldInfies) { HSSFWorkbook book = new HSSFWorkbook(); try { if (exportDataList.Count != 0) { foreach (var items in exportDataList) { ISheet sheet = book.CreateSheet(items.Key); IRow rowTitle = sheet.CreateRow(0); IRow rowtemp; for (int k = 0; k < fieldInfies.Count; k++) { rowTitle.CreateCell(k).SetCellValue(fieldInfies.ElementAt(k).DisplayName); } for (int j = 0; j < items.Value.Count; j++) { object tempobj = items.Value[j]; //獲取類型 Type type = tempobj.GetType(); List<System.Reflection.PropertyInfo> ps = type.GetProperties().ToList(); //將數據寫入sheet各個行 rowtemp = sheet.CreateRow(j + 1); for (int k = 0; k < fieldInfies.Count; k++) { //獲取屬性值 var value = ps.First(t => t.Name == fieldInfies.ElementAt(k).FieldName).GetValue(tempobj, null); switch (fieldInfies.ElementAt(k).DataType) { case DataTypeEnum.Int: rowtemp.CreateCell(k).SetCellValue(Convert.ToInt32(value)); break; case DataTypeEnum.Float: rowtemp.CreateCell(k).SetCellValue(Convert.ToDouble(value)); break; case DataTypeEnum.Double: rowtemp.CreateCell(k).SetCellValue(Convert.ToDouble(value)); break; case DataTypeEnum.String: rowtemp.CreateCell(k).SetCellValue(Convert.ToString(value)); break; case DataTypeEnum.DateTime: rowtemp.CreateCell(k).SetCellValue(Convert.ToDateTime(value).ToString("yyyy-MM-dd HH:mm:ss.SSS")); break; case DataTypeEnum.Date: rowtemp.CreateCell(k).SetCellValue(Convert.ToDateTime(value).ToString("yyyy-MM-dd")); break; default: break; } } tempobj = null; ps = null; } } } else {
//這段代碼為“無數據”情況下的特殊處理
//創建一個名稱為“Sheet1”的工作簿 ISheet sheet = book.CreateSheet("Sheet1");
//創建2行 IRow rowTitle = sheet.CreateRow(0); IRow rowtemp = sheet.CreateRow(1);
//給工作簿添加表頭 for (int k = 0; k < fieldInfies.Count; k++) { rowTitle.CreateCell(k).SetCellValue(fieldInfies.ElementAt(k).DisplayName); }
//給第二行第一列的單元格賦值“無數據” rowtemp.CreateCell(0).SetCellValue("無數據!");
//創建單元格樣式 HSSFCellStyle fCellStyle = (HSSFCellStyle)book.CreateCellStyle();
//創建字體 HSSFFont ffont = (HSSFFont)book.CreateFont();
//給字體設置顏色 ffont.Color = HSSFColor.Red.Index;
//給樣式添加字體 fCellStyle.SetFont(ffont);
//給第二行第一列單元格添加樣式 rowtemp.GetCell(0).CellStyle = fCellStyle; } } catch(Exception ex) { Console.WriteLine(ex.Message); } return book; } }