Java Excel导出(文件模版和代码设置文件格式)

1、使用自定义的Excel模版

        将excel文件放在代码的src的resource目录下,不建议使用绝对路径获取文件,使用getResourceAsStream(文件名)去获取模版文件,可以避免部署代码后文件地址改变找不到文件。

        try {
                // 根据文件名获取文件内容
                inputStream = Objects.requireNonNull(ClassUtils
                                .getDefaultClassLoader())
                        .getResourceAsStream("家庭信息 - 模板.xlsx");

            } catch (Exception e) {
                e.printStackTrace();
            }

        定义excel段落相对应的实体类,初始化设置文件格式和文件名

            workbook = new XSSFWorkbook(inputStream);  // 假设是.xlsx格式
            Sheet sheet = workbook.getSheetAt(0);  // 获取第一个工作表
            String fileName = null;
            try {
                fileName = URLEncoder.encode("家庭信息表", "UTF-8");
            } catch (UnsupportedEncodingException e) {
                throw new RuntimeException(e);
            }

        设置开始导出数据行数,每列的数据保存到新的excel中,关闭工作簿和流

int startRowNum = 1;
//根据数据写人表格
List<FamilyMessageVO> familyMessageVOList = getFamilyMessage();
for (int i = 0; i < familyMessageVOList.size(); i++) {
    FamilyMessageVO familyMessageVO = familyMessageVOList.get(i);
    Row row = sheet.createRow(i + startRowNum);
    row.createCell(0).setCellValue(familyMessageVO.getFamilyId());
    row.createCell(1).setCellValue(familyMessageVO.getFamilyName());
    row.createCell(2).setCellValue(familyMessageVO.getFamilyNumber());
}
// 将更改保存到新的Excel文件中
response.setContentType("application/vnd.ms-excel;charset=utf-8");
response.setHeader("Content-Disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
try (OutputStream outputStream = response.getOutputStream()) {
    workbook.write(outputStream);
}
// 关闭工作簿
workbook.close();
inputStream.close();

        设置sheet的名称 workbook.setSheetName(0, "家庭信息");

        每列数据数据局中,使用CellStyle方法

CellStyle centerCellStyle = workbook.createCellStyle();
// 设置水平居中
centerCellStyle.setAlignment(HorizontalAlignment.CENTER); 
// 设置垂直居中
centerCellStyle.setVerticalAlignment(VerticalAlignment.CENTER); 



// 设置开始导出数据行数
int startRowNum = 1;
//根据数据写人表格
List<FamilyMessageVO> familyMessageVOList = getFamilyMessage();
for (int i = 0; i < familyMessageVOList.size(); i++) {
    FamilyMessageVO familyMessageVO = familyMessageVOList.get(i);
    Row row = sheet.createRow(i + startRowNum);

    Cell cell0 = row.createCell(0);
    cell0.setCellValue(familyMessageVO.getFamilyId());
    cell0.setCellStyle(centerCellStyle);

    Cell cell1 = row.createCell(1);
    cell1.setCellValue(familyMessageVO.getFamilyName());
    cell1.setCellStyle(centerCellStyle);

    Cell cell2 = row.createCell(2);
    cell2.setCellValue(familyMessageVO.getFamilyNumber());
    cell2.setCellStyle(centerCellStyle);
}

 2、使用代码设置excel文件格式

        代码修改点

                1.changeEstimateData 是获取导入的数据

                2.designEstimateExcelHeaders 设置每个列的格式

        // 设置文件名称
        String fileName = null;
        String encodedFileName = null;
        try {
            fileName = URLEncoder.encode("文件名_", "UTF-8");
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException(e);
        }

        // 通过工具类创建writer,创建xlsx格式
        ExcelWriter writer = ExcelUtil.getWriter(true);
        designEstimateExcelHeaders(writer);

        List<ExportEstimateFullView> list = changeEstimateData(dtoList);
        // 一次性写出内容
        writer.write(list, false);

        // 设计 response 对象值
        response.setContentType("application/vnd.ms-excel;charset=utf-8");
        encodedFileName = "attachment;filename*=utf-8''" + fileName + ".xlsx";
        response.setHeader("Content-Disposition", encodedFileName);
        try {
            // 写出到客户端
            writer.flush(response.getOutputStream(), true);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            writer.close();
        }

        设置文件格式:setColumnWidth方法设置列宽,merge可以合并单元格设置列格式,writer.passRows(3);跳过指定行数

private void designEstimateExcelHeaders(ExcelWriter writer) {
        writer.setColumnWidth(-1, 15);
        writer.setColumnWidth(0, 30);
        writer.setColumnWidth(3, 25);
        writer.setColumnWidth(4, 50);
        writer.setColumnWidth(5, 40);
        writer.setColumnWidth(6, 40);
        writer.merge(0, 2, 0, 0, "预估结算单号", false);
        writer.merge(0, 2, 1, 1, "会计周期", false);
        writer.merge(0, 2, 2, 2, "结算周期", false);
        writer.merge(0, 2, 3, 3, "合同编码", false);
        writer.merge(0, 2, 4, 4, "合同名称", false);
        writer.merge(0, 2, 5, 5, "客户/供应商", false);
        writer.merge(0, 2, 6, 6, "发票抬头", false);
        writer.passRows(3);
}

         

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值