根据word模版导入word中用户填写的数据

背景

客户有个需求:从word格式文档中读项目关键信息到数据库中,如:第一个表格中的联系人,项目名之类的信息,word中的格式不是固定的,可以会有些改动。

分析

方案1:读取第一个表格,然后再读取表格中的固定行列。缺点:位置如果改变,代码改动比较大。

方案2:利用word中的域功能,域特点可以隐藏起来,不影响用户的信息录入。域格式为:$电话$。就可以用正则去获取域位置的信息。缺点:必需提供模版让用户下载再填写。

代码


    /**
     * 正则表达式匹配两个指定字符串中间的内容
     * @param soap
     * @return
     */
    public static List<String> getSubUtil(String soap, String rgex){
        List<String> list = new ArrayList<String>();
        Pattern pattern = Pattern.compile(rgex);// 匹配的模式
        Matcher m = pattern.matcher(soap);
        while (m.find()) {
            int i = 1;
            String group = m.group(i);
            int j = group.lastIndexOf('\t');
            if(j>-1){
                group=group.substring(j+1);
            }

            list.add(group);
            i++;
        }
        return list;
    }
    public static String getSubUtilSimple(String soap,String rgex){
        Pattern pattern = Pattern.compile(rgex);// 匹配的模式
        Matcher m = pattern.matcher(soap);
        while(m.find()){
            return m.group(1);
        }
        return "";
    }

    /**
     * 转存到map结构中
     * @param text
     * @return
     */
    public static Map convertKeyToMap(String text){

        String rgex = "\\$(.*?)\\$";
        List<String> subUtil = RgexUtils.getSubUtil(text, rgex);
        Map map=new HashMap();

        for (String s : subUtil) {
            String rgex1 = "\\s(.*?)\\$"+s+"\\$";
            String s1 = RgexUtils.getSubUtil(text, rgex1).get(0);
            map.put(s,s1);
        }

        return map;
    }

效果

总结

本方案利用了word中的高级功能完善的解决了导入数据的格式变化问题。百度谷歌绝对找不到,绝对原创。

posted on 2018-02-22 01:07  wolf12  阅读(796)  评论(1编辑  收藏  举报