【Workbook】EXCEL导出

 Controller

    @PostMapping("/list/export")
    public void exportBill(@RequestBody UserBillQueryVo queryVo, HttpServletResponse response) throws IOException {
        response.setContentType("application/force-download");
        response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("账单.xlsx", "UTF-8"));
        response.addHeader("Access-Control-Expose-Headers", "Content-Disposition");
        ServletOutputStream outputStream = response.getOutputStream();
        userBillService.exportBillList(queryVo, outputStream);
        outputStream.flush();
    }

 service

 @Override
    public void exportBillList(UserBillQueryVo queryVo, ServletOutputStream outputStream) throws IOException {
        Long currentUserInfoId = AuthUserInfoHolder.getUserInfo().map(UserInfo::getId).orElseThrow(() -> new ServiceException(500, "用户信息无效"));
        Page<UserBill> result = baseMapper.pageBillList(new Page<>(1, -1), currentUserInfoId, queryVo);
        List<UserBill> records = result.getRecords();
        Workbook workbook = new XSSFWorkbook();
        Sheet sheet = workbook.createSheet("账单");

        // 创建标题行和表头行
        Row titleRow = sheet.createRow(0);
        Cell titleCell = titleRow.createCell(0);
        titleCell.setCellValue("账单");

        // 合并单元格设置标题
        sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 10)); // 合并第1行的第1列到第11列

        // 设置标题样式
        CellStyle titleStyle = workbook.createCellStyle();
        Font titleFont = workbook.createFont();
        titleFont.setFontHeightInPoints((short) 16);
        titleFont.setBold(true);
        titleStyle.setFont(titleFont);
        titleStyle.setAlignment(HorizontalAlignment.CENTER);
        titleCell.setCellStyle(titleStyle);

        // 创建表头行
        Row headerRow = sheet.createRow(1);
        String[] headers = {"账单编号", "产品名称", "产品类型", "交易类型", "应付金额(元)", "余额支付(元)", "卡券抵扣(元)", "产品单价", "交易编号", "交易时间", "订单编号"};
        CellStyle headerStyle = workbook.createCellStyle();
        Font headerFont = workbook.createFont();
        headerFont.setFontHeightInPoints((short) 12);
        headerFont.setBold(true);
        headerStyle.setFont(headerFont);
        headerStyle.setAlignment(HorizontalAlignment.CENTER);
        headerStyle.setFillForegroundColor(IndexedColors.BLUE.getIndex());
        headerStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
        headerStyle.setBorderBottom(BorderStyle.THIN);
        headerStyle.setBorderTop(BorderStyle.THIN);
        headerStyle.setBorderLeft(BorderStyle.THIN);
        headerStyle.setBorderRight(BorderStyle.THIN);

        for (int i = 0; i < headers.length; i++) {
            Cell cell = headerRow.createCell(i);
            cell.setCellValue(headers[i]);
            cell.setCellStyle(headerStyle);
        }

        // 填充数据
        List<LinkedHashMap<String, Object>> dataList = records.stream().map(userBill -> {
            LinkedHashMap<String, Object> map = new LinkedHashMap<>();
            if (userBill.getType() == 2) {
                userBill.setTypeName("消费");
            }
            if (userBill.getType() == 3) {
                userBill.setTypeName("退款");
            }
            map.put("账单编号", userBill.getBillNo());
            map.put("产品名称", userBill.getProductName());
            map.put("产品类型", userBill.getProductType());
            map.put("交易类型", userBill.getTypeName());
            map.put("应付金额", userBill.getType());
            map.put("余额支付", userBill.getAmount());
            map.put("卡券抵扣", userBill.getVoucherDiscount);
            map.put("产品单价", userBill.getUnitPrice());
            map.put("交易编号", userBill.getTransactionNo());
            map.put("交易时间", DateUtils.yyyyMMddHHmmssWithWhiffletree(userBill.getCreateDatetime()));
            map.put("订单编号", userBill.getOrderNo());
            return map;
        }).collect(Collectors.toList());

        int rowNum = 2; // 从第三行开始写入数据
        for (LinkedHashMap<String, Object> data : dataList) {
            Row row = sheet.createRow(rowNum);
            int celNum = 0;
            Set<Map.Entry<String, Object>> entries = data.entrySet();
            for (Map.Entry<String, Object> entry : entries) {
                Cell cell = row.createCell(celNum);
                cell.setCellValue(String.valueOf(entry.getValue()));
                celNum++;
            }
            rowNum++;
        }
        workbook.write(outputStream);
        workbook.close();
    }

mapper

Page<UserBill> pageBillList(Page<Object> objectPage,@Param("currentUserInfoId") Long currentUserInfoId, @Param("queryVo") UserBillQueryVo queryVo);

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要按照Excel模板导出Workbook,可以使用Java中的Apache POI库来操作Excel文件。下面是一个简单的实例: ```java import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.HashMap; import java.util.Map; public class ExcelExport { public static void main(String[] args) { String templateFilePath = "template.xlsx"; String outputFilePath = "output.xlsx"; try { FileInputStream templateFile = new FileInputStream(templateFilePath); Workbook workbook = new XSSFWorkbook(templateFile); Sheet sheet = workbook.getSheetAt(0); // 假设模板中有一个名为data的占位符,需要替换为实际的数据 Map<String, String> data = new HashMap<>(); data.put("name", "John Doe"); data.put("age", "25"); Row dataRow = sheet.getRow(1); Cell nameCell = dataRow.getCell(0); Cell ageCell = dataRow.getCell(1); // 替换占位符为实际的数据 nameCell.setCellValue(data.get("name")); ageCell.setCellValue(data.get("age")); // 输出导出后的工作簿 FileOutputStream outputFile = new FileOutputStream(outputFilePath); workbook.write(outputFile); templateFile.close(); outputFile.close(); workbook.close(); } catch (IOException e) { e.printStackTrace(); } } } ``` 这里使用了Apache POI库中的`Workbook`和`Sheet`等类,通过`Workbook`来打开模板文件,然后获取模板中指定的Sheet,接着我们可以使用`Row`和`Cell`来获取和设置单元格的内容。在替换占位符的时候,可以通过获取到的Cell对象进行设置。 最后,导出Workbook可以通过`write`方法将其写入到指定的文件中。注意在使用完毕后,要关闭文件流和工作簿对象以释放资源。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值