1.需求
java 实现不同用户编辑 word 文档的不同区域(https://my.oschina.net/u/3507515/blog/2413926)
这篇文章主要介绍了不同的用户编辑不同的区域.但是如果多个用户同时编辑保存文档文档的时候就会出现相互覆盖的问题, 所以 pageoffice 提供了不同用户同时编辑word 文档不同区域的方法
2:核心思想以及代码
思想: 保存的时候拆分成子文件保存(数据区域的内容作为文件提交)
代码:
d1.setSubmitAsFile(true);
d2.setSubmitAsFile(true);
3:具体的实现代码
因为保存的时候是作为子文件保存的.所以打开的时候需要把子文件填充到word 模板中,然后在进行编辑保存
String userName = request.getParameter("userName");
//***************************卓正PageOffice组件的使用********************************
WordDocument doc = new WordDocument();
//打开数据区域
DataRegion d1 = doc.openDataRegion("PO_com1");
DataRegion d2 = doc.openDataRegion("PO_com2");
//给数据区域赋值
d1.setValue("[word]doc/content1.doc[/word]");
d2.setValue("[word]doc/content2.doc[/word]");
//若要将数据区域内容存入文件中,则必须设置属性“setSubmitAsFile”值为true
d1.setSubmitAsFile(true);
d2.setSubmitAsFile(true);
//根据登录用户名设置数据区域可编辑性
//甲客户:zhangsan登录后
if (userName.equals("zhangsan")) {
d1.setEditing(true);
d2.setEditing(false);
}
//乙客户:lisi登录后
else {
d2.setEditing(true);
d1.setEditing(false);
}
PageOfficeCtrl poCtrl = new PageOfficeCtrl(request);
poCtrl.setWriter(doc);
//添加自定义按钮
poCtrl.addCustomToolButton("保存", "Save", 1);
poCtrl.addCustomToolButton("全屏/还原", "IsFullScreen", 4);
//设置服务器页面
poCtrl.setServerPage(request.getContextPath()+"/poserver.zz"); //此行必须
//设置保存页
poCtrl.setSaveDataPage("SaveData.jsp?userName=" + userName);
//设置文档打开方式
poCtrl.webOpen("doc/test.doc", OpenModeType.docSubmitForm, userName);
保存的代码
WordDocument doc = new WordDocument(request, response);
byte[] bytes = null;
String filePath = "";
if (request.getParameter("userName") != null && request.getParameter("userName").trim().equalsIgnoreCase("zhangsan")) {
bytes = doc.openDataRegion("PO_com1").getFileBytes();
filePath = "content1.doc";
} else {
bytes = doc.openDataRegion("PO_com2").getFileBytes();
filePath = "content2.doc";
}
doc.close();
filePath = request.getSession().getServletContext().getRealPath("SetDrByUserWord2/doc/") + "/" + filePath;
FileOutputStream outputStream = new FileOutputStream(filePath);
outputStream.write(bytes);
outputStream.flush();
outputStream.close();