excel导出标准化

本文介绍了如何通过标准化流程提升开发效率,特别是在前端和后端合作时,通过EasyExcel库处理数据,实现商品收发明细表的快速导出,包括API调用、Controller层的处理和Service层的数据填充以及Excel模板的使用。
摘要由CSDN通过智能技术生成

虽然标题叫标准化,只不过是我自己的习惯,当一件事情变得流程标准化之后,开发程序就会飞快,开发评估工作总是 搞个1~2天,实则前端后端一起开发,1个小时就可以搞定。
1 前端

const exportXls = async () => {
    var now = moment(new Date()).format('YYYYMMDDHHMMSS')
	let name = '商品收发明细表.xls'
    const res = await proxy.$api.invOrder.goodsRdDetail.export({...condForm.value})
    let data = res.data;
	let url = window.URL.createObjectURL(new Blob([data], ))
	let link = document.createElement('a')
	link.style.display = 'none'
	link.href = url;
	console.log(link);
	link.setAttribute('download', now + name)
	document.body.appendChild(link)
	link.click()
	document.body.removeChild(link)
}

请求的代码如下

public postOnlyFile = (url: string, data = {} , config: AxiosRequestConfig<any> = {}): Promise<any> =>
	axios({
		...this.baseConfig,
		headers:{
			...this.baseConfig.headers,
			'Content-Type': "application/json"
		},
		responseType:'blob',
		url,
		method: 'post',
		data,
		...config,
	})

2 后端
controller层基本就是复制粘贴,传参数给到service层而已。

    @PostMapping("export")
    @ApiOperation("导出商品收发明细表")
    public void export(@RequestBody PsiInvOrderReportCondDto condDto, HttpServletResponse response){
        //设置响应头
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
        //设置防止文件名中文乱码
        try {
            //设置防止文件名中文乱码
            String fileName = URLEncoder.encode("商品收发明细表", "utf-8");
            response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
            //
            if (!CheckEmptyUtil.isEmpty(condDto.getBillDateRange())){
                condDto.setStartBillDate(condDto.getBillDateRange().get(0));
                condDto.setEndBillDate(condDto.getBillDateRange().get(1));
            }
            goodsRdDetailService.export(response.getOutputStream(),"xls/GoodsRdDetail.xls", condDto);
        } catch (Exception e) {
            log.error(e.getMessage(), e);
        }
    }

service层主要通过easyexcel填充数据

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.excel.write.metadata.fill.FillConfig;
    @Override
    public void export(OutputStream outputStream, String pathName, PsiInvOrderReportCondDto condDto) {
        List<GoodsRdDetailListDto> goodsRdDetailListDtos = select(condDto);
        int line = 1;
        for (GoodsRdDetailListDto goodsRdDetailListDto:goodsRdDetailListDtos){
            goodsRdDetailListDto.setLine(String.valueOf(line++));
            goodsRdDetailListDto.setBillDateStr(DateUtil.formatDate(goodsRdDetailListDto.getBillDate()));
            BusinessTypeEnum businessTypeEnum = BusinessTypeEnum.getInvBusinessTypeEnum(goodsRdDetailListDto.getBusiType());
            goodsRdDetailListDto.setBusiType(businessTypeEnum.display());
        }
        org.springframework.core.io.Resource resource = new ClassPathResource(pathName);
        InputStream inputStream = null;
        String fileName = DateUtil.getDateRandom() + ".xls";
        File file = new File(TmpDic.url + File.separator + fileName);
        try {
            inputStream = resource.getInputStream();
            FileUtils.copyInputStreamToFile(inputStream, file);
        } catch (IOException e) {
            e.printStackTrace();
        }
        ExcelWriter excelWriter = EasyExcel.write(outputStream).withTemplate(file).build();
        FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
        //
        WriteSheet sheet0 = EasyExcel.writerSheet(0,"单据明细(不合并表头)")
                //单元格
//                .registerWriteHandler(new CustomCellWriteHandler())
                .build();
        excelWriter.fill(goodsRdDetailListDtos, fillConfig, sheet0);
        //
        PsiAccountSet psiAccountSet = psiAccountSetService.getById(condDto.getAsId());
        GoodsRdDetailExcelHeaderDto excelHeaderDto = new GoodsRdDetailExcelHeaderDto();
        excelHeaderDto.setCompanyName(psiAccountSet.getName());
        excelHeaderDto.setStartBillDate(DateUtil.formatDate(condDto.getStartBillDate()));
        excelHeaderDto.setEndBillDate(DateUtil.formatDate(condDto.getEndBillDate()));
        excelWriter.fill(excelHeaderDto,sheet0);
        //
        excelWriter.finish();
        file.delete();
    }

3 excel模板
定义excel模板,就是上面的xls/GoodsRdDetail.xls
1

  • 10
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

warrah

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值