参考文档有:
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; } }