在vue+antd Excel导出

该博客主要介绍了如何使用EasyExcel库在Java后端实现Excel数据的导出,包括基本的导出功能以及复杂的单据详情导出,支持多列表数据填充,并提供了文件名防乱码处理和模板文件的读取。此外,还展示了前端如何下载导出的Excel文件。
摘要由CSDN通过智能技术生成

easyEecel 导出
package com.xry.mis.biz.service;

import javax.servlet.http.HttpServletResponse;
import java.util.List;

public interface ExcelService {

/**
 * 最基本的的导出excel, 默认导出到第一个sheet
 * @param response HttpServletResponse
 * @param fileName 文件名
 * @param data 要导出的数据
 * @param clazz 对象类型
 */
<T> void simpleExport(HttpServletResponse response, String fileName, List<T> data, Class clazz);

/**
 * 导出单据详情
 * @param response
 * @param head 单据头数据
 * @param body 单据列表数据
 * @param tplName excel模板名称
 * @param clazz 对象类型
 */
<H, B> void exportBillDetail(HttpServletResponse response, H head, List<B> body, String tplName, Class clazz);

/**
 * 导出单据详情
 * @param response
 * @param head 单据头数据
 * @param body 单据列表数据
 * @param body2 单据列表2数据
 * @param tplName excel模板名称
 * @param clazz 对象类型
 */
<H, B, B2> void exportBillDetail(HttpServletResponse response, H head, List<B> body,  List<B2> body2, String tplName, Class clazz);

/**
 * 导出单据详情
 * @param response
 * @param head 单据头数据
 * @param body 单据列表数据
 * @param body2 单据列表2数据
 * @param body3 单据列表3数据
 * @param tplName excel模板名称
 * @param clazz 对象类型
 */
<H, B, B2, B3> void exportBillDetail(HttpServletResponse response, H head,  List<B> body,  List<B2> body2,  List<B3> body3, String tplName, Class clazz);

}

package com.xry.mis.biz.service.impl;

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;
import com.alibaba.excel.write.metadata.fill.FillWrapper;
import com.base.framework.ApplicationGlobals;
import com.base.framework.util.config.AppConfigHolder;
import com.xry.mis.biz.service.ExcelService;
import com.xry.mis.dao.entity.User;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Service;

import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

解析
@Service(“excelService”)
public class ExcelServiceImpl implements ExcelService {

private Logger logger = LoggerFactory.getLogger(getClass());

@Override
public <T> void simpleExport(HttpServletResponse response, String fileName, List<T> data, Class clazz) {
    response.setContentType("application/vnd.ms-excel");
    response.setCharacterEncoding("utf-8");
    // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
    //response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
    try {
        // 解决中文文件名乱码
        fileName = URLEncoder.encode(fileName,"UTF-8");
    } catch (UnsupportedEncodingException e) {
    }
    response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
    try {
        EasyExcel.write(response.getOutputStream(), clazz).sheet(fileName).excludeColumnFiledNames(this.getExcludeColumnFiledNames()).doWrite(data);
    } catch (IOException e) {
        logger.error(e.getMessage());
    }
}

private List<String> getExcludeColumnFiledNames() {
    List<String> excludeColumnFiledNames = new ArrayList<>();
    Authentication auth = SecurityContextHolder.getContext().getAuthentication();
    if (auth != null) {
        User user = (User) auth.getPrincipal();
        // 不xxxxx
        if (!user.isPurchasePrice()) {
            excludeColumnFiledNames.addAll(Arrays.asList("purchasePrice", "nontaxPurchasePrice", "lastPurchasePrice"));
        }
    }
    return excludeColumnFiledNames;
}

@Override
public <H, B> void exportBillDetail(HttpServletResponse response, H head, List<B> body, String tplName, Class clazz) {
    this.exportBillDetail(response, head, body, null, tplName, clazz);
}

@Override
public <H, B, B2> void exportBillDetail(HttpServletResponse response, H head, List<B> body,  List<B2> body2, String tplName, Class clazz) {
    this.exportBillDetail(response, head, body, body2, null, tplName, clazz);
}

@Override
public <H, B, B2, B3> void exportBillDetail(HttpServletResponse response, H head,  List<B> body,  List<B2> body2,  List<B3> body3, String tplName, Class clazz) {
    tplName = tplName.concat(".xlsx");
    // 从配置文件目录取更灵活
    File templateFile = ApplicationGlobals.getRelativeFile(
            AppConfigHolder.getString("export.excel.path", "excelTpl/").concat(tplName));
    // String templateFileName = getClass().getResource("/").getPath().concat("excelTpl/").concat(tplName);
    response.setContentType("application/vnd.ms-excel");
    response.setCharacterEncoding("utf-8");
    response.setHeader("Content-disposition", "attachment;filename=" + tplName);
    try {
        ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream(), clazz).withTemplate(templateFile).build();
        WriteSheet writeSheet = EasyExcel.writerSheet().build();
        // TODO: 过滤列头数据 writeSheet.setExcludeColumnFiledNames();
        // 写表头数据
        excelWriter.fill(head, writeSheet);
        // 写列表数据,由于列表数据后面还有日期、操作员,所以必须 forceNewRow = true
        FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
        // 如果模板存在多个list,要加前缀{前缀.xx},默认按a,b,c,d,e...往后排
        if (body2 != null) {
            // 如果有多个list 模板上必须有{前缀.xx} 这里的前缀就是 a,然后多个list必须用 FillWrapper包裹
            excelWriter.fill(new FillWrapper("a", body), fillConfig, writeSheet);
            excelWriter.fill(new FillWrapper("b", body2), fillConfig, writeSheet);
        } else {
            excelWriter.fill(body, fillConfig, writeSheet);
        }
        if (body3 != null) {
            // 如果有多个list 模板上必须有{前缀.xx} 这里的前缀就是 b,然后多个list必须用 FillWrapper包裹
            excelWriter.fill(new FillWrapper("c", body3), fillConfig, writeSheet);
        }
        excelWriter.finish();
    } catch (IOException e) {
        logger.error(e.getMessage());
    }
}

}

/**
* 导出xxxxxxxx
* @param request
* @param response
*/
@ControllerLog(description=“导出xxxxxxxx”)
@RequestMapping(value = “/export”, method = RequestMethod.POST)
@ResponseBody
public void exportPcReturnManage(HttpServletRequest request, HttpServletResponse response) {
// 查询对应数据
QueryCondition qc = Spring3MvcUtil.createAntdVueQueryCondition(request);
qc.setParameter(“pcNumber”, request.getParameter(“pcNumber”));
List result = pcReturnManageService.getPcReturnManagePage(qc);
// 根据日期创建文件名
SimpleDateFormat dateFormat = new SimpleDateFormat(“yyyyMMdd”);
String currentDate = dateFormat.format(new Date());
String fileName = “ReturnManage” + “-” + currentDate;
// 调用导出共通
excelService.simpleExport(response, fileName, result, PcReturnManage.class);
}

/**
 * 导出xxxxxxx详情
 * @param id
 * @param response
 */
@ControllerLog(description="导出xxxxxxxxx详情")
@RequestMapping(value = "/exportDetail", method = RequestMethod.POST)
@ResponseBody
public void exportPcReturnManageDetail(@RequestParam Long id, HttpServletResponse response) {
    PcReturnManage pcReturnManage = pcReturnManageService.getPcReturnManageById(id);
    pcReturnManage.getPcReturnDetails().stream().forEach(it -> {
        if (StringUtils.isBlank(it.getNontaxSaleMoney().toString())) {
            pcReturnManage.setTotalNontaxSaleMoney(BigDecimal.ZERO);
        } else {
            pcReturnManage.setTotalNontaxSaleMoney(pcReturnManage.getTotalNontaxSaleMoney().add(it.getNontaxSaleMoney()));
        }
    });
    excelService.exportBillDetail(response, pcReturnManage,
            pcReturnManage.getPcReturnDetails(), "return-bill", PcReturnManage.class);
}

页面
// 将数据流转为excel下载到本地
export function parseToExcel (fileName, data) {
const blob = new Blob([data], { type: ‘application/vnd.ms-excel;charset=utf-8’ })
const eLink = document.createElement(‘a’)
eLink.download = fileName
eLink.style.display = ‘none’
eLink.href = URL.createObjectURL(blob)
document.body.appendChild(eLink)
eLink.click()
URL.revokeObjectURL(eLink.href)
document.body.removeChild(eLink)
}

 // 导出
  handleExport () {
    console.log('导出')
    const that = this
    this.$confirm({
      title: '提示',
      content: `确定导出数据?`,
      okText: '导出',
      okType: 'warning',
      cancelText: '取消',
      onOk () {
        // 调用导出方法
        that.$message.loading('文件下载中...', 1)
        exportGoodsPutinDetail({ id: that.goodsEntryId }).then(res => {
          const fileName = 'xxxxxxx.xlsx'
          parseToExcel(fileName, res)
          that.$message.info('导出成功', 1)
        })
      },
      onCancel () {
      }
    })
  }
}

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值