转载:国产麒麟、统信系统在线编辑word并拆分成多个子文件
在实际的开发过程中,有时会遇到希望提取 Word 文档中部分内容保存为子文件的需求,PageOffice 支持提取 Word 文档数据区域中的内容为一个 Word 文件流,在服务器端创建 PageOffice 的 WordReader 命名空间中的 WordDocument 对象并获取到 DataRegion 对象,再调用 DataRegion 对象的 FileBytes 属性就可以得到这个子 Word 文件流。
注意
PageOffice 获取 Word 文档中指定位置的数据,是通过调用 PageOffice 获取数据区域的功能,实现此目的。在 PageOffice 的概念里提到的数据区域,本质上就是书签,但是只有“PO_”开头的书签才叫数据区域。
后端代码
在后端编写代码调用 webOpen 方法以表单提交模式docSubmitForm
打开文件,设置数据区域 SubmitAsFile 属性为 true,并设置接收处理 PageOffice 客户端控件提交数据的服务器端后台方法为:saveData,如果用户在线编辑文档保存时,数据区域中的内容就会被抽取为 Word 文件流,并提交到服务器端后台方法 saveData,保存为子文件即可。
PageOfficeCtrl poCtrl = new PageOfficeCtrl(request);
<span class="hljs-type">WordDocument</span> <span class="hljs-variable">wordDoc</span> <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">WordDocument</span>();
<span class="hljs-comment">//打开数据区域,openDataRegion方法的参数代表Word文档中的书签名称</span>
<span class="hljs-type">DataRegion</span> <span class="hljs-variable">dataRegion1</span> <span class="hljs-operator">=</span> wordDoc.openDataRegion(<span class="hljs-string">"PO_Sub1"</span>);
dataRegion1.setSubmitAsFile(<span class="hljs-literal">true</span>);
<span class="hljs-type">DataRegion</span> <span class="hljs-variable">dataRegion2</span> <span class="hljs-operator">=</span> wordDoc.openDataRegion(<span class="hljs-string">"PO_Sub2"</span>);
dataRegion2.setSubmitAsFile(<span class="hljs-literal">true</span>);
dataRegion2.setEditing(<span class="hljs-literal">true</span>);
<span class="hljs-type">DataRegion</span> <span class="hljs-variable">dataRegion3</span> <span class="hljs-operator">=</span> wordDoc.openDataRegion(<span class="hljs-string">"PO_Sub3"</span>);
dataRegion3.setSubmitAsFile(<span class="hljs-literal">true</span>);
poCtrl.setWriter(wordDoc);<span class="hljs-comment">//此行必须</span>
poCtrl.setSaveDataPage(<span class="hljs-string">"saveData"</span>);
<span class="hljs-comment">//webOpen的第一个参数支持能够输出下载文件的Url相对地址或者文件在服务器上的磁盘路径两种方式</span>
poCtrl.webOpen(<span class="hljs-string">"D:\\documents\\test.docx"</span>, OpenModeType.docSubmitForm, <span class="hljs-string">"张三"</span>);</code><div class="hljs-button {2}" data-title="复制"></div></pre>
在服务器端后台方法 saveData 中,创建 com.zhuozhengsoft.pageoffice.wordreader 命名空间中的 WordDocument 对象,提取各数据区域中的子文档。
WordDocument doc = new WordDocument(request, response);
byte[] bWord;
<span class="hljs-type">DataRegion</span> <span class="hljs-variable">dr1</span> <span class="hljs-operator">=</span> doc.openDataRegion(<span class="hljs-string">"PO_Sub1"</span>);
bWord = dr1.getFileBytes();
<span class="hljs-type">FileOutputStream</span> <span class="hljs-variable">fos1</span> <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">FileOutputStream</span>(<span class="hljs-string">"D:\\documents\\sub1.doc"</span>);
fos1.write(bWord);
fos1.flush();
fos1.close();
<span class="hljs-type">DataRegion</span> <span class="hljs-variable">dr2</span> <span class="hljs-operator">=</span> doc.openDataRegion(<span class="hljs-string">"PO_Sub2"</span>);
bWord = dr2.getFileBytes();
<span class="hljs-type">FileOutputStream</span> <span class="hljs-variable">fos2</span> <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">FileOutputStream</span>(<span class="hljs-string">"D:\\documents\\sub2.doc"</span>);
fos2.write(bWord);
fos2.flush();
fos2.close();
<span class="hljs-type">DataRegion</span> <span class="hljs-variable">dr3</span> <span class="hljs-operator">=</span> doc.openDataRegion(<span class="hljs-string">"PO_Sub3"</span>);
bWord = dr3.getFileBytes();
<span class="hljs-type">FileOutputStream</span> <span class="hljs-variable">fos3</span> <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">FileOutputStream</span>(<span class="hljs-string">"D:\\documents\\sub3.doc"</span>);
fos3.write(bWord);
fos3.flush();
fos3.close();
doc.close();</code><div class="hljs-button {2}" data-title="复制"></div></pre>
参考文档:提取数据区域为子文件 (Word 拆分) | PageOffice 开发者中心