使用EasyPoi根据模板导出Excel或word文档

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lchq1995/article/details/84823592

接着上篇文章 Java根据模板导出Excel并生成多个Sheet 简单介绍下EasyPoi的使用,直接上代码吧

首先当然是先引入jar包了,看下图

其次,还是贴代码吧看实例,下面是根据模板导出的工具类,包含Excel和word

/**
 * 导出Excel或Word文件
 * @ClassName:ExportExcelOrWord
 * @author leon
 * @createDate 2018年11月26日 下午14:25:27
 * @version v1.0
 * @classRemarks TODO
 */
@Configuration
public class ExportExcelOrWord {
    
    private static Logger logger = LoggerFactory.getLogger(ExportExcelOrWord.class);
    
    //模板地址
    @Value("${fileTemplateUrl}")
    private String fileTemplateUrl="D:/";
    //文件存储地址
    @Value("${fileGoalUrl}")
    private String fileGoalUrl="D:/export/";
    
    /**
     *  导出word数据(07版)
     * @param params map数据集合
     * @param fileName 模板名称
     * @param goalName 文件名称
     * @return 文件存储地址
     * @throws Exception
     */
    public String exportWord(Map<String, Object> params, String fileName, String goalName){
        
        try {
            fileName=fileTemplateUrl+fileName+".docx";
            XWPFDocument doc = WordExportUtil.exportWord07(fileName, params);
            // 判断文件存放地址是否存在,没有则创建
            File savefile = new File(fileGoalUrl);
            if (!savefile.exists()) {
                logger.info("导出word数据时存储文件目录不存在,为您创建文件夹!");
                savefile.mkdirs();
            }
            goalName=fileGoalUrl+goalName+".docx";
            FileOutputStream fos = new FileOutputStream(goalName);
            doc.write(fos);
            fos.close();
        }  catch (Exception e) {
            e.printStackTrace();
            logger.error("导出word数据异常:"+e);
            return null;
        }
        return goalName;
    }
    
   

    /**
     * 按模板导出Excel数据
     * @param params 数据
     * @param fileName 模板名称
     * @param goalName 文件名称
     * @return 文件存储地址
     * @throws Exception
     */
    public String exportExcel(Map<String, Object> params, String fileName, String goalName){
        
        try {
            fileName=fileTemplateUrl+fileName+".xlsx";
            TemplateExportParams templateUrl = new TemplateExportParams(fileName);
            Workbook workbook = ExcelExportUtil.exportExcel(templateUrl, params);
            // 判断文件存放地址是否存在,没有则创建
            File savefile = new File(fileGoalUrl);
            if (!savefile.exists()) {
                logger.info("按模板导出Excel数据时存储文件目录不存在,为您创建文件夹!");
                savefile.mkdirs();
            }
            goalName=fileGoalUrl+goalName+".xlsx";
            FileOutputStream fos = new FileOutputStream(goalName);
            workbook.write(fos);
            fos.close();
        }catch (IOException e) {
            e.printStackTrace();
            logger.error("按模板导出Excel数据异常:"+e);
            return null;
        }
        return goalName;
    }
    
    /**
     * 按模板导出Excel数据(支持文件流读取文件)
     * @param params 数据
     * @param fileName 模板名称
     * @param goalName 文件名称
     * @return 文件存储地址
     * @throws Exception
     */
    public String exportExcel(Map<String, Object> params, String fileName, String goalName,HttpServletResponse response){
        
        try {
            fileName=fileTemplateUrl+fileName+".xlsx";
            TemplateExportParams templateUrl = new TemplateExportParams(fileName);
            Workbook workbook = ExcelExportUtil.exportExcel(templateUrl, params);
            // 判断文件存放地址是否存在,没有则创建
            File savefile = new File(fileGoalUrl);
            if (!savefile.exists()) {
                logger.info("按模板导出Excel数据时存储文件目录不存在,为您创建文件夹!");
                savefile.mkdirs();
            }
            //写文件流
            response.setCharacterEncoding("UTF-8");
            response.setHeader("content-Type", "application/vnd.ms-excel");
            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(goalName+".xlsx", "UTF-8"));
            workbook.write(response.getOutputStream());
            //写文件
            goalName=fileGoalUrl+goalName+".xlsx";
            FileOutputStream fos = new FileOutputStream(goalName);
            workbook.write(fos);
            fos.close();
        }catch (IOException e) {
            e.printStackTrace();
            logger.error("按模板导出Excel数据异常:"+e);
            return null;
        }
        return goalName;
    }

    /**
     * 多sheet导出Excel数据 每个sheet对应一个map,
     * key是sheet的NUM
     * @param params 数据集合
     * @param fileName 模板名称
     * @param goalName 文件名称
     * @return 文件存储地址
     * @throws Exception
     */
    public String exportExcelManeySheet(Map<Integer, Map<String, Object>> params, String fileName, String goalName){
        
        try {
            fileName=fileTemplateUrl+fileName+".xlsx";
            TemplateExportParams templateUrl = new TemplateExportParams(fileName);
            Workbook workbook = ExcelExportUtil.exportExcel(params, templateUrl);
            // 判断文件存放地址是否存在,没有则创建
            File savefile = new File(fileGoalUrl);
            if (!savefile.exists()) {
                logger.info("多sheet导出Excel数据的存储文件目录不存在,为您创建文件夹!");
                savefile.mkdirs();
            }
            goalName=fileGoalUrl+goalName+".xlsx";
            FileOutputStream fos = new FileOutputStream(goalName);
            workbook.write(fos);
            fos.close();
        } catch (Exception e) {
            e.printStackTrace();
            logger.error("多sheet导出Excel数据异常:"+e);
            return null;
        }
        return goalName;
    }
    
    /**
     * 单Excel文件多sheet导出Excel数据(注意sheetMap的key需与对象数组中的对象名称一致)
     * @param sheetMap map数据 如:sheetMap.put("PersonnelInfo",List<PersonnelInfo>);
     * @param sheetName sheet名称数组 如:new String[] {"人员信息","家庭信息",...};
     * @param objectClass 对象名称数组 如:new String[] {"PersonnelInfo","EducatInfo",...};
     * @param goalName 文件名称
     * @return 文件存储地址
     * @throws Exception
     */
    public String exportExcelManeySheet(Map<Object, Object> sheetMap,String[] sheetName,String[] objectClass,String goalName){
        
        //判断参数是否为空
        if (sheetName.length<1||objectClass.length<1||sheetMap==null||StringUtil.isNull(goalName)) {
            return null;
        }
        try {
            List<Map<String, Object>> sheetsList = new ArrayList<Map<String, Object>>() ;
            for (int i = 0; i < sheetName.length; i++) {
                //判断map和对象是否为空
                if (StringUtil.isNull(objectClass[i]) &&sheetMap.get(objectClass[i]) == null) {
                    continue;
                }
                  ExportParams exportParams = new ExportParams() ;
                  exportParams.setSheetName(sheetName[i]);
                  exportParams.setStyle(ExcelExportStyler.class);
                Map<String, Object> exportMap = new HashMap<String, Object>();
                exportMap.put("title",exportParams);
                exportMap.put("entity",Class.forName("com.isoftstone.common.utils.excelUtil.entity."+objectClass[i]));
                exportMap.put("data", sheetMap.get(objectClass[i]));
                sheetsList.add(exportMap);
            }
            Workbook workbook = ExcelExportUtil.exportExcel(sheetsList, ExcelType.HSSF) ; 
            // 判断文件存放地址是否存在,没有则创建
            File savefile = new File(fileGoalUrl);
            if (!savefile.exists()) {
                logger.info("单Excel文件多sheet导出Excel数据的存储文件目录不存在,为您创建文件夹!");
                savefile.mkdirs();
            }
            goalName=fileGoalUrl+goalName+".xls";
            FileOutputStream fos = new FileOutputStream(goalName);
            workbook.write(fos);
            fos.close();
        } catch (Exception e) {
            e.printStackTrace();
            logger.error("单Excel文件多sheet导出Excel数据异常:"+e);
            return null;
        }
        return goalName;
    }
    
    /**
     * 一个excel 创建多个sheet
     * list 多个Map key title 对应表格
     * Title key entity 对应表格对应实体 
     * key data Collection 数据
     * @param list 数据集合
     * @param goalName 文件名称
     * @return
     */
    public String exportExcel(List<Map<String, Object>> list, String goalName,HttpServletResponse response){
        
        try {
            Workbook workbook = ExcelExportUtil.exportExcel(list, ExcelType.HSSF);
            // 判断文件存放地址是否存在,没有则创建
            File savefile = new File(fileGoalUrl);
            if (!savefile.exists()) {
                logger.info("按模板导出Excel数据时存储文件目录不存在,为您创建文件夹!");
                savefile.mkdirs();
            }
            //写文件流
            response.setCharacterEncoding("UTF-8");
            response.setHeader("content-Type", "application/vnd.ms-excel");
            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(goalName+".xls", "UTF-8"));
            workbook.write(response.getOutputStream());
            //写文件
            goalName=fileGoalUrl+goalName+".xls";
            FileOutputStream fos = new FileOutputStream(goalName);
            workbook.write(fos);
            fos.close();
        }catch (IOException e) {
            e.printStackTrace();
            logger.error("按模板导出Excel数据异常:"+e);
            return null;
        }
        return goalName;
    }

下面看下调用过程,超简单

public static void main(String[] args) throws Exception {
        
        ExportExcelOrWord ex=new ExportExcelOrWord();
        
        /*//离场证明
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("name", "leon");
        map.put("idNo", "436215688256556655");
        map.put("adY", "2018");
        map.put("adM", "11");
        map.put("adD", "30");
        map.put("leY", "2019");
        map.put("leM", "11");
        map.put("leD", "31");
        map.put("serDept", "华南事业部");
        map.put("serDate", "2018年 11月 28日— 2018年 11月 29日");
        String url=ex.exportWord(map, "离场证明", "离场证明模板数据");
        System.out.println("文件地址:"+url);*/
        
        /*//工资清单(北京人车)/工资清单(其他)
        Map<String, Object> map = new HashMap<String, Object>();
        List<Map<String, Object>> listMap=new ArrayList<Map<String, Object>>();
        for (int i = 0; i < 2; i++) {
            Map<String, Object> mapIn = new HashMap<String, Object>();
            mapIn.put("city", "深圳"+i);
            mapIn.put("id", ""+i+1);
            mapIn.put("userNo", "A007");
            mapIn.put("surname", "Leon");
            mapIn.put("email", "[email protected]");
            listMap.add(mapIn);
        }
        map.put("maplist", listMap);//注意此处的maplist需要与文件模板中fe后面的maplist名称一致
        String url=ex.exportExcel(map, "工资清单(其他)", "工资清单(其它)模板数据");
        System.out.println("文件地址:"+url);*/
        
        */
        //人员信息汇总
        Map<Object, Object> sheetMap=new  HashMap<Object, Object>();
        List<RelatInfo> relatInfolist =new ArrayList<RelatInfo>();
        for (int i = 0; i < 2; i++) {
            RelatInfo relat=new RelatInfo();
            relat.setUserNo("B002"+i);
            relat.setSurname("Leon");
            relat.setTelephone("1387561245"+i);
            relatInfolist.add(relat);
        }
        List<WorkHistory> workHistorylist =new ArrayList<WorkHistory>();
        for (int i = 0; i < 3; i++) {
            WorkHistory work =new WorkHistory();
            work.setUserNo("A001"+i);
            work.setSurname("测试数据"+i);
            work.setBeginDate("2018/11/28");
            work.setEndDate("2018/11/28");
            work.setPosition("老板");
            work.setCorporateName("吹水无敌");
            workHistorylist.add(work);
        }
        sheetMap.put("RelatInfo", relatInfolist);
        sheetMap.put("WorkHistory", workHistorylist);
        String url=ex.exportExcelManeySheet(sheetMap,new String[]{"工作经历","家庭信息"},new String[]{"RelatInfo","WorkHistory"},"D:/入场人员信息汇总-测试.xls");
        System.out.println("文件地址:"+url);
    }

说明一下,后面一个方法是多sheet导出的方式,多sheet导出easypoi的方法存在大坑,单条数据可以导出多条不行需要重新实现,过于复杂这里使用一个简单的用实体类直接导出多sheet,更多详细的方法请参考源码,其实比较调用都比较简单拼接参数容易遇坑,各位请注意

哦,对了,带图片的需要注意一下,需要设置参数(这里简单设置几个属性,其它请自行根据需求设置)

 还有个就是多sheet导出时的样式自定义的问题(个人这里只设置了头部样式),上面其实有用到就下面图中标注的

下面给出这个样式类,大家可以自行扩展

猜你喜欢

转载自blog.csdn.net/lchq1995/article/details/84823592