EasyExcel将数据下载到浏览器-超强实用版

pom引入esayxxcel

  <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>2.1.6</version>
        </dependency>

定义实体类

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class BillDTO {

    @ExcelProperty(value = "消费时间",index = 0 )
    private String consumeTime ;
    @ExcelProperty(value = "交易类型",index = 1 )
    private Integer consumeType ;
    @ExcelProperty(value = "产品类型",index = 2 )
    private String apiDesc ;
    @ExcelProperty(value = "描述内容",index = 3 )
    private String describe;
    @ExcelProperty(value = "支出(元)",index = 4 )
    private Double consumeAmount ;
    @ExcelProperty(value = "调用次数",index = 5 )
    private Integer consumeAmt ;

}

控制层

    /*
     *数据费用中心--账单下载
     * */
    @RequestMapping(value = "download/bill", method = RequestMethod.GET)
    public Object billDownload(BillDownloadParam billDownloadParam, HttpServletResponse httpServletResponse) {
        try {
            List<BillDTO> billDTOS=JSON.parseArray(billDownloadParam.getBillContent(), BillDTO.class);
            creditService.downloadBillExcel(httpServletResponse,billDTOS);
            return ResultUtil.getSuccessResult("数据服务消费记录下载成功", null);
        } catch (Exception e) {
            log.error("账单下载异常", e);
            return ResultUtil.getFailedResult(ErrorMessage.INTERNAL_SERVER, null);
        }
    }

服务层

    //数据费用中心--账单下载
    public void downloadExcel(HttpServletResponse response, List dataList, Class cls, String fileName)
            throws IOException {
        response.setContentType("application/vnd.ms-excel");
        //response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setCharacterEncoding("utf-8");
        response.setHeader("Content-disposition",
                "attachment;filename*=utf-8'zh_cn'" + URLEncoder.encode(fileName, "UTF-8") + ".xls");
        LongestMatchColumnWidthStyleStrategy longestMatchColumnWidthStyleStrategy =
                new LongestMatchColumnWidthStyleStrategy();
        EasyExcel.write(response.getOutputStream(), cls)
                .excelType(ExcelTypeEnum.XLS)
                .sheet("sheet1")
                .registerWriteHandler(longestMatchColumnWidthStyleStrategy)
                .doWrite(dataList);
    }

血泪经验:

对应xls:

response.setContentType("application/vnd.ms-excel")

对应xlsx:

response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");

另外作者不知道为什么下载xlsx文件总是报文件格式损坏,扩展名不正确的错误,但是用指定xls格式就可以正常下载,值得说的是要想指定xls格式一共要在三个地方声明分别是:

response.setContentType("application/vnd.ms-excel")
 response.setHeader("Content-disposition",
                "attachment;filename*=utf-8'zh_cn'" + URLEncoder.encode(fileName, "UTF-8") + ".xls");
 EasyExcel.write(response.getOutputStream(), cls)
                .excelType(ExcelTypeEnum.XLS)
                .sheet("sheet1")
                .registerWriteHandler(longestMatchColumnWidthStyleStrategy)
                .doWrite(dataList);

少一个地方都不行

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
EasyExcel 中,可以使用模板导出实体类数据浏览器。您需要准备一个带有表头的 Excel 模板文件,并在模板中指定要填充数据的位置。 以下是一个示例,展示如何使用 EasyExcel 将实体类数据填充到 Excel 模板,并导出到浏览器: ```java import com.alibaba.excel.EasyExcel; import com.alibaba.excel.write.builder.ExcelWriterBuilder; import com.alibaba.excel.write.metadata.WriteSheet; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import java.io.InputStream; import java.util.List; public class ExcelExportExample { public static void exportToBrowser(HttpServletResponse response, List<User> userList) { try { // 设置响应头,告诉浏览器返回的是 Excel 文件 response.setContentType("application/vnd.ms-excel"); response.setCharacterEncoding("utf-8"); // 设置导出的文件名 response.setHeader("Content-disposition", "attachment;filename=example.xlsx"); // 获取输出流 ServletOutputStream outputStream = response.getOutputStream(); // 加载 Excel 模板文件 InputStream templateInputStream = ExcelExportExample.class.getResourceAsStream("template.xlsx"); // 导出数据 ExcelWriterBuilder writerBuilder = EasyExcel.write(outputStream).withTemplate(templateInputStream); WriteSheet writeSheet = EasyExcel.writerSheet().build(); writerBuilder.file("example.xlsx").sheet().doWrite(userList); } catch (Exception e) { // 异常处理 } } } ``` 在上面的示例中,我们加载了一个名为 "template.xlsx" 的 Excel 模板文件,并使用 `withTemplate` 方法将模板文件与要导出的数据关联起来。 然后,我们使用 `EasyExcel.write(outputStream)` 方法创建 Excel 写入器,并指定要导出的输出流。通过 `WriteSheet` 的 `build` 方法创建写入的 Sheet。 最后,我们调用 `doWrite` 方法将 userList 的数据填充到模板中,并将导出结果写入到输出流中。 请确保模板文件中的表头与实体类的字段对应,并且模板文件中的数据填充位置与实际数据填充的位置一致。 希望这可以帮助到您!如果还有其他问题,请随时提问。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值