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 >=toDate(#{startTime})</if>
<if test="endTime != null and endTime !=''">AND data_time <=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