照Word模版导入导出数据的设计

照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等的测试。

你可能感兴趣的:(json,asp)