背景
客戶有個需求:從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中的高級功能完善的解決了導入數據的格式變化問題。百度谷歌絕對找不到,絕對原創。