javaUtil——导出excel——单行数据模板

首先,大家可以看一下我的模板这里写图片描述
最后一行一定是规则。
其中#index#表示自动填入序号,%XXXX%其中的XXXX是和javaBean对象对应的字符串(及和get方法对应)。
然后就会将你的数据自动写入到excel中。
注意:

这里必须使用poi1.17版本1.11测试时发现缺少函数
此方法暂时只对xlsx文件有效,对xls不适用(HSSFBook缺少函数,如果要适配需要手动补充复制行,复制列的方法)

现在开始讲解我的思路:maven配置放在了最后
首先,先用模板文件初始化workbook对象
XSSFWorkbook workbook = new XSSFWorkbook(new FileInputStream("O:\\file\\数据模板.xlsx"));
然后我们需要一个获取对象属性的方法:private static String getObjectField(Object obj, String fieldKey)这个方法的主体我放在最后
我们的思路是:每次我们获取最后一行的模板数据,并将改行copy到新的一行,然后将之前的一行数据替换成我们想要的数据,不断循环,直到将列表中的数据全部替换

public static void putRowDataToSimpleExcel(XSSFWorkbook workbook, List<Object> objects, boolean replaceNull) {
    //Sheet表示excel中的一个工作表,从最低侧我们可以新建多个工作表
    XSSFSheet sheet = workbook.getSheetAt(0);
    //循环List数据集合
    for (int i = 0; i < objects.size(); i++) {
        Object object = objects.get(i);
        //Row表示excel中的一行数据,这句话的含义是获取最后一行excel(有数据的)
        XSSFRow modelRow = sheet.getRow(sheet.getLastRowNum());
        //创建一个新的行
        XSSFRow newRow = sheet.createRow(sheet.getLastRowNum() + 1);
        //复制模板行到新的行
        newRow.copyRowFrom(modelRow, new CellCopyPolicy());
        for (Cell cell : modelRow) {//遍历单元格Cell表示单元格
            //获取单元格的值
            String value = cell.getStringCellValue();
            //判断是否以#开头#结尾
            if (value.startsWith("#") && value.endsWith("#")) {
                //RULE_INDEX为自定一个的一个常量值为"#index#"
                if (RULE_INDEX.equals(value)) {
                    //赋值到单元格中
                    cell.setCellValue(i);
                }
                //判断是否为%XXXX%的形式,%开头%结尾
            } else if (value.startsWith("%") && value.endsWith("%")) {
                //截取字符串获取%%中间的内容
                value = value.substring(1, value.length() - 1);
                //replaceNull属性表示如果object中的值为null是否将"”替换到单元格中,如果替换,则显示空白,如果不替换,则显示模板内容
                if (replaceNull || StringUtils.isNoneBlank(value)) {
                    //获取object中的属性值,并赋值到单元格中
                    cell.setCellValue(getObjectField(object, value));
                }
            }
        }
    }
    //删除模板行
    sheet.removeRow(sheet.getRow(sheet.getLastRowNum()));
}

ok,很简单的一个小工具方法,这样我们就可以按照excel模板,生成导出数据了。

这里我给大家提供一个复杂一些,功能强大一些的函数

功能方面和上面提供的完全一样,只是该函数通过正则,可以给模板填一些元素,,,,比如序号可以表示为“第#index#个” ,这样需要就可以变成 “第1个”,“第2个”,“第3个”这样的形式,,,同样可以将多个模板字段写到同一个单元格中如“我是%name%,电话:%tell%”这样的格式

  /**
     * excel特点:最后一行为填充模板数据
     * #index#为填充序号,从1开始
     * %XXXX%为 会自动从Object中查找字段名为XXXX的属性
     * 只要符合规则的数据就会替换
     *
     * @param workbook
     * @param objects
     * @param replaceNull :true 则将找不到的属性替换为空白,false 则保留模板信息
     */
    public static void putRowDataToExcel(XSSFWorkbook workbook, List<Object> objects, boolean replaceNull) {
        XSSFSheet sheet = workbook.getSheetAt(0);
        for (int i = 0; i < objects.size(); i++) {
            Object object = objects.get(i);
            XSSFRow modelRow = sheet.getRow(sheet.getLastRowNum());
            XSSFRow newRow = sheet.createRow(sheet.getLastRowNum() + 1);
            newRow.copyRowFrom(modelRow, new CellCopyPolicy());
            for (Cell cell : modelRow) {
                String value = cell.getStringCellValue();
                System.out.println(value);
                System.out.println(value.matches("^.*?#\\w*?#.*?$"));
                if (value.matches("^.*?#\\w*?#.*?$")) {
                    value = value.replace(RULE_INDEX, String.valueOf(i));
                    cell.setCellValue(value);
                }
                if (value.matches("^.*?%\\w*?%.*?$")) {
                    Pattern p = Pattern.compile("(%\\w*?%)");
                    Matcher matcher = p.matcher(value);
                    while (matcher.find()) {
                        String group = matcher.group();
                        String data = getObjectField(object, group.substring(1, group.length() - 1));
                        if (replaceNull || StringUtils.isNoneBlank(value)) {
                            value = value.replace(group, data);
                        }
                    }
                    cell.setCellValue(value);
                }
            }
        }
        sheet.removeRow(sheet.getRow(sheet.getLastRowNum()));
    }
获取对象中的字段值
private static String getObjectField(Object obj, String fieldKey) {
    try {
        PropertyDescriptor property = new PropertyDescriptor(fieldKey, obj.getClass());
        Method readMethod = property.getReadMethod();
        return readMethod.invoke(obj).toString();
    } catch (IntrospectionException e) {
        System.err.println("属性没有找到:" + e.getMessage());
    } catch (Exception e) {
    }
    return "";
}
存储excel

ps:这些都很简单,就不写注释了

public static void outputExcel(Workbook workbook) {
    try {
        File dir = new File(System.getProperty("java.io.tmpdir"));
        dir.mkdirs();
        String endName = ".xls";
        if (workbook instanceof XSSFWorkbook) {
            endName = ".xlsx";
        }
        File file = new File(dir.getAbsolutePath() + "/" + DateUUID.getUUID() + endName);
        System.out.println(file.getAbsoluteFile());
        OutputStream out = new FileOutputStream(file);
        workbook.write(out);
        out.flush();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
测试方法
    @Test
    public void readExcel() throws IOException {
        XSSFWorkbook workbook = new XSSFWorkbook(new FileInputStream("O:\\file\\数据模板.xlsx"));
        List<Object> objects = new ArrayList<Object>();
        objects.add(getModel());
        objects.add(getModel());
        objects.add(getModel());
        objects.add(getModel());
        objects.add(getModel());
        objects.add(getModel());
        objects.add(getModel());
        objects.add(getModel());

        putRowDataToExcel(workbook, objects,true);
        outputExcel(workbook);
    }
Model:
public class Model {
    private String gardenId;

    private String accountName;

    private String accountId;

    private String userType;

    private String displayName;

    private String jobId;

    private String identityCard;

    private String gardenName;

    private Integer gender;

    private String cellphone;

    private String pinyin;

    private String description;

    private String imgUrl;

    private Date createTime;

    //使用状态
    private String froznType;

    private Date lastUpdateTime;

    private String department;
}
生成Model:
    public Model getModel() {
        Model model = new Model();
        model.setAccountId("412");
        model.setDisplayName("韦慧斌");
        model.setAccountName("whb");
        model.setGardenId("522");
        model.setDepartment("司法部-学生处");
        model.setJobId("23212");
        model.setGender(new Random().nextInt());
        model.setLastUpdateTime(new Date());
        model.setUserType("学生");
        model.setIdentityCard("888888888888888888");
        model.setCellphone("11111111111");
        model.setFroznType("冻结");
        return model;
    }
maven:
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.17</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.17</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml-schemas</artifactId>
            <version>3.17</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-scratchpad</artifactId>
            <version>3.17</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-excelant</artifactId>
            <version>3.17</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-examples</artifactId>
            <version>3.17</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-contrib</artifactId>
            <version>3.17</version>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>5.1.0</version>
        </dependency>
        <dependency>
            <groupId>top.whbweb.tool</groupId>
            <artifactId>Tool</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值