Jeecg 导出复杂表格

2 篇文章 0 订阅
1 篇文章 0 订阅

要求:
根据驾驶员信息,导出相应的排班信息
如下图所示:
在这里插入图片描述
分析:
jeecg支持的普通导出满足不了我的表头需求,表头后面的站点和发车时间是两个维度,而且数量不确定,所以,使用jeecg的通用下载就不行了。只能自己手动生成excel了。

废话不多说,代码如下:

Controller层:

@Slf4j
@Api(tags="驾驶员")
@RestController
@RequestMapping("/driver/management")
public class BusDriverManagementController extends BaseController<BusDriverManagement, IBusDriverManagementService> {
	@Autowired
	private IBusDriverManagementService busDriverManagementService;
	 /**
	  * 导出驾驶员班次excel
	  *
	  * @param busDriverManagement
	  */
	 @RequestMapping(value = "/export-driver-shift-xlsx")
	 public void exportDriverXls( BusDriverManagement busDriverManagement,HttpServletRequest request, HttpServletResponse response)  {
	 	//获取驾驶员班次信息表;
		List<BusDriverLineExportVO> driverList = busDriverManagementService.getDriverShiftList(busDriverManagement);
		//获取最大站点
		 Long siteNum = busDriverManagementService.getSiteNum(busDriverManagement);
		 try {
			 busDriverManagementService.exportDriverXls(request,response,driverList,siteNum);
		 } catch (IOException e) {
		 	throw new HyException("导出失败");
		 }

	 }
	 }

Service层:

@Service
public class
BusDriverManagementServiceImpl extends ServiceImpl<BusDriverManagementMapper, BusDriverManagement> implements IBusDriverManagementService {
   @Override
    public void exportDriverXls(HttpServletRequest request, HttpServletResponse response, List<BusDriverLineExportVO> driverList, Long siteNum) throws IOException {

        // 创建XSSFWorkbook对象(excel的文档对象)
        XSSFWorkbook wb = new XSSFWorkbook();
        String sheetName = "驾驶员班次";
        // 建立新的sheet对象(excel的表单) 并设置sheet名字
        XSSFSheet sheet = wb.createSheet(sheetName);
        sheet.setDefaultRowHeightInPoints(CommonConstant.EXCEL_DEFAULT_ROW_HEIGHT);// 设置缺省列高
        sheet.setDefaultColumnWidth(CommonConstant.EXCEL_DEFAULT_COLUMN_WIDTH);//设置缺省列宽
        //----------------单元格样式----------------------------------
        //表格样式
        XSSFCellStyle cellStyle = getXssfCellStyle(wb);
        //----------------------------------------------------------
        //表头
        createExcelHeader(siteNum, sheet, cellStyle);
        //填充内容
        createExcelContent(driverList, sheet, cellStyle);
        //通过输出流进行文件下载
        ServletOutputStream out = response.getOutputStream();
        response.setContentType("application/vnd.ms-excel");
        response.setHeader("content-Disposition", "attachment;filename=report.xlsx");
        wb.write(out);

        out.flush();
        out.close();
        wb.close();

    }

    private void createExcelContent(List<BusDriverLineExportVO> driverList, XSSFSheet sheet, XSSFCellStyle cellStyle) {
        Set<String> driverSet = new HashSet<>();
        Set<String> lineSet = new HashSet<>();
        XSSFCell cell;
        XSSFRow row;
        for (int i = 0; i < driverList.size(); i++) {
            BusDriverLineExportVO driver = driverList.get(i);
            row = sheet.createRow( 2+i*2);
            if (!driverSet.contains(driver.getWorkNo())) {
                driverSet.add(driver.getWorkNo());
                Long count = driverList.stream().filter(dr -> dr.getWorkNo().equals(driver.getWorkNo())).count();
                sheet.addMergedRegion(new CellRangeAddress(2 + i*2, (i + count.intValue()) * 2+1, 0, 0));
                cell = row.createCell(0);
                cell.setCellValue(driver.getDriverName());
                cell.setCellStyle(cellStyle);
            }
            if (!lineSet.contains(driver.getLineId())) {
                lineSet.add(driver.getLineId());
                Long count = driverList.stream().filter(dr -> dr.getLineId().equals(driver.getLineId())).count();
                sheet.addMergedRegion(new CellRangeAddress(2 + i*2, (i + count.intValue()) * 2+1, 1, 1));
                cell = row.createCell(1);
                cell.setCellValue(driver.getLineName());
                cell.setCellStyle(cellStyle);
            }
            sheet.addMergedRegion(new CellRangeAddress(2 + i*2, i * 2+3, 2, 2));
            cell = row.createCell(2);
            cell.setCellValue(driver.getShiftName());
            cell.setCellStyle(cellStyle);
            sheet.addMergedRegion(new CellRangeAddress(2 + i*2, i * 2+3, 3, 3));
            cell = row.createCell(3);
            cell.setCellValue(driver.getCarNo());
            cell.setCellStyle(cellStyle);
            for (int j = 0; j < driver.getSiteList().size(); j++) {
                cell = row.createCell(4+j);
                cell.setCellValue(driver.getSiteList().get(j));
                cell.setCellStyle(cellStyle);
            }
            row = sheet.createRow( i*2+3);
            for (int k = 0; k < driver.getDepartureTimeList().size(); k++) {
                cell = row.createCell(4+k);
                cell.setCellValue(driver.getDepartureTimeList().get(k));
                cell.setCellStyle(cellStyle);
            }
        }
    }

    private void createExcelHeader(Long siteNum, XSSFSheet sheet, XSSFCellStyle cellStyle) {
        XSSFCell cell;
        XSSFRow row;
        // ----------------------创建第一行---------------
        // 在sheet里创建第一行,参数为行索引(excel的行),可以是0~65535之间的任何一个
        row = sheet.createRow(0);
        sheet.addMergedRegion(new CellRangeAddress(0, 1, 0, 0));
        // 创建单元格(excel的单元格,参数为列索引,可以是0~255之间的任何一个
        cell = row.createCell(0);
        // 设置单元格内容
        cell.setCellValue("驾驶员");
        cell.setCellStyle(cellStyle);
        sheet.addMergedRegion(new CellRangeAddress(0, 1, 1, 1));
        cell = row.createCell(1);
        cell.setCellValue("线路名称");
        cell.setCellStyle(cellStyle);

        sheet.addMergedRegion(new CellRangeAddress(0, 1, 2, 2));
        cell = row.createCell(2);
        cell.setCellValue("班次");
        cell.setCellStyle(cellStyle);

        sheet.addMergedRegion(new CellRangeAddress(0, 1, 3, 3));
        cell = row.createCell(3);
        cell.setCellValue("车号");
        cell.setCellStyle(cellStyle);
        if(siteNum !=null) {
            for (int i = 1; i <= siteNum.intValue(); i++) {
                cell = row.createCell(3 + i);
                cell.setCellValue("站点" + i);
                cell.setCellStyle(cellStyle);
            }
        }
        // ----------------------------------------------
        // ------------------创建第二行---------------------
        row = sheet.createRow(1);
        if(siteNum !=null) {
            for (int i = 1; i <= siteNum.intValue(); i++) {
                cell = row.createCell(3 + i);
                cell.setCellValue("发车时间");
                cell.setCellStyle(cellStyle);
            }
        }
        //-------------------------表头end---------------------
    }

    private XSSFCellStyle getXssfCellStyle(XSSFWorkbook wb) {
        XSSFCellStyle cellStyle = wb.createCellStyle();
        cellStyle.setAlignment(HorizontalAlignment.CENTER);
        cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);

        Font cellFont = wb.createFont();
        cellFont.setItalic(false);                     // 设置字体为斜体字
        cellFont.setColor(Font.COLOR_NORMAL);            // 将字体设置为“红色”
        cellFont.setFontHeightInPoints((short) 10);    // 将字体大小设置为18px
        cellFont.setFontName("宋体");             // 字体应用到当前单元格上
//        cellFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        cellStyle.setFont(cellFont);
        cellStyle.setWrapText(true);//设置自动换行
        return cellStyle;
    }

}

核心代码:service层中的exportDriverXls方法;

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值