当前位置 : 主页 > 编程语言 > java >

Excel导出

来源:互联网 收集:自由互联 发布时间:2023-12-28
Excel导出——POI 本次工具类的封装主要依赖于阿里巴巴的 JSON 包,以及表格处理的 POI 包,所以我们需要导入这两个库的依赖包,另外,我们还需要文件上传的相关包,毕竟我们在浏览

Excel导出——POI

本次工具类的封装主要依赖于阿里巴巴的 JSON 包,以及表格处理的 POI 包,所以我们需要导入这两个库的依赖包,另外,我们还需要文件上传的相关包,毕竟我们在浏览器页面,做Excel 导入时,是上传的 Excel 文件。

详细内容参考:https://blog.csdn.net/sunnyzyq/article/details/121994504

Excel导出——EasyExcel

老项目主要采用的POI框架来进行Excel数据的导入和导出,但经常会出现OOM的情况,导致整个服务不可用。后续逐步转移到 EasyExcel,简直不能太好用了。

EasyExcel是阿里巴巴开源插件之一,主要解决了poi框架使用复杂,sax解析模式不容易操作,数据量大起来容易OOM,解决了POI并发造成的报错。

详细内容参考:https://juejin.cn/post/7126677222034767886

其它

https://juejin.cn/post/6844903779167535117

碳排放单车明细-数据导出

  • 接口
@ApiOperation(value = "碳排放单车明细-数据导出", notes = "碳排放单车明细-数据导出")
@GetMapping(value = "/exportXls")
public ModelAndView exportXls(HttpServletRequest request, SingleBusDetailExcelDto singleBusDetailDto) {
    SingleBusDetailSearchDto singleBusDetailSearchDto = new SingleBusDetailSearchDto();
    BeanUtils.copyProperties(singleBusDetailDto, singleBusDetailSearchDto);
    List<BusSingleEmissionVo> li =  singleBusDetailsService.getListByConditions(singleBusDetailSearchDto);
    return excelUtil.exportXls(li,BusSingleEmissionVo.class,"碳排放单车明细数据", singleBusDetailDto.getExportFields());
}
  • 实体
@Data
@ToString
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel(description = "碳排放单车查询导出参数")
public class SingleBusDetailExcelDto extends SingleBusDetailSearchDto {

    @ApiModelProperty("导出字段集")
    private String exportFields;
}
@Data
@ToString
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel(description = "碳排放单车明细查询参数")
public class SingleBusDetailSearchDto {

    @ApiModelProperty("车辆vin码")
    private String vin;

    @ApiModelProperty("分公司")
    private String branchCompany;

    @ApiModelProperty("车队")
    private String busTeam;

    @ApiModelProperty("生产厂家")
    private String oemName;

    @ApiModelProperty("开始时间")
    private String startTime;

    @ApiModelProperty("结束时间")
    private String endTime;

}
  • sql
<select id="getListByConditions" resultType="com.ewsmp.module.carbonasset.vo.BusSingleEmissionVo">
    select vin, data_time dataTime,
           carbon_emission_day carbonEmissionDay, carbon_reduction_day carbonReductionDay,
           carbon_emission_online carbonEmissionOnline, carbon_reduction_online carbonReductionOnline,
           oem_name oemName, bus_team busTeam, branch_company branchCompany
    from carbonasset_bus_single_emission
    <where>
        <if test="vin!=null and vin!=''"> and vin = #{vin}</if>
        <if test="branchCompany!=null and branchCompany!=''"> and branch_company like concat('%', #{branchCompany}, '%')</if>
        <if test="busTeam != null and busTeam !=''"> AND bus_team = #{busTeam}</if>
        <if test="oemName!=null and oemName!=''"> and oem_name like concat('%', #{oemName}, '%')</if>

        <if test="startTime != null and startTime !=''">AND data_time &gt;=toDate(#{startTime})</if>
        <if test="endTime != null and endTime !=''">AND data_time &lt;=toDate(#{endTime})</if>
    </where>
    ORDER BY data_time DESC
</select>
  • 导出工具类
@Component
@Slf4j
public class ExcelUtil<T> {

    /**
     * 导出excle:支持选择导出指定字段
     *
     * @param exportList   要导出的数据
     * @param clazz        要导出的实体类
     * @param title        要导出的标题
     * @param exportFields 要导出的字段集合:已逗号分隔
     * @return
     */
    public ModelAndView exportXls(List<T> exportList, Class<T> clazz, String title, String exportFields) {

        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
        String realname = sysUser != null ? sysUser.getRealname() : "";

        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
        mv.addObject("fileName", title);
        mv.addObject("entity", clazz);
        if (StringUtils.isNotEmpty(exportFields)) {
            log.info("导出excle字段:{}", exportFields);
            mv.addObject(NormalExcelConstants.EXPORT_FIELDS, exportFields);
        }

        ExportParams exportParams = new ExportParams(title + "报表", "导出人:" + realname, title);
        mv.addObject("params", exportParams);
        mv.addObject("data", exportList);
        return mv;
    }
}

前端导出 Excel 的方式

这本来是后端的工作,前端只需要一个 a 标签,就可以下载文件,但不巧的是,正好遇到后端请假,而且项目比较着急,那么前端是否可以实现呢?

可以。

实现方式:

  • react-csv
  • xlsx 进入 xlsx 官网,官网称为 SheetJS,它支持浏览器、nodejs、deno、和 react-native,浏览器兼容 ie10+。

参考:https://juejin.cn/post/7114234898461753381

网友评论