java复杂excel导出--easyexcel

使用java导出复杂excel

基本思路:通过下载oss的模板,然后进行填充,写到一个临时文件,最终将临时文件删除,进行导出
最终效果如下

在这里插入图片描述

首先是模板上传到oss上,具体模板如下,上传方法可以用阿里云或者oss提供得方法
注意{.xxx}前面有点表示list的参数,无点表示map的参数

在这里插入图片描述

开始进行导出

//导出明细表excel并上传到阿里云
	public String exportVchPrepareCashData(List<VchPrepareCashVo> list, VchVoucherCashCondition condition) throws Exception {
		//originDataList 为需要导出的数据
		List<Object> originDataList = (List<Object>) (List) list;
		//获取模板文件对象
		S3Object s3Object = ossTemplate.getObject(bucketName, OssPathCst.PREPAREVERCHUR_CASH_LINE_EXPORT_TEMP_PATH);


		//设置请求头
		DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
		LocalDateTime localDateTime = LocalDateTime.now();
		String dateStr = localDateTime.format(formatter);
		DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
		LocalDateTime localDateTime2 = LocalDateTime.now();
		String dateStr2 = localDateTime2.format(formatter2);


		//设置文件名
		String fileName = OssPathCst.PREPAREVERCHUR_CASH_LINE_EXPORT_TEMP_FILENAME.replaceAll("YYYYMMDDhhmmss", dateStr);


		Map<String, Object> paramsMap = new HashMap();
		paramsMap.put("dateStr2", "提交时间:" + dateStr2);
		paramsMap.put("VoucherPeriod2", "期间:" + condition.getVoucherPeriod());
		paramsMap.put("compCode2", "公司段:" + condition.getCompCode());
		paramsMap.put("unit2", "单位:                 元");


		File file = vchEasyExcelService.fillWithVchTemplateTable(originDataList, paramsMap, s3Object.getObjectContent(), fileName);
		log.info("生成临时文件{}", file.getName());


		MultipartFile multipartFile = new MockMultipartFile(fileName, file.getName(), null, new FileInputStream(file));
		//明细表目录
		String filePath = "vc/";
		//将文件上传到OSS
		HttpResult<HashMap<String, Object>> upload = vchVoucherHandoverService.upload(multipartFile, filePath);
		//关闭oss流
		IOUtils.closeQuietly(s3Object);
		file.delete();
		//将文件路径返回
		return (String) upload.getData().get("fullPath");
	}

以下是具体导出方法fillWithVchTemplateTable

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelReader;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.read.metadata.ReadSheet;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.cpit.ycyt.vch.rule.excel.export.ExcelUtils;
import com.cpit.ycyt.vch.service.VchEasyExcelService;
import com.cpit.ycyt.vch.utils.TimestampStringConverter;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.commons.CommonsMultipartFile;


import java.io.*;
import java.util.List;
import java.util.Map;


@Slf4j
@Service
public class VchEasyExcelServiceImpl implements VchEasyExcelService {

    //文件地址,需要在服务器或者本地存在的路径
    @Value("${export.file.tmpfilepath:}")
    private String tmpfilepath;


    @Value("${export.file.sizeThreshold:}")
    private Integer sizeThreshold;


    public File fillWithVchTemplateTable(List<Object> data, Map<String, Object> map, InputStream inputStream, String fileName) throws Exception {
        //目标文件
        File targetFile = new File(tmpfilepath + fileName);
        //临时文件
        File templateFile = new File(tmpfilepath  + "M_" + fileName);
        FileItemFactory factory = new DiskFileItemFactory(sizeThreshold, null);
        FileItem fileItem = factory.createItem("textField", "text/plain", true, fileName);
        //获取模板文件
        try (Workbook workbook = ExcelUtils.getWorkBookTemplate("xlsx", inputStream);
             OutputStream os = fileItem.getOutputStream();) {
            workbook.write(os);
            MultipartFile multipartFile = new CommonsMultipartFile(fileItem);
            multipartFile.transferTo(templateFile);
        } catch (Exception e) {
            log.error("读取模板文件失败{}", fileName, e);
            throw e;
        }
        try (ExcelWriter excelWriter = EasyExcel.write(targetFile).registerConverter(new TimestampStringConverter()).withTemplate(templateFile).build();
             ExcelReader excelReader = EasyExcel.read(templateFile).build();) {
            List<ReadSheet> readSheetList = excelReader.excelExecutor().sheetList();
            if(CollectionUtils.isNotEmpty(readSheetList)){
                readSheetList.forEach(readSheet -> {
                    log.info("开始填充sheet {}, {}", readSheet.getSheetNo(), readSheet.getSheetName());
                    WriteSheet writeSheet = EasyExcel.writerSheet(readSheet.getSheetNo()).build();
                    excelWriter.fill(map, writeSheet);
                    excelWriter.fill(data, writeSheet);
                });
            }
        } catch (Exception e) {
            log.error("填充模板文件失败{}", fileName, e);
            throw e;
        } finally {
            if(templateFile.exists()){
                templateFile.delete();
            }
        }
        return targetFile;
    }
}

public static Workbook getWorkBookTemplate(String suffix, InputStream in) throws Exception {
        //创建Workbook工作薄对象,表示整个excel
        Workbook workbook = null;
        try {
            //根据文件后缀名不同(xls和xlsx)获得不同的Workbook实现类对象
            if("xls".equalsIgnoreCase(suffix)){
                //2003
                workbook = new HSSFWorkbook(in);
            }else if("xlsx".equalsIgnoreCase(suffix)){
                //2007
//                workbook = new XSSFWorkbook(in);
                workbook = new SXSSFWorkbook(new XSSFWorkbook(in), 200);
            }
        } catch (Throwable t) {
            throw new Exception("创建excel工作簿workBook失败");
        }
        return workbook;
    }```

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值