照Word模版匯入匯出資料的設計

magic_dreamer發表於2010-06-02
照Word模版匯入匯出資料的設計

word本身不是很會用。呵呵。最近公司需要做一個按照合同模版匯入匯出的功能模組。
想想word本身的內容,全部讀取,可以用POI等等,但是效果也完美。我們其實需要的是整個word文件的特定區域的資料,每次修改也是修改特定區域的資料,所以沒有必要每次拿著一個二進位制檔案.doc傳來傳去,然後server端還要解析。

專案中現成已經引入的dsoframer再加上word本身的“文字型窗體域”,我想可以基本完成這個特定的需求場景了。

1 . 編輯word模版檔案
首先參考word的使用文章如下:
http://www.excelhome.cn/Article/ShowArticle.asp?ArticleID=502

我的word是2007,所以選擇選單“檢視”------滑鼠放在工具欄上右鍵-------“自定義快速訪問工具欄”---------“自定義”裡面找到
窗體域選項“視窗”“控制元件”“舊式工具”這些都加上。
在要加入文字域的地方,點選“舊式窗體”------“文字域”------雙擊開啟“文字型窗體域選項”--------
書籤上填寫我們需要的key,比如userWorkgroup,userName,等等
預設文字上輸入【 部門 】,【 員工 】等預設顯示的值。

2.dsoframer的程式操作
主要是js呼叫dsoframer的操作,首先HTML上要有這個控制元件:
<object classid="clsid:00460182-9E5E-11d5-B7C8-B8269041DD57"
codebase="./components/dsoframer/sccl_dsoframer.cab#version=1,4"
id="oframe"
width="100%"
height="500">
<param name="BorderStyle" value="1">
<param name="TitlebarColor" value="52479">
<param name="TitlebarTextColor" value="0">
<param name="Menubar" value="0">
</object>

第二,我主要完成以下四個步驟的示例,
1.開啟模板word,
2.向word中固定區域寫入資料,
3.在線上開啟的word中對內容進行修改,注意這裡不能將文字編輯區刪除,只能改變裡面的內容。通過dsoframer從word中再得到修改後的內容
4.將dsoframer開啟的,修改後的word檔案,匯出成為一個doc檔案,提示使用者選擇路徑匯出。
以上四個步驟對應的JS操作如下:
function OpenWebDoc(){
//open the document template
oframe.open("./test/template_leave.doc", false);
//set the title of the doc
oframe.Caption ="請u20551 條u27169 版doc";
}

function WriteWord(){
var fields = oframe.ActiveDocument.FormFields;
fields.Item('reason').Result = ' 事u20214 ';
fields.Item('userWorkgroup').Result = ' 研u21457 中u24515 ';
fields.Item('leaveDate').Result = ' 2010-06-02 ';
fields.Item('leaveDay').Result = ' 3 ';
fields.Item('userName').Result = ' Carl ';
}

function SaveWord(){
var postjsondata = '';
var doc = oframe.ActiveDocument;
doc.Save();
var fields = doc.FormFields;
for(var i = fields.count - 1;i >= 0 ; i--){
var item = fields.Item(i+1);
//alert(item.Name + "=" + item.Result);
postjsondata=postjsondata + ",'" + item.Name + "':'" + item.Result + "'";
}
alert("{" + postjsondata + "}");
}

function SaveDocToLocal() {
//save the document to local disk
oframe.showdialog(3);
}

3.關於json和JAVA的轉化
我一直都比較喜歡用json-lib,因為簡單嘛。後來看到了別人說效率比較低。所以後來改為用jackson了。沒有關係。用了個簡單的jsonUtil來處理,以後要改也容易。
用到的包如下:
<!-- json -->
<dependency org="jackson" name="jackson-core-asl" rev="1.4.1" />
<dependency org="jackson" name="jackson-mapper-asl" rev="1.4.1" />
<dependency org="jackson" name="jackson-xc" rev="1.4.1" />
<dependency org="jackson" name="jackson-jaxrs" rev="1.4.1" />

JsonUtil裡面核心如下(沒有仔細看過,勉強能用):
/**
* trans json use jackson-1.4.1
*
* @param item
* @return
*/
public static String getJacksonJsonString(Object item) {
JsonFactory jf = new JsonFactory();
try {
StringWriter sw = new StringWriter();
JsonGenerator gen = jf.createJsonGenerator(sw);
ObjectMapper mapper = new ObjectMapper();
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
mapper.getSerializationConfig().setDateFormat(formatter);
mapper.writeValue(gen, item);
gen.flush();
return sw.toString();
} catch (Exception e) {
logger.error("jackson error: ", e);
return "";
}
}

/**
* trans json string to java object
* @param json
* @param o
* @return
*/
public static Object getObjectfromJacksonJson(String json,Object o){
Object obj = null;
ObjectMapper mapper = new ObjectMapper(); // can reuse, share globally
try {
obj = mapper.readValue(json, o.getClass());
} catch (JsonParseException e) {
e.printStackTrace();
} catch (JsonMappingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return obj;
}

基本上能滿足這個需求了,程式碼都放在easydsoframer裡面,裡面還雜七雜八的放了一些POI,ITEXT,PDFBOX等的測試。

相關文章