JAVA 导出Excel 带有多个公式函数
2021/11/26 17:12:47
本文主要是介绍JAVA 导出Excel 带有多个公式函数,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
Controller层
@ApiOperation(value = "限额配置-导出Excel") @GetMapping("/exportExcel") public byte[] exportExcel(@ApiParam(value = "用户iv-user Code", required = true) @RequestHeader(value = "iv-user") String userCode, @RequestParam @ApiParam(required = true, name = "targetId", value = "流程编号")String targetId, @RequestParam @ApiParam(required = true, name = "startPeriodId", value = "开始日期") Integer startPeriodId, @RequestParam @ApiParam(required = true, name = "endPeriodId", value = "结束日期") Integer endPeriodId, HttpServletResponse response) throws IOException { log.info("配置部门规划-净资本预算表-导出Excel | DeptConfigExcelController.exportExcel | 任务开始,流程编号:targetId=={}, 当前操作人:userCode==={}", targetId, userCode); HSSFWorkbook hwb = new HSSFWorkbook(); InputStream input = null; try { //根据用户code:userCode,获取该用户所属部门 FlowUser userInfo = deptConfigService.getUserInfo(userCode); String depName = userInfo.getDepartName(); log.info("配置部门规划-净资本预算表-导出Excel | 开始解析Excel, 流程编号:targetId=={}, 当前操作人所属部门:depName==={}", targetId, depName); response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(fileName, "utf-8")); OutputStream outputStream = response.getOutputStream(); //业务及资本规划表: ERMP_DATA.CAPTIAL_DEP_PROJ_BUSINESS // 根据流程编码:targetId 和 部门名称:depName 查库里是否有数据,有,就导出库里;无,导出项目中的excel文件 if(mapper.findProjCount("CAPTIAL_DEP_PROJ_BUSINESS", targetId, depName) > 0){ exportExcelService.exportExcel(depName, targetId, startPeriodId, endPeriodId, hwb); hwb.write(outputStream); }else{ //fileName:项目中的文件名称 Resource resource = new ClassPathResource("file/" + fileName + ".xlsx"); input = resource.getInputStream(); Workbook wb = WorkbookFactory.create(input); exportExcelService.exportExcelTemplate(depName, startPeriodId, endPeriodId, wb); wb.write(outputStream); } outputStream.close(); } catch (Exception e) { log.error("DeptConfigExcelController exportExcel fail.",e); throw new IOException("限额配置-净资本预算表-导出Excel | 导入Excel出现异常,异常信息:" + e.getMessage()); } finally { if (input != null) { IOUtils.closeQuietly(input); } } return hwb.getBytes(); }
Service层
package com.hs.report.service.impl.capitalallocation; import com.hs.report.enums.BusinessExcelEnum; import com.hs.report.mapper.ermp.CaptialDepProjMapper; import com.hs.report.oracle.dao.PeriodDimDao; import com.hs.report.service.capitalallocation.DeptConfigExportExcelService; import com.hs.report.view.capitalallocation.CaptialDepProjBusinessVO; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringUtils; import org.apache.poi.hssf.usermodel.*; import org.apache.poi.hssf.util.HSSFColor; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.ss.util.RegionUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; /** * 描述:净资本预算表 导出 * * @version 1.0 * @Author k0411242 * @Date 2021年11月23日 */ @Slf4j @Service public class DeptConfigExportExcelServiceImpl implements DeptConfigExportExcelService { private static final String TABLE_TITLE = "tableTitle"; private static final String BG_TABLE_CELL = "BGTableCell"; private static final String ALIGN_TABLE_CELL = "alignTableCell"; private static final String ALIGN_BOLD_TABLE_CELL = "alignBoldTableCell"; private static final String ALIGN_LEFT_TABLE_CELL = "alignLeftTableCell"; private static final String COLOR_YELLOW_TABLE_CELL = "colorYellowCell"; //Excel 需要标黄的单元格 private static final List<Integer> YELLOWCOLORS = Arrays.asList(8,13,26,35,47,54,59,63,64,65,69,76,80,83,84,90,96,100); //Excel 需要体积加粗的单元格 private static final List<Integer> BOLDS = Arrays.asList(63,80,83,96,99,100); @Autowired private PeriodDimDao periodDimDao; @Autowired private CaptialDepProjMapper mapper; @Override public void exportExcel(String depName, String targetId, Integer startPeriodId, Integer endPeriodId, HSSFWorkbook wb) { log.info("配置部门规划-净资本预算表-导出Excel | 任务开始,流程编号:targetId=={}, 部门名称:depName==={}", targetId, depName); //定义报表数据中的行数 int rownum = 0; //根据开始日期:startPeriodId 和结束日期:endPeriodId 获取月的个数以及所有月份 int periodCount = periodDimDao.queryYearMonthCount(startPeriodId, endPeriodId); List<Integer> periodList = periodDimDao.queryYearMonthList(startPeriodId, endPeriodId); //定义总列数 int columnNumber = 5 + periodCount*2; //给每一列设置大小值 int[] columnWidth = {50,19,19,19,19,19,19,10,10,10,75}; HSSFSheet sheet = wb.createSheet(depName); for(int i = 0; i < columnNumber; i++){ sheet.setColumnWidth(i,columnWidth[i] * 256); // 单独设置每列的宽 } //存储所有的样式 Map<String, HSSFCellStyle> cellStyleMap = getCellStyleMap(wb); //第一部分:1-6行,需要设置自动计算 int oneRowNum = getOneTable(rownum, columnNumber, depName, targetId, wb, sheet, periodList, cellStyleMap); //第二部分 第7行表头 int twoRowNum = getTwoTable(oneRowNum, columnNumber, depName, targetId, wb, sheet, periodList, cellStyleMap); //第三部分 第8行表头 int threeRowNum = getThreeTable(twoRowNum, columnNumber, depName, targetId, wb, sheet, periodList, cellStyleMap); //第四部分 第9行开始读取库里数据 getFourTable(threeRowNum, columnNumber, depName, targetId, wb, sheet, periodList, cellStyleMap); //设置第8行冻结 sheet.createFreezePane(11,8); //单元格添加 函数 有效 for(BusinessExcelEnum item : BusinessExcelEnum.values()) { HSSFRow row = sheet.getRow(item.getRow()); HSSFCell cellS = row.getCell(item.getCell()); //取得公式单元格的公式,重新设置 cellS.setCellFormula(item.getFunction()); } //强制让Excel Sheet 执行公式 wb.setForceFormulaRecalculation(true); } private void getFourTable(int rownum, int columnNumber, String depName, String targetId, HSSFWorkbook wb, HSSFSheet sheet, List<Integer> periodList, Map<String, HSSFCellStyle> styleMap) { //定义报表数据中的行数 rownum = rownum + 1; HSSFRow rowSubTitle; //根据流程编码:targetId 和 部门名称:depName 查库里数据 List<CaptialDepProjBusinessVO> projVOList = mapper.queryProjVOData(targetId, depName); for(int i = 0; i < projVOList.size(); i++){ CaptialDepProjBusinessVO voData = projVOList.get(i); rowSubTitle = sheet.createRow(i + rownum); HSSFCell datacell = null; //9-63行没有合并单元格,之后有合并单元格 //voData.getPx() 在 8-62之间没有单元格,大于62合并单元格 if(voData.getPx() >= 8 && voData.getPx() <= 62){ for (int j = 0; j < columnNumber; j++) { //第9行设置函数以及月份设置底色 if(voData.getPx() == 8 || voData.getPx() == 26){ //字体加粗 if(j == 0){ datacell = rowSubTitle.createCell(j); //设置单元格样式:字体加粗 靠左对齐 datacell.setCellStyle(styleMap.get(BG_TABLE_CELL)); datacell.setCellValue(getAllCellValue(voData, j)); } //月份单元格设置 if(j != 0 && j <= periodList.size()*2){ datacell = rowSubTitle.createCell(j); //设置单元格样式:添加底色 居中 datacell.setCellStyle(styleMap.get(COLOR_YELLOW_TABLE_CELL)); datacell.setCellValue(getAllCellValue(voData, j)); } if(j > periodList.size()*2){ datacell = rowSubTitle.createCell(j); if(j == columnNumber-1){ //设置单元格样式:字体非加粗 靠左对齐 datacell.setCellStyle(styleMap.get(ALIGN_LEFT_TABLE_CELL)); }else{ //设置单元格样式:字体非加粗 居中 datacell.setCellStyle(styleMap.get(ALIGN_BOLD_TABLE_CELL)); } datacell.setCellValue(getAllCellValue(voData, j)); } }else{ datacell = rowSubTitle.createCell(j); if(j == 0 || j == columnNumber-1){ //设置单元格样式:字体非加粗 靠左对齐 datacell.setCellStyle(styleMap.get(ALIGN_LEFT_TABLE_CELL)); }else{ //设置单元格样式:字体非加粗 居中 datacell.setCellStyle(styleMap.get(ALIGN_BOLD_TABLE_CELL)); } if(YELLOWCOLORS.contains(voData.getPx()) && j != 0 && j <= periodList.size()*2){ //设置单元格样式:添加底色 居中 datacell.setCellStyle(styleMap.get(COLOR_YELLOW_TABLE_CELL)); } if(j > 0 && j <= periodList.size()*2){ //函数 计算 需要返回数组类型 datacell.setCellValue(getDoubleCellValue(voData, j)); }else{ datacell.setCellValue(getAllCellValue(voData, j)); } } } }else{ //63行开始,月份部分有合并单元格 for (int j = 0; j < columnNumber; j++) { //合并单元格 if(j % 2 != 0 && j <= periodList.size()*2){ datacell = rowSubTitle.createCell(j); //函数 计算 需要返回数组类型 datacell.setCellValue(getDoubleCellValue(voData, j)); if(YELLOWCOLORS.contains(voData.getPx()) && j <= periodList.size() * 2){ //设置单元格样式:添加底色 居中 datacell.setCellStyle(styleMap.get(COLOR_YELLOW_TABLE_CELL)); }else{ //设置单元格样式:字体非加粗 居中 datacell.setCellStyle(styleMap.get(ALIGN_BOLD_TABLE_CELL)); } CellRangeAddress region = new CellRangeAddress(i + rownum,i + rownum,j,j + 1); sheet.addMergedRegion(region); setBorderStyle(HSSFCellStyle.BORDER_THIN, region, sheet, wb); //给合并过的单元格加边框 }else{ datacell = rowSubTitle.createCell(j); if(j == 0){ if(BOLDS.contains(voData.getPx())){ //设置单元格样式:字体加粗 靠左对齐 datacell.setCellStyle(styleMap.get(BG_TABLE_CELL)); }else{ //设置单元格样式:字体非加粗 靠左对齐 datacell.setCellStyle(styleMap.get(ALIGN_LEFT_TABLE_CELL)); } }else if(j == columnNumber-1){ //设置单元格样式:字体非加粗 靠左对齐 datacell.setCellStyle(styleMap.get(ALIGN_LEFT_TABLE_CELL)); }else{ //设置单元格样式:字体非加粗 居中 datacell.setCellStyle(styleMap.get(ALIGN_BOLD_TABLE_CELL)); } datacell.setCellValue(getAllCellValue(voData, j)); } } } } } private double getDoubleCellValue(CaptialDepProjBusinessVO voData, int cellIndex) { switch(cellIndex){ case 1: return getDoubleValue(voData.getVal1()); case 2: return getDoubleValue(voData.getVal2()); case 3: return getDoubleValue(voData.getVal3()); case 4: return getDoubleValue(voData.getVal4()); case 5: return getDoubleValue(voData.getVal5()); case 6: return getDoubleValue(voData.getVal6()); default: return 0.00; } } private double getDoubleValue(String val) { return StringUtils.isNotEmpty(val) ? Double.parseDouble(val) : 0.00; } private String getAllCellValue(CaptialDepProjBusinessVO voData, int cellIndex) { switch(cellIndex){ case 0: return voData.getProjName(); case 1: return voData.getVal1(); case 2: return voData.getVal2(); case 3: return voData.getVal3(); case 4: return voData.getVal4(); case 5: return voData.getVal5(); case 6: return voData.getVal6(); case 7: return voData.getCoefficient(); case 8: return voData.getStandard(); case 9: return voData.getTakeUp(); case 10: return voData.getRemark(); default: return ""; } } private int getThreeTable(int rownum, int columnNumber, String depName, String targetId, HSSFWorkbook wb, HSSFSheet sheet, List<Integer> periodList, Map<String, HSSFCellStyle> styleMap) { //定义报表数据中的行数 rownum = rownum + 1; // 创建表头单元格样式 以及表头的字体样式 //第8行表头 HSSFRow rowSubTitle = sheet.createRow(rownum); String[] subTitle = {"1. 市场风险资本准备", "未对冲", "已对冲", "未对冲", "已对冲", "未对冲", "已对冲", "", "\\", "", ""}; // 创建表头的列 for (int i = 0; i < columnNumber; i++) { HSSFCell cellRiskTitle = rowSubTitle.createCell(i); cellRiskTitle.setCellValue(subTitle[i]); if(i == 0){ //设置单元格样式:字体加粗 靠左对齐 cellRiskTitle.setCellStyle(styleMap.get(BG_TABLE_CELL)); }else{ cellRiskTitle.setCellStyle(styleMap.get(ALIGN_TABLE_CELL)); } } return rownum; } private int getTwoTable(int rownum, int columnNumber, String depName, String targetId, HSSFWorkbook wb, HSSFSheet sheet, List<Integer> periodList, Map<String, HSSFCellStyle> styleMap) { // 创建表头单元格样式 以及表头的字体样式 //第7行表头 HSSFRow rowSubTitle = sheet.createRow(rownum); rowSubTitle.setHeightInPoints(40); String[] subTitle = {"业务项目(填报非标黄行)", getCellValue(String.valueOf(periodList.get(0))), "", getCellValue(String.valueOf(periodList.get(1))), "", getCellValue(String.valueOf(periodList.get(2))), "", "净资本计算系数", "计算标准", "本期净资本占用", "备注"}; // 创建表头的列 for (int i = 0; i < columnNumber; i++) { //合并单元格 if(i % 2 != 0 && i < periodList.size()*2){ HSSFCell cellChangeTitle = rowSubTitle.createCell(i); cellChangeTitle.setCellValue(subTitle[i]); cellChangeTitle.setCellStyle(styleMap.get(TABLE_TITLE)); CellRangeAddress region = new CellRangeAddress(rownum,rownum,i,i + 1); sheet.addMergedRegion(region); setBorderStyle(HSSFCellStyle.BORDER_THIN, region, sheet, wb); //给合并过的单元格加边框 }else{ HSSFCell cellRiskTitle = rowSubTitle.createCell(i); cellRiskTitle.setCellValue(subTitle[i]); cellRiskTitle.setCellStyle(styleMap.get(TABLE_TITLE)); } } return rownum; } private int getOneTable(int rownum, int columnNumber, String depName, String targetId, HSSFWorkbook wb, HSSFSheet sheet, List<Integer> periodList, Map<String, HSSFCellStyle> styleMap) { // 创建表头单元格样式 以及表头的字体样式 HSSFRow rowSubTitle = sheet.createRow(rownum); rowSubTitle.setHeightInPoints(20); String[] subTitle = {"业务规划结果(自动计算)", getCellValue(String.valueOf(periodList.get(0))), getCellValue(String.valueOf(periodList.get(1))), getCellValue(String.valueOf(periodList.get(2)))}; // 创建表头的列 for (int i = 0; i < columnNumber-4; i++) { if(i == 0){ HSSFCell cellRiskTitle = rowSubTitle.createCell(i); cellRiskTitle.setCellValue(subTitle[i]); cellRiskTitle.setCellStyle(styleMap.get(TABLE_TITLE)); } //合并单元格 if(i % 2 != 0){ HSSFCell cellChangeTitle = rowSubTitle.createCell(i); cellChangeTitle.setCellValue(subTitle[(i+1) / 2]); cellChangeTitle.setCellStyle(styleMap.get(TABLE_TITLE)); CellRangeAddress region = new CellRangeAddress(rownum,rownum,i,i + 1); sheet.addMergedRegion(region); setBorderStyle(HSSFCellStyle.BORDER_THIN, region, sheet, wb); //给合并过的单元格加边框 } } //根据流程编码:targetId 和 部门名称:depName 查库里数据 List<CaptialDepProjBusinessVO> projVOList = mapper.queryProjVOTopData(targetId, depName); //创建单元格,并设置值 rownum = rownum + 1; for(int i = 0; i < projVOList.size(); i++){ CaptialDepProjBusinessVO voData = projVOList.get(i); rowSubTitle = sheet.createRow(i + rownum); HSSFCell datacell = null; for (int j = 0; j < columnNumber-4; j++) { if(j == 0){ datacell = rowSubTitle.createCell(j); //设置单元格样式:字体加粗 靠左对齐 datacell.setCellStyle(styleMap.get(BG_TABLE_CELL)); datacell.setCellValue(voData.getProjName()); } //合并单元格 if(j % 2 != 0){ datacell = rowSubTitle.createCell(j); datacell.setCellStyle(styleMap.get(ALIGN_TABLE_CELL)); datacell.setCellValue(getAllCellValue(voData, j)); CellRangeAddress region = new CellRangeAddress(i + rownum,i + rownum,j,j + 1); sheet.addMergedRegion(region); setBorderStyle(HSSFCellStyle.BORDER_THIN, region, sheet, wb); //给合并过的单元格加边框 } } } return rownum + projVOList.size(); } //给合并后的单元格加样式 public void setBorderStyle(int border, CellRangeAddress region, HSSFSheet sheet, HSSFWorkbook wb){ RegionUtil.setBorderBottom(border, region, sheet, wb); //下边框 RegionUtil.setBorderLeft(border, region, sheet, wb); //左边框 RegionUtil.setBorderRight(border, region, sheet, wb); //右边框 RegionUtil.setBorderTop(border, region, sheet, wb); //上边框 } private Map<String, HSSFCellStyle> getCellStyleMap(HSSFWorkbook wb){ Map<String, HSSFCellStyle> styleMap = new HashMap<>(); styleMap.put(TABLE_TITLE, createTableTitleStyle(wb)); styleMap.put(BG_TABLE_CELL, createBGTableCellStyle(wb)); styleMap.put(ALIGN_TABLE_CELL, createAlignTableCellStyle(wb)); styleMap.put(ALIGN_BOLD_TABLE_CELL, createAlignBoldTableCellStyle(wb)); styleMap.put(ALIGN_LEFT_TABLE_CELL, createAlignLeftTableCellStyle(wb)); styleMap.put(COLOR_YELLOW_TABLE_CELL, createYellowTitleStyle(wb)); return styleMap; } //创建表头单元格样式 以及表头的字体样式 private HSSFCellStyle createTableTitleStyle(HSSFWorkbook wb){ HSSFCellStyle style = wb.createCellStyle(); style.setAlignment(HSSFCellStyle.ALIGN_CENTER); style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); style.setFillForegroundColor(HSSFColor.DARK_YELLOW.index);//添加背景色 style.setBottomBorderColor(HSSFColor.BLACK.index); style.setBorderBottom(HSSFCellStyle.BORDER_THIN); style.setBorderLeft(HSSFCellStyle.BORDER_THIN); style.setBorderRight(HSSFCellStyle.BORDER_THIN); style.setBorderTop(HSSFCellStyle.BORDER_THIN); style.setWrapText(true); //设置自动换行 HSSFFont titleFont = (HSSFFont) wb.createFont(); titleFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); titleFont.setFontName("宋体"); titleFont.setFontHeightInPoints((short) 9); style.setFont(titleFont); return style; } //创建数据单元格样式 以及字体样式 private HSSFCellStyle createBGTableCellStyle(HSSFWorkbook wb){ HSSFCellStyle style = wb.createCellStyle(); style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); style.setBottomBorderColor(HSSFColor.BLACK.index); style.setBorderBottom(HSSFCellStyle.BORDER_THIN); style.setBorderLeft(HSSFCellStyle.BORDER_THIN); style.setBorderRight(HSSFCellStyle.BORDER_THIN); style.setBorderTop(HSSFCellStyle.BORDER_THIN); style.setWrapText(true); //设置自动换行 HSSFFont titleFont = (HSSFFont) wb.createFont(); titleFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);//字体加粗 titleFont.setFontName("宋体"); titleFont.setFontHeightInPoints((short) 9); style.setFont(titleFont); return style; } //创建数据单元格样式 以及字体样式 数据居中 private HSSFCellStyle createAlignTableCellStyle(HSSFWorkbook wb){ HSSFCellStyle style = wb.createCellStyle(); style.setAlignment(HSSFCellStyle.ALIGN_CENTER); style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); style.setBottomBorderColor(HSSFColor.BLACK.index); style.setBorderBottom(HSSFCellStyle.BORDER_THIN); style.setBorderLeft(HSSFCellStyle.BORDER_THIN); style.setBorderRight(HSSFCellStyle.BORDER_THIN); style.setBorderTop(HSSFCellStyle.BORDER_THIN); style.setWrapText(true); //设置自动换行 //保留两位小数 HSSFDataFormat format= wb.createDataFormat(); style.setDataFormat(format.getFormat("#,##0.00")); HSSFFont titleFont = (HSSFFont) wb.createFont(); titleFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);//字体加粗 titleFont.setFontName("宋体"); titleFont.setFontHeightInPoints((short) 9); style.setFont(titleFont); return style; } //创建数据单元格样式 以及字体样式 字体不加粗居中 private HSSFCellStyle createAlignBoldTableCellStyle(HSSFWorkbook wb){ HSSFCellStyle style = wb.createCellStyle(); style.setAlignment(HSSFCellStyle.ALIGN_CENTER); style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); style.setBottomBorderColor(HSSFColor.BLACK.index); style.setBorderBottom(HSSFCellStyle.BORDER_THIN); style.setBorderLeft(HSSFCellStyle.BORDER_THIN); style.setBorderRight(HSSFCellStyle.BORDER_THIN); style.setBorderTop(HSSFCellStyle.BORDER_THIN); style.setWrapText(true); //设置自动换行 //保留两位小数 HSSFDataFormat format= wb.createDataFormat(); style.setDataFormat(format.getFormat("#,##0.00")); HSSFFont titleFont = (HSSFFont) wb.createFont(); titleFont.setFontName("宋体"); titleFont.setFontHeightInPoints((short) 9); style.setFont(titleFont); return style; } //创建单元格样式 单元格添加黄色 private HSSFCellStyle createYellowTitleStyle(HSSFWorkbook wb){ HSSFCellStyle style = wb.createCellStyle(); style.setAlignment(HSSFCellStyle.ALIGN_CENTER); style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); style.setFillForegroundColor(HSSFColor.YELLOW.index);//添加背景色 style.setBottomBorderColor(HSSFColor.BLACK.index); style.setBorderBottom(HSSFCellStyle.BORDER_THIN); style.setBorderLeft(HSSFCellStyle.BORDER_THIN); style.setBorderRight(HSSFCellStyle.BORDER_THIN); style.setBorderTop(HSSFCellStyle.BORDER_THIN); style.setWrapText(true); //设置自动换行 //保留两位小数 HSSFDataFormat format= wb.createDataFormat(); style.setDataFormat(format.getFormat("#,##0.00")); HSSFFont titleFont = (HSSFFont) wb.createFont(); titleFont.setFontName("宋体"); titleFont.setFontHeightInPoints((short) 9); style.setFont(titleFont); return style; } //创建数据单元格样式 以及字体样式 字体不加粗 private HSSFCellStyle createAlignLeftTableCellStyle(HSSFWorkbook wb){ HSSFCellStyle style = wb.createCellStyle(); style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); style.setBottomBorderColor(HSSFColor.BLACK.index); style.setBorderBottom(HSSFCellStyle.BORDER_THIN); style.setBorderLeft(HSSFCellStyle.BORDER_THIN); style.setBorderRight(HSSFCellStyle.BORDER_THIN); style.setBorderTop(HSSFCellStyle.BORDER_THIN); style.setWrapText(true); //设置自动换行 //保留两位小数 HSSFDataFormat format= wb.createDataFormat(); style.setDataFormat(format.getFormat("#,##0.00")); HSSFFont titleFont = (HSSFFont) wb.createFont(); titleFont.setFontName("宋体"); titleFont.setFontHeightInPoints((short) 9); style.setFont(titleFont); return style; } @Override public void exportExcelTemplate(String depName, Integer startPeriodId, Integer endPeriodId, Workbook wb) { log.info("限额配置-净资本预算表-导出Excel | 任务开始, 部门名称:depName==={}", depName); List<Integer> periodList = periodDimDao.queryYearMonthList(startPeriodId, endPeriodId); Sheet sheet = wb.getSheetAt(0); wb.setSheetName(0,depName); //重新设置单元格的值 Cell cell1 = sheet.getRow(0).getCell(1); //第1行,第2列 cell1.setCellValue(getCellValue(String.valueOf(periodList.get(0)))); Cell cell2 = sheet.getRow(0).getCell(3); //第1行,第4列 cell2.setCellValue(getCellValue(String.valueOf(periodList.get(1)))); Cell cell3 = sheet.getRow(0).getCell(5); //第1行,第6列 cell3.setCellValue(getCellValue(String.valueOf(periodList.get(2)))); Cell cell4 = sheet.getRow(6).getCell(1); //第7行,第2列 cell4.setCellValue(getCellValue(String.valueOf(periodList.get(0)))); Cell cell5 = sheet.getRow(6).getCell(3); //第7行,第4列 cell5.setCellValue(getCellValue(String.valueOf(periodList.get(1)))); Cell cell6 = sheet.getRow(6).getCell(5); //第7行,第6列 cell6.setCellValue(getCellValue(String.valueOf(periodList.get(2)))); } //截取日期 private String getCellValue(String value) { return value.substring(0,4) + "年" + getZero(value.substring(value.length()-2)) + "月底规划规模(单位:亿元)"; } //日期如果前一位为0,去掉0 private String getZero(String sub) { return "0".equals(sub.substring(0,1)) ? sub.substring(1) : sub; } }
动态获取公式
package com.hs.report.enums; /** * 描述:业务及资本规划表 Excel 函数 * * @version 1.0 * @Author k0411242 * @Date 2021年11月24日 */ public enum BusinessExcelEnum { //1-净资本占用 JZBZY_ONE(1, 1 , "SUMPRODUCT(B10:B26*H10:H26*I10:I26)+SUMPRODUCT(C10:C26*H10:H26*0.05)+SUMPRODUCT(B28:B63*H28:H63*I28:I63)+" + "SUMPRODUCT(C28:C63*H28:H63*0.01)+SUMPRODUCT(B67:C80*H67:H80*I67:I80)+SUMPRODUCT(B82:C83*H82:H83*I82:I83)+" + "SUMPRODUCT(B86:C96*H86:H96*I86:I96)+SUMPRODUCT(B98:C100*H98:H100*I98:I100)"), JZBZY_TWO(1,3,"SUMPRODUCT(D10:D26*H10:H26*I10:I26)+SUMPRODUCT(E10:E26*H10:H26*0.05)+SUMPRODUCT(D28:D63*H28:H63*I28:I63)+" + "SUMPRODUCT(E28:E63*H28:H63*0.01)+SUMPRODUCT(D67:E80*H67:H80*I67:I80)+SUMPRODUCT(D82:E83*H82:H83*I82:I83)+" + "SUMPRODUCT(D86:E96*H86:H96*I86:I96)+SUMPRODUCT(D98:E100*H98:H100*I98:I100)"), JZBZY_THREE(1,5,"SUMPRODUCT(F10:F26*H10:H26*I10:I26)+SUMPRODUCT(G10:G26*H10:H26*0.05)+SUMPRODUCT(F28:F63*H28:H63*I28:I63)+" + "SUMPRODUCT(G28:G63*H28:H63*0.01)+SUMPRODUCT(F67:G80*H67:H80*I67:I80)+SUMPRODUCT(F82:G83*H82:H83*I82:I83)+" + "SUMPRODUCT(F86:G96*H86:H96*I86:I96)+SUMPRODUCT(F98:G100*H98:H100*I98:I100)"), //2-自营权益类证券及其衍生品规模 ZYQY_ONE(2,1,"SUM(B10:B26)+SUM(C10:C26)*0.05"), ZYQY_TWO(2,3,"SUM(D10:D26)+SUM(E10:E26)*0.05"), ZYQY_THREE(2,5,"SUM(F10:F26)+SUM(G10:G26)*0.05"), //3-自营非权益类证券及其衍生品规模 ZYFQY_ONE(3,1,"SUM(B28:B63)+SUM(C28:C63)*0.01"), ZYFQY_TWO(3,3,"SUM(D28:D63)+SUM(E28:E63)*0.01"), ZYFQY_THREE(3,5,"SUM(F28:F63)+SUM(G28:G63)*0.01"), //4-融资(融券)业务规模 RZRQ_ONE(4,1,"SUM(B67:C76)"), RZRQ_TWO(4,3,"SUM(D67:E76)"), RZRQ_THREE(4,5,"SUM(F67:G76)"), //5-表内外资产规模 GENERAL_ONE(5,1,"B9+C9+B27+C27+SUM(B67:C80)+SUM(B82:C83)+SUM(B86:C96)*0.3%+B102*15%+B103*10%+B104*5%"), GENERAL_TWO(5,3,"D9+E9+D27+E27+SUM(D67:E80)+SUM(D82:E83)+SUM(D86:E96)*0.3%+D102*15%+D103*10%+D104*5%"), GENERAL_THREE(5,5,"F9+G9+F27+G27+SUM(F67:G80)+SUM(F82:G83)+SUM(F86:G96)*0.3%+F102*15%+F103*10%+F104*5%"), //其中:(1)权益类证券及其衍生品规模 QYL_ONE(8,1,"SUM(B10:B26)"), QYL_TWO(8,2,"SUM(C10:C26)"), QYL_THREE(8,3,"SUM(D10:D26)"), QYL_FOUR(8,4,"SUM(E10:E26)"), QYL_FIVE(8,5,"SUM(F10:F26)"), QYL_SIX(8,6,"SUM(G10:G26)"), //非权益类证券及其衍生品规模 FQYL_ONE(26,1,"SUM(B28:B63)"), FQYL_TWO(26,2,"SUM(C28:C63)"), FQYL_THREE(26,3,"SUM(D28:D63)"), FQYL_FOUR(26,4,"SUM(E28:E63)"), FQYL_SIX(26,6,"SUM(G28:G63)"), FQYL_FIVE(26,5,"SUM(F28:F63)"), //本期净资本占用 列 JZB_TEN_TEN(9,9,"G10*H10*I10+F10*H10*0.05"), JZB_ELEVEN_TEN(10,9,"F11*H11*I11+G11*H11*0.05"), JZB_TWELVE_TEN(11,9,"F12*H12*I12+G12*H12*0.05"), JZB_THIRTEEN_TEN(12,9,"F13*H13*I13+G13*H13*0.05"), JZB_FIFTEEN_TEN(14,9,"F15*H15*I15+G15*H15*0.05"), JZB_SIXTEEN_TEN(15,9,"F16*H16*I16+G16*H16*0.05"), JZB_SEVENTEEN_TEN(16,9,"F17*H17*I17+G17*H17*0.05"), JZB_EIGHTEEN_TEN(17,9,"F18*H18*I18+G18*H18*0.05"), JZB_NINETEEN_TEN(18,9,"F19*H19*I19+G19*H19*0.05"), JZB_TWENTY_TEN(19,9,"F20*H20*I20+G20*H20*0.05"), JZB_TWENTY_ONE_TEN(20,9,"F21*H21*I21+G21*H21*0.05"), JZB_TWENTY_TWO_TEN(21,9,"F22*H22*I22+G22*H22*0.05"), JZB_TWENTY_THREE_TEN(22,9,"F23*H23*I23+G23*H23*0.05"), JZB_TWENTY_FOUR_TEN(23,9,"F24*H24*I24+G24*H24*0.05"), JZB_TWENTY_FIVE_TEN(24,9,"F25*H25*I25+G25*H25*0.05"), JZB_TWENTY_EIGHT_TEN(27,9,"F28*H28*I28+G28*H28*0.01"), JZB_TWENTY_NINE_TEN(28,9,"F29*H29*I29+G29*H29*0.01"), JZB_THIRTY_TEN(29,9,"F30*H30*I30+G30*H30*0.01"), JZB_THIRTY_ONE_TEN(30,9,"F31*H31*I31+G31*H31*0.01"), JZB_THIRTY_TWO_TEN(31,9,"F32*H32*I32+G32*H32*0.01"), JZB_THIRTY_THREE_TEN(32,9,"F33*H33*I33+G33*H33*0.01"), JZB_THIRTY_FOUR_TEN(33,9,"F34*H34*I34+G34*H34*0.01"), JZB_THIRTY_FIVE_TEN(34,9,"F35*H35*I35+G35*H35*0.01"), JZB_THIRTY_SIX_TEN(36,9,"F37*H37*I37+G37*H37*0.01"), JZB_THIRTY_EIGHT_TEN(37,9,"F38*H38*I38+G38*H38*0.01"), JZB_THIRTY_NINE_TEN(38,9,"F39*H39*I39+G39*H39*0.01"), JZB_FORTY_TEN(39,9,"F40*H40*I40+G40*H40*0.01"), JZB_FORTY_ONE_TEN(40,9,"F41*H41*I41+G41*H41*0.01"), JZB_FORTY_TWO_TEN(41,9,"F42*H42*I42+G42*H42*0.01"), JZB_FORTY_THREE_TEN(42,9,"F43*H43*I43+G43*H43*0.01"), JZB_FORTY_FOUR_TEN(43,9,"F44*H44*I44+G44*H44*0.01"), JZB_FORTY_FIVE_TEN(44,9,"F45*H45*I45+G45*H45*0.01"), JZB_FORTY_SIX_TEN(45,9,"F46*H46*I46+G46*H46*0.01"), JZB_FORTY_SEVEN_TEN(46,9,"F47*H47*I47+G47*H47*0.01"), JZB_FORTY_NINE_TEN(48,9,"F49*H49*I49+G49*H49*0.01"), JZB_FIFTY_TEN(49,9,"F50*H50*I50+G50*H50*0.01"), JZB_FIFTY_ONE_TEN(50,9,"F51*H51*I51+G51*H51*0.01"), JZB_FIFTY_TWO_TEN(51,9,"F52*H52*I52+G52*H52*0.01"), JZB_FIFTY_THREE_TEN(52,9,"F53*H53*I53+G53*H53*0.01"), JZB_FIFTY_FOUR_TEN(53,9,"F54*H54*I54+G54*H54*0.01"), JZB_FIFTY_SIX_TEN(55,9,"F56*H56*I56+G56*H56*0.01"), JZB_FIFTY_SEVEN_TEN(56,9,"F57*H57*I57+G57*H57*0.01"), JZB_FIFTY_EIGHT_TEN(57,9,"F58*H58*I58+G58*H58*0.01"), JZB_FIFTY_NINE_TEN(58,9,"F59*H59*I59+G59*H59*0.01"), JZB_SIXTY_ONE_TEN(60,9,"F61*H61*I61+G61*H61*0.01"), JZB_SIXTY_TWO_TEN(61,9,"F62*H62*I62+G62*H62*0.01"), JZB_SIXTY_SEVEN_TEN(66,9,"F67*H67*I67"), JZB_SIXTY_EIGHT_TEN(67,9,"F68*H68*I68"), JZB_SIXTY_NINE_TEN(68,9,"F69*H69*I69"), JZB_SEVENTY_ONE_TEN(70,9,"F71*H71*I71"), JZB_SEVENTY_TWO_TEN(71,9,"F72*H72*I72"), JZB_SEVENTY_THREE_TEN(72,9,"F73*H73*I73"), JZB_SEVENTY_FOUR_TEN(73,9,"F74*H74*I74"), JZB_SEVENTY_FIVE_TEN(74,9,"F75*H75*I75"), JZB_SEVENTY_SIX_TEN(75,9,"F76*H76*I76"), JZB_SEVENTY_EIGHT_TEN(77,9,"F78*H78*I78"), JZB_SEVENTY_NINE_TEN(78,9,"F79*H79*I79"), JZB_EIGHTY_TEN(79,9,"F80*H80*I80"), JZB_EIGHTY_TWO_TEN(81,9,"F82*H82*I82"), JZB_EIGHTY_THREE_TEN(82,9,"F83*H83*I83"), JZB_EIGHTY_SIX_TEN(85,9,"F86*H86*I86"), JZB_EIGHTY_SEVEN_TEN(86,9,"F87*H87*I87"), JZB_EIGHTY_EIGHT_TEN(87,9,"F88*H88*I88"), JZB_EIGHTY_NINE_TEN(88,9,"F89*H89*I89"), JZB_NINETY_TEN(89,9,"F90*H90*I90"), JZB_NINETY_TWO_TEN(91,9,"F92*H92*I92"), JZB_NINETY_THREE_TEN(92,9,"F93*H93*I93"), JZB_NINETY_FOUR_TEN(93,9,"F94*H94*I94"), JZB_NINETY_FIVE_TEN(94,9,"F95*H95*I95"), JZB_NINETY_SIX_TEN(95,9,"F96*H96*I96"), JZB_NINETY_EIGHT_TEN(97,9,"F98*H98*I98"), JZB_NINETY_NINE_TEN(98,9,"F99*H99*I99"), JZB_ONE_HUNDRED_TEN(99,9,"F100*H100*I100"), ; private final Integer row; private final Integer cell; private final String function; BusinessExcelEnum(Integer row, Integer cell, String function) { this.row = row; this.cell = cell; this.function = function; } public Integer getRow() { return row; } public Integer getCell() { return cell; } public String getFunction() { return function; } public static String getFunction(int row, int cell){ for(BusinessExcelEnum item : BusinessExcelEnum.values()){ if(row == item.row && cell == item.cell){ return item.getFunction(); } } return null; } }
这篇关于JAVA 导出Excel 带有多个公式函数的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南