java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > 使用get请求接收List集合数据(json)并导出报表

Java使用get请求接收List集合数据(json)并导出报表问题

作者:醉梦年华

这篇文章主要介绍了Java使用get请求接收List集合数据(json)并导出报表问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

前言

最近看了一下项目模块,发现前同事写的文件导出的功能很便捷(EasyExcel)。

研究了一下发现这个功能需求以后变更的可能很大(需求只是导出了一个空模板,没有数据),所以预想着给这个功能完善一下,把数据也跟着导出来(毕竟客户很可能要这么干)。

当前实现效果如下:

在这里插入图片描述

在这里插入图片描述

很明显,之前导出的只是一个空模板,为了用户可以便捷更改信息再上传

话不多说,开始正题

一、实现分析

1、想导出的数据只是物品明细,数据量不大、信息相对不算私密,且用户使用频繁。所以使用get请求 

2、get请求如何接收list集合数据参数呢,将List集合对象转换为json字符串接收,通过后台解析即可。(推荐)

3、也可以用@Requestbody注解接收对象,但感觉这样可能不符合规范,毕竟@Requestbody多用于post请求(后台能接到,但这种传递方式前台可能不太方便)

二、Maven依赖(基于EasyExcel实现)

    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>easyexcel</artifactId>
      <version>3.0.5</version>
    </dependency>
    
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
      <version>1.2.28</version>
    </dependency>

三、后台代码

测试类:

@RestController
@RequestMapping("excel/test")
public class excelTest {

    @GetMapping("fileTest")
    public void downloadTemplate(@RequestParam String json, HttpServletResponse response) {
        String fileName = "测试导出模板";
        String sheetName = "测试导出模板";
        
        // 将json字符串转换为List集合对象
        List<GoodsDetailExcelEntity> list = JSONArray.parseArray(json, GoodsDetailExcelEntity.class);

        try {
            // 自定义的Excel工具类
            ExcelUtil.writeExcel(response, list, fileName, sheetName, GoodsDetailExcelEntity.class);
        } catch (Exception e) {
            System.out.println(e.getCause());
        }
    }

}

GoodsDetailExcelEntity类

@Data
public class GoodsDetailExcelEntity {

    @ExcelProperty(value = "物资", index = 0)
    private String goods;

    @ExcelProperty(value = "规格", index = 1)
    private String specs;

    @ExcelProperty(value = "单位", index = 2)
    private String unit;

    @ExcelProperty(value = "单价", index = 3)
    private BigDecimal price;

    @ExcelProperty(value = "数量", index = 4)
    private Integer number;

    @ExcelProperty(value = "金额", index = 5)
    private BigDecimal money;

    @ExcelProperty(value = "施工部位", index = 6)
    private String constructPosition;

    @ExcelProperty(value = "备注", index = 7)
    private String memo;
}

ExcelUtil类,设置导出的excel样式

    /**
     * 导出
     * @param response
     * @param data
     * @param fileName
     * @param sheetName
     * @param clazz
     * @throws Exception
     */
    public static void writeExcel(HttpServletResponse response, List<? extends Object> data, String fileName, String sheetName, Class clazz) throws Exception {
        //表头样式
        WriteCellStyle headWriteCellStyle = new WriteCellStyle();
        //设置表头居中对齐
        headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
        //内容样式
        WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
        //设置内容靠左对齐
        contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.LEFT);
        HorizontalCellStyleStrategy horizontalCellStyleStrategy = new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);
        EasyExcel.write(getOutputStream(fileName, response), clazz).excelType(ExcelTypeEnum.XLSX).sheet(sheetName).registerWriteHandler(horizontalCellStyleStrategy).doWrite(data);
    }

    private static OutputStream getOutputStream(String fileName, HttpServletResponse response) throws Exception {
        fileName = URLEncoder.encode(fileName, "UTF-8");
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf8");
        response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".xlsx");
        response.addHeader("Access-Control-Expose-Headers", "Content-disposition");

        return response.getOutputStream();
    }

}

四、使用PostMan测试

注意:因为是用get请求 所以{}和[]在postman中会被认为是特殊字符从而转义

{%7B
}%7D
[%5B
]%5D

不区分大小写

因为是导出文件,所以选择downLoad

接收到json格式的数据了,接下来就可以为所欲为了

程序跑完弹出窗口下载页面(在浏览器下载)

生成的带数据的Excel文件

总结

Excel样式还是差点意思,大家可以自行设置哈。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文