zoukankan      html  css  js  c++  java
  • 使用 easypoi 导出excel

    1、使用注解导出excel

    2、使用模板导出excel

       /**
         * @Description:
         * @param response
         * @param request
         * @param planTotalId
         * @param planTotalIdGroup
         * @param orgId
         * @author  houChen
         * @date  2020/5/4 17:27
         */
        @RequestMapping(value="exportexcel")
        @ResponseBody
        public void exportExcelTest(HttpServletResponse response,HttpServletRequest request,Long planTotalId,
                                    Long planTotalIdGroup,Long orgId){
            Workbook workbook = fmexpenseplantotalService.constructWorkbook1(planTotalId,planTotalIdGroup,orgId);
            downLoadExcel("资金支出申报表.xlsx", response, workbook);
        }
    

      //将workbook 写出到response流中
    private static void downLoadExcel(String fileName, HttpServletResponse response, Workbook workbook) { try { response.setCharacterEncoding("UTF-8"); response.setHeader("content-Type", "application/vnd.ms-excel"); response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); workbook.write(response.getOutputStream()); } catch (IOException e) { e.getStackTrace(); } }


    /**
    * @Description: 使用 Easyiop 的模板方式导出 excel (注释模板混用 ==》 合并单元格)
    * @param planTotalId
    * @param planTotalIdGroup
    * @param orgId
    * @author houChen
    * @date 2020/4/30 15:43 注意:这是我自己构造的数据,你们要按照你们的实际需求来构造数据
    */
    public Workbook constructWorkbook1(Long planTotalId, Long planTotalIdGroup, Long orgId) {
    TemplateExportParams params = new TemplateExportParams("static/template/ExcelTemplate.xlsx");
    Map<String, Object> map = new HashMap<String, Object>(); //构造模板需要的相关信息

    // 查询导出的excel的表头和表尾信息
    Map<String, Object> p = new HashMap<String, Object>();
    p.put("planTotalId", planTotalId);
    Map<String, Object> info = bSqlHelper.getMap("business.fm.FmExpensePlanTotal.getBaseInfo", p);
    map.put("month",Objects.toString(info.get("month"),""));
    map.put("orgName",Objects.toString(info.get("orgIdName"),""));
    map.put("yearC",Objects.toString(info.get("yearC"),""));
    map.put("monthC",Objects.toString(info.get("monthC"),""));
    map.put("dayC",Objects.toString(info.get("dayC"),""));
    map.put("createAccountText",Objects.toString(info.get("createAccountText"),""));
    map.put("businessDeptName", "");
    //获取事业部名称
    String org = Objects.toString(info.get("orgId"), "");
    if(!"".equals(org)){
    Long belongDept = basOrgService.findByOrgId(Long.parseLong(org)).getBelongDept();
    if(belongDept!=null){
    map.put("businessDeptName",basDeptService.findByDeptId(belongDept).getDeptName());
    }
    }
    // 汇总的审批意见
    Map<String, Map<String, Object>> formAdvices = flowUtilService.queryWorkMemory("FmExpensePlanTotal", Long.parseLong(Objects.toString(info.get("processinstid"))));
    map.put("deptOpinion", formAdvices.get("deptOpinion").get("accountName"));
    map.put("leader", formAdvices.get("leader").get("accountName"));

    List<ExcelEntity> result =new ArrayList<>();
    //1、构造日常支出费用的List
    // 获取 事业部资金计划汇总下的所有资金计划 + 资金计划关联的明细 (1、收支计划ID 2,收支计划名称 3、收支计划数量)
    Double totalMoneyForExpense =0d;//日常费用支出合计
    Double totalMoneyForProject =0d;//项目建设支出总的合计
    Long expenseEndRow = 0L; // 日常收支计划 第二列合并结束的行数

    List<Map<String,Object>> statisticInfoByClassId = fmexpenseplandetailService.statisticByClassIdAndPlanTotalId(planTotalId);
    for(Map<String,Object> m:statisticInfoByClassId){
    String classId = Objects.toString(m.get("classId"), "");
    Double applyMoneyByclassid= Double.parseDouble(Objects.toString(m.get("applyMoneyByclassid"), "0"));
    totalMoneyForExpense += applyMoneyByclassid;

    //每个收支项目明细的个数
    String classNumStr = Objects.toString(m.get("classNum"), "0");
    long classNum = Long.parseLong(classNumStr);
    expenseEndRow+=(classNum+1);

    // 根据planTotalId 和 classId 获取资金收支计划的子表信息
    if(!"".equals(classId)){
    List<Map<String,Object>> detailList = fmexpenseplandetailService.findDetailListByPlanTotalId(planTotalId,Long.parseLong(classId));
    for(Map<String,Object> detail:detailList){
    ExcelEntity a =new ExcelEntity();
    a.setTopClass("日常支出费用");
    a.setSecClass(Objects.toString(m.get("className"),""));
    a.setSystemName(Objects.toString(detail.get("systemName"),""));
    a.setApplyMoney(Objects.toString(detail.get("applyMoney"),""));
    a.setDeptName(Objects.toString(detail.get("deptName"),""));
    a.setReceiveUnit("");
    a.setBudgetBase("");
    a.setRemark(Objects.toString(detail.get("remark"),""));
    result.add(a);
    }
    //每个收支分类的合计
    ExcelEntity heji =new ExcelEntity();
    heji.setTopClass("日常支出费用");
    heji.setSecClass(Objects.toString(m.get("className"),""));
    heji.setSystemName("合计");
    heji.setApplyMoney(applyMoneyByclassid.toString());
    heji.setDeptName("");
    heji.setReceiveUnit("");
    heji.setBudgetBase("");
    heji.setRemark("");
    result.add(heji);
    }
    }
    //日常收支费用的合计
    ExcelEntity heji1 =new ExcelEntity();
    heji1.setTopClass("日常支出费用");
    heji1.setSecClass("合计");
    heji1.setSystemName("合计");
    heji1.setApplyMoney(totalMoneyForExpense.toString());
    heji1.setDeptName("");
    heji1.setReceiveUnit("");
    heji1.setBudgetBase("");
    heji1.setRemark("");
    result.add(heji1);

    // 集团 资金收支计划汇总 统计月度资金计划的相关信息
    List<Map<String,Object>> statisticInfoByProjectId = fmexpenseplandetailService.simple(planTotalIdGroup,orgId);
    if(statisticInfoByProjectId.size()!=0){
    for(Map<String,Object> m:statisticInfoByProjectId){
    String classId = Objects.toString(m.get("classId"), "");
    Double applyMoneyByclassid= Double.parseDouble(Objects.toString(m.get("applyMoneyByclassid"), "0"));
    totalMoneyForProject += applyMoneyByclassid;
    // 根据 集团汇总Id planTotalIdGroup 和 orgId 获取资金计划的子表信息
    if(!"".equals(classId)){
    List<Map<String,Object>> detailList = pmPayPlanService.findByplanTotalIdGroupAndOrgId(planTotalIdGroup,orgId,Long.parseLong(classId));
    for(Map<String,Object> detail:detailList){
    ExcelEntity a =new ExcelEntity();
    a.setTopClass("项目建设支出");
    a.setSecClass(Objects.toString(m.get("className"),""));
    a.setSystemName(Objects.toString(detail.get("systemName"),""));
    a.setApplyMoney(Objects.toString(detail.get("applyMoney"),""));
    a.setDeptName(Objects.toString(detail.get("deptName"),""));
    a.setReceiveUnit("");
    a.setBudgetBase("");
    a.setRemark(Objects.toString(detail.get("remark"),""));
    result.add(a);
    }
    //每个收支分类的合计
    ExcelEntity heji =new ExcelEntity();
    heji.setTopClass("项目建设支出");
    heji.setSecClass(Objects.toString(m.get("className"),""));
    heji.setSystemName("合计");
    heji.setApplyMoney(applyMoneyByclassid.toString());
    heji.setDeptName("");
    heji.setReceiveUnit("");
    heji.setBudgetBase("");
    heji.setRemark("");
    result.add(heji);
    }
    }
    ExcelEntity heji2 =new ExcelEntity();
    heji2.setTopClass("项目建设支出");
    heji2.setSecClass("合计");
    heji2.setSystemName("合计");
    heji2.setApplyMoney(totalMoneyForProject.toString());
    heji2.setDeptName("");
    heji2.setReceiveUnit("");
    heji2.setBudgetBase("");
    heji2.setRemark("");
    result.add(heji2);
    }
    map.put("list", result);
    //日常费用支出 + 项目建设支出总费用
    Double totol = totalMoneyForProject+totalMoneyForExpense;
    map.put("totol", totol.toString());

    Workbook workbook = ExcelExportUtil.exportExcel(params , map);
    Sheet sheetAt = workbook.getSheetAt(0);
    //合并第一列
    Map<Integer, int[]> mergeMap =new HashMap<>();
    mergeMap.put(0, null);
    // Map<Integer, int[]> mergeMap ===> key--列,value--依赖的列,没有传空
    PoiMergeCellUtil.mergeCells(sheetAt, mergeMap, 3,sheetAt.getLastRowNum()-2);

    //合并第二列
    // 1、日常收支费用的合并
    Map<Integer, int[]> mergeMap1 =new HashMap<>();
    mergeMap1.put(1,null);
    int endRow = expenseEndRow.intValue()+3-1;
    PoiMergeCellUtil.mergeCells(sheetAt, mergeMap1, 3,endRow);
    //合并日常收支费用的合计
    CellRangeAddress region1 = new CellRangeAddress(endRow+1, endRow+1, (short) 1, (short) 2); //参数1:起始行 参数2:终止行 参数3:起始列 参数4:终止列
    sheetAt.addMergedRegion(region1);
    //2、项目建设的合并 (当项目建设有数据时)
    if(statisticInfoByProjectId.size()!=0){
    Map<Integer, int[]> mergeMap2 =new HashMap<>();
    mergeMap1.put(1,null);
    PoiMergeCellUtil.mergeCells(sheetAt, mergeMap1, endRow+2,sheetAt.getLastRowNum()-3);
    //合并项目支出费用的合计
    CellRangeAddress region2 = new CellRangeAddress(sheetAt.getLastRowNum()-2, sheetAt.getLastRowNum()-2, (short) 1, (short) 2); //参数1:起始行 参数2:终止行 参数3:起始列 参数4:终止列
    sheetAt.addMergedRegion(region2);
    }

    //设置单元格样式
    CellStyle cellStyle = workbook.createCellStyle();//新建单元格样式
    cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 居中
    cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
    cellStyle.setWrapText(true);//设置自动换行
    //为所有的单元格渲染样式
    int rowNum = sheetAt.getLastRowNum();
    System.out.println(rowNum);
    for(int i=3;i<rowNum;i++){
    Row row = sheetAt.getRow(i);
    int colNum = row.getPhysicalNumberOfCells();
    for(int j=0;j<colNum;j++){
    //对金钱格式进行特殊处理
    if(j==3){
    DataFormat dataFormat = workbook.createDataFormat();// 此处设置数据格式
    cellStyle.setDataFormat(dataFormat.getFormat("#,##0.00"));
    }
    Cell cell = row.getCell((short) j);
    cell.setCellStyle(cellStyle);
    cell.setCellType(HSSFCell.CELL_TYPE_STRING);
    }
    }
    return workbook;
    }
     

    效果如下:

     

    下面是我用到的两个合并单元格的方法

    // 竖向合并相同单元格,必须保证被合并的需要有两个及两个以上的单元格
    // Map<Integer, int[]>  mergeMap  ===>  key--列,value--依赖的列,没有传空
    // startRow 起始行   endRow 结束行
    public static void mergeCells(Sheet sheet, Map<Integer, int[]> mergeMap, int startRow,int endRow) {}
    
    
    //合并一个区域类的单元格
    /
    /参数1:起始行 参数2:终止行 参数3:起始列 参数4:终止列
    CellRangeAddress region = new CellRangeAddress(endRow+1, endRow+1, (short) 1, (short) 2); 
    sheet.addMergedRegion(region);

    给单元格设置样式

    HSSFCellStyle cellStyle = wb.createCellStyle();  
    
     一、设置背景色:
    cellStyle.setFillForegroundColor((short) 13);// 设置背景色  
    cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); 
    
    二、设置边框:
    cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下边框  
    cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框  
    cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框  
    cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框 
     
    三、设置居中:
    cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 居中  
    
    四、设置字体:
    HSSFFont font = wb.createFont();  
    font.setFontName("黑体");  
    font.setFontHeightInPoints((short) 16);//设置字体大小   
    font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);//粗体显示  
    font.setFontHeightInPoints((short) 12);  
      
    cellStyle.setFont(font);//选择需要用到的字体格式  
    
    五、设置列宽:
    sheet.setColumnWidth(0, 3766); 
    //第一个参数代表列id(从0开始),第2个参数代表宽度值  参考 :"2012-08-10"的宽度为2500  
    
    六、设置自动换行:
    cellStyle.setWrapText(true);//设置自动换行
  • 相关阅读:
    (数字类型,进制转换,字符串,列表)介绍,操作,内置方法
    谁说JavaScript容易?
    sass/scss 和 less的区别
    为什么commonjs不适合于浏览器端
    nodejs与v8引擎
    单例模式和angular的services的使用方法
    深入浅出 妙用Javascript中apply、call、bind
    单页Web应用优缺点
    JavaScript面向对象
    使用iframe的优缺点,为什么少用iframe以及iframe和frame的区别。
  • 原文地址:https://www.cnblogs.com/houchen/p/12834369.html
Copyright © 2011-2022 走看看