客戶有個需求:從word格式文檔中讀項目關鍵信息到數據庫中,如:第一個表格中的聯繫人,項目名之類的信息,word中的格式不是固定的,能夠會有些改動。java
方案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中的高級功能完善的解決了導入數據的格式變化問題。百度谷歌絕對找不到,絕對原創。code