poi 根据模板填充数据生成excl文件

时间:2019-01-23
本文章向大家介绍poi 根据模板填充数据生成excl文件,主要包括poi 根据模板填充数据生成excl文件使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

本文中是对于xlsx文件

第一步

     获取要填充的数据

第二步

    把模板中的值及对数据的操作存放到MAP中

Map<String, String> tempNameList = new HashMap<String, String>();
tempNameList.put(“{年月}” "1");

第三步

    读取模板

InputStream in = new FileInputStream(file); 

第四步

    对模板进行操作

Workbook wb = new XSSFWorkbook(in);

// 一页的数量
        int pageNum = (int) wb.getSheetAt(1).getRow(15).getCell(16).getNumericCellValue();
        // sheet的总个数
        int sheetZnum = list.size() / pageNum;
        if (list.size() % pageNum > 0) {
            sheetZnum += 1;
        }
        wb.removeSheetAt(1);
        XSSFSheet sheet = (XSSFSheet) wb.getSheetAt(0);
        // 获得总列数
        int coloumZnum = sheet.getRow(0).getLastCellNum();
        // 获得总行数
        int rowZnum = sheet.getLastRowNum();
        // 生成sheet
        for (int iPage = 0; iPage < sheetZnum; iPage++) {
            XSSFSheet sheetNew = null;
            if (iPage > 0) {
                sheetNew = (XSSFSheet) wb.cloneSheet(0);
            } else {
                sheetNew = (XSSFSheet) wb.getSheetAt(0);
            }
            // 设置展示的百分比
            sheetNew.setZoom(70);
            // 是否自适应界面
            sheetNew.setFitToPage(true);
        }

第五步

      为做好的模板填充数据

// 循环赋值
        for (int sheetNum = 0; sheetNum < sheetZnum; sheetNum++) {
            XSSFSheet sheet1 = (XSSFSheet) wb.getSheetAt(sheetNum);
            for (int rowNum = 0; rowNum < rowZnum; rowNum++) {
                XSSFRow row = sheet1.getRow(rowNum);
                for (int coloumNum = 0; coloumNum < coloumZnum; coloumNum++) {
                    XSSFCell cell = row.getCell(coloumNum);
                    String value = cell.getStringCellValue();
                    if (StringUtils.isNotBlank(value)) {
                        int index = sheetNum * pageNum + Integer.valueOf(value.split("_")[1]);
                        setCell(cell, wb, list, value.split("_")[0], index, tempNameList);
                    }
                }
            }
        }

 /**
     * 填充数据
     * 
     * @param cell 单元格
     * @param wb 工作空间
     * @param list 获取的数据集
     * @param name 模板单元格中的数据
     * @param index 对应的数据集合的数据位置
     * @param tempNameList 获取数据对应的方法集
     * @throws Exception 异常
     */
    private void setCell(XSSFCell cell, Workbook wb, List<WChouriSyokusatu> list, String name, int index,
        Map<String, String> tempNameList) throws Exception {
        if (index <= list.size()) {
            WChouriSyokusatu w = list.get(index - 1);
            setValue(w, tempNameList.get(name), cell, wb);
        } else {
            cell.setCellValue("");
        }
    }

/**
     * 设置值    不同的显示格式可以创建多个方式
     * 
     * @param w 数据集
     * @param map 获取数据对应的方法
     * @param cell 单元格
     * @param wb 工作空间
     * @throws Exception 异常
     */
    private void setValue(WChouriSyokusatu w, String map, XSSFCell cell, Workbook wb) throws Exception {
        String val = "";
        switch (map.split(",")[0]) {
           case "2" :
                val = getVal1(w, map.split(",")[1]);
                break;
            case "3" ://根据数据中的rgb参数设置背景样色和字体颜色
                String kbn = getVal1(w, map.split(",")[1]);
                if (kbn.equals("2")) {
                    forColor(getVal1(w, map.split(",")[2]), 0, cell, wb);
                    forColor(getVal1(w, map.split(",")[3]), 1, cell, wb);
                    val = getVal1(w, map.split(",")[4]);
                }
                break;
        }
        cell.setCellValue(val);
    } 

/**
     * java反射bean的get方法 获取值
     * 
     * @param w 执行对象
     * @param name 方法名
     * @return 值
     * @throws Exception 异常
     */
    private String getVal1(WChouriSyokusatu w, String name) throws Exception {
        Method m = w.getClass().getMethod(name);
        return m.invoke(w) == null || m.invoke(w).equals("") ? "" : m.invoke(w).toString();
    } 

 /**
     * 设置颜色
     * 
     * @param obj 颜色
     * @param index 属性:0 :背景颜色 1:字体颜色
     * @param cell 单元格
     * @param wb 工作空间
     */
    private void forColor(String obj, int index, XSSFCell cell, Workbook wb) {
        if (StringUtils.isNotBlank(obj)) {
            XSSFCellStyle newStyle = (XSSFCellStyle) wb.createCellStyle();
            XSSFFont newFont = (XSSFFont) wb.createFont();
            XSSFCellStyle cellStyle = cell.getCellStyle();
            newStyle.cloneStyleFrom(cellStyle);
            Color color = Color.decode(obj);
            @SuppressWarnings("deprecation")
            XSSFColor xssfColor = new XSSFColor(color);
            if (index == 0) {
                newStyle.setFillForegroundColor(xssfColor);
                // 牢固填充
                newStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
            } else {
                XSSFFont font = cellStyle.getFont();
                newFont.setFontName(font.getFontName()); // 设置字体名称
                newFont.setFontHeightInPoints(font.getFontHeightInPoints()); // 设置字号
                newFont.setUnderline(font.getUnderline()); // 设置下划线
                newFont.setTypeOffset(font.getTypeOffset()); // 设置上标下标
                newFont.setStrikeout(font.getStrikeout()); // 设置删除线
                newFont.setColor(xssfColor);
                newFont.setBold(font.getBold());
                newStyle.setFont(newFont);
            }
            cell.setCellStyle(newStyle);
        }
    }