public void writeExcelXLSX(HttpServletResponse response, BasicIndicatorDTO dto) {
try {
// ServletOutputStream os = response.getOutputStream();
Integer type = dto.getType();
String areaCode = dto.getAreaCode();
LoginManagerUser user = LoginManagerUser.getLoginManagerUser();
// if (user != null && !UserEnums.USER_TYPE_SYSTEM.getKey().equals(user.getUserType())) {
// areaCode = user.getHospitalInformation().getTownshipCode();
// }
List<CdClinicBasicIndicator> indicators = this.lambdaQuery()
.eq(StringUtil.isNotEmpty(areaCode), CdClinicBasicIndicator::getAreaCode, areaCode)
.eq(CdClinicBasicIndicator::getBasicType, type)
.eq(CdClinicBasicIndicator::getBasicYear, LocalDate.now().getYear())
.list();
List<String> title = new ArrayList<>();
String zeroCell [] = {"签约情况","慢病管理情况","基层就诊情况"};
String twoCell [] = {"65岁以上老人签约人数","慢病签约人数","高血压签约人数","2型糖尿病患者签约人数","高脂血症签约人数",
"慢病签约率","慢病签约增长率","慢病管理总人数","高血压管理人数","2型糖尿病患者管理人数","高脂血症管理人数","多类合并慢病人数",
"","","","血压控制率","血糖控制率","血脂控制率","慢病就诊人次","慢病基层就诊人次","上级医院就诊人次",
"慢病基层医生就诊率","慢病基层签约医生就诊率","下转人次","上转人次"};
if (DefaultConstants.NO.equals(type)) {
String arr[] = {"指标类别","指标名称","","1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"};
title = Arrays.asList(arr);
}else if (DefaultConstants.YES.equals(type)){
String arr[] = {"指标类别","指标名称","","第一季度","第二季度","第三季度","第四季度"};
title = Arrays.asList(arr);
}else if (DefaultConstants.TWO.equals(type)) {
String arr[] = {"指标类别","指标名称","",LocalDate.now().getYear()+"年"};
title = Arrays.asList(arr);
}
// 第一步,创建一个webbook,对应一个Excel文件
SXSSFWorkbook workbook = new SXSSFWorkbook();
// 第二步,在webbook中添加一个sheet,对应Excel文件中的sheet
SXSSFSheet sheet = workbook.createSheet("基础指标");
// 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制short
SXSSFRow row = sheet.createRow(0);
// 第四步,创建单元格,并设置值表头 设置表头居中
CellStyle style = workbook.createCellStyle();
// 创建一个居中格式
style.setAlignment(HorizontalAlignment.CENTER);
//合并单元格
//签约情况
CellRangeAddress addresses = new CellRangeAddress(1,7,0,0);
//慢病管理情况
CellRangeAddress addresses2 = new CellRangeAddress(8,18,0,0);
//多类合并慢病人数
CellRangeAddress addresses3 = new CellRangeAddress(12,15,1,1);
//基层就诊情况
CellRangeAddress addresses4 = new CellRangeAddress(19,25,0,0);
sheet.addMergedRegion(addresses);
sheet.addMergedRegion(addresses2);
sheet.addMergedRegion(addresses3);
sheet.addMergedRegion(addresses4);
//指标名称合并占两列
for (int i=0; i <= 11; i++) {
CellRangeAddress addressesIndex = new CellRangeAddress(i,i,1,2);
sheet.addMergedRegion(addressesIndex);
}
//指标名称合并占两列
for (int i=16; i <= 25; i++) {
CellRangeAddress addressesIndex = new CellRangeAddress(i,i,1,2);
sheet.addMergedRegion(addressesIndex);
}
//设置0行表头
for (int i = 0; i < title.size(); i++) {
//创建单元格,row是前面创建的第0行,所以这个是0行0列
SXSSFCell cell = row.createCell(i);
cell.setCellValue(title.get(i));
cell.setCellStyle(style);
}
//指标名称(第1列)名
for (int i = 1; i <= twoCell.length; i++) {
//每一行第一列
SXSSFRow row1 = sheet.createRow(i);
// 创建单元格,并设置值
row1.createCell(1).setCellValue(twoCell[i-1]);
}
// 创建单元格,并设置值 (sheet.createRow 会覆盖上面的行数据)
//第1行0列
SXSSFRow row1 = sheet.createRow(1);
row1.createCell(0).setCellValue(zeroCell[0]);
row1.createCell(1).setCellValue("65岁以上老人签约人数");
//8行 0列
row1 = sheet.createRow(8);
// 创建单元格,并设置值
row1.createCell(0).setCellValue(zeroCell[1]);
row1.createCell(1).setCellValue("慢病管理总人数");
//19行0列
row1 = sheet.createRow(19);
// 创建单元格,并设置值
row1.createCell(0).setCellValue(zeroCell[2]);
row1.createCell(1).setCellValue("慢病就诊人次");
//创建新行
row1 = sheet.createRow(12);
row1.createCell(1).setCellValue("多类合并慢病人数");
row1.createCell(2).setCellValue("高并糖");
//创建新行
row1 = sheet.createRow(13);
// 创建单元格,并设置值
row1.createCell(2).setCellValue("高并脂");
//创建新行
row1 = sheet.createRow(14);
// 创建单元格,并设置值
row1.createCell(2).setCellValue("糖并脂");
//创建新行
row1 = sheet.createRow(15);
// 创建单元格,并设置值
row1.createCell(2).setCellValue("高并糖并脂人数");
// 第五步,写入实体数据 实际应用中这些数据从数据库得到,
Map<Integer, CdClinicBasicIndicator> baseMap = indicators.stream()
.collect(Collectors.toMap(CdClinicBasicIndicator::getBasicDate, Function.identity()));
//横坐标 1-12月 循环次数
Integer startIndex = 1;
Integer endIndex = 12;
if (DefaultConstants.YES.equals(type)) {
//1-4季度
endIndex = 4;
}else if (DefaultConstants.TWO.equals(type)) {
//今年
endIndex = 1;
}
for (Integer i = startIndex; i<=endIndex; i++) {
CdClinicBasicIndicator indicator = baseMap.get(i);
//年
if (DefaultConstants.TWO.equals(type)) {
indicator = baseMap.get(LocalDate.now().getYear());
}
if (indicator != null) {
sheet.getRow(1)
.createCell(i+2)
.setCellValue(indicator.getOldSignNum());
sheet.getRow(2)
.createCell(i+2)
.setCellValue(indicator.getChronicSignNum());
sheet.getRow(3)
.createCell(i+2)
.setCellValue(indicator.getHbpSignNum());
sheet.getRow(4)
.createCell(i+2)
.setCellValue(indicator.getDmSignNum());
sheet.getRow(5)
.createCell(i+2)
.setCellValue(indicator.getBfSignNum());
sheet.getRow(6)
.createCell(i+2)
.setCellValue(indicator.getChronicSignRate());
sheet.getRow(7)
.createCell(i+2)
.setCellValue(indicator.getChronicSignAddRate());
sheet.getRow(8)
.createCell(i+2)
.setCellValue(indicator.getChronicNum());
sheet.getRow(9)
.createCell(i+2)
.setCellValue(indicator.getHbpNum());
sheet.getRow(10)
.createCell(i+2)
.setCellValue(indicator.getDmNum());
sheet.getRow(11)
.createCell(i+2)
.setCellValue(indicator.getBfNum());
sheet.getRow(12)
.createCell(i+2)
.setCellValue(indicator.getHbpDmNum());
sheet.getRow(13)
.createCell(i+2)
.setCellValue(indicator.getHbpBfNum());
sheet.getRow(14)
.createCell(i+2)
.setCellValue(indicator.getDmBfNum());
sheet.getRow(15)
.createCell(i+2)
.setCellValue(indicator.getHbpDmBfNum());
sheet.getRow(16)
.createCell(i+2)
.setCellValue(indicator.getHbpControlRate());
sheet.getRow(17)
.createCell(i+2)
.setCellValue(indicator.getDmControlRate());
sheet.getRow(18)
.createCell(i+2)
.setCellValue(indicator.getBfControlRate());
sheet.getRow(19)
.createCell(i+2)
.setCellValue(indicator.getChronicVisitNum());
sheet.getRow(20)
.createCell(i+2)
.setCellValue(indicator.getChronicBasicVisitNum());
sheet.getRow(21)
.createCell(i+2)
.setCellValue(indicator.getChronicSuperiorVisitNum());
sheet.getRow(22)
.createCell(i+2)
.setCellValue(indicator.getChronicBasicVisitRate());
sheet.getRow(23)
.createCell(i+2)
.setCellValue(indicator.getChronicBasicSignVisitRate());
sheet.getRow(24)
.createCell(i+2)
.setCellValue(indicator.getDownTurnNum());
sheet.getRow(25)
.createCell(i+2)
.setCellValue(indicator.getUploadNum());
}
}
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH-mm-ss");
// 第六步,将文件存到指定位置
FileOutputStream fout = new FileOutputStream("d:/students"+simpleDateFormat.format(new Date())+".xlsx");
workbook.write(fout);
workbook.close();
fout.close();
}catch (Exception e) {
log.error("内部错误", e);
}
}
最终样式
数据库格式