国产linux系统(银河麒麟,统信uos)使用 PageOffice 国产版在线打开 word文件并提取数据区域中表格

PageOffice 国产版 :支持信创系统,支持银河麒麟 V10 和统信 UOS,支持 X86(intel、兆芯、海光等)、ARM(飞腾、鲲鹏、麒麟等)、龙芯(LoogArch)芯片架构。

查看本示例演示效果
本示例关键代码的编写位置
Vue+Springboot

注意
本文中展示的代码均为关键代码,复制粘贴到您的项目中,按照实际的情况,例如文档路径,用户名等做适当修改即可使用。

在实际的开发过程中,有时会遇到希望提取 Word 文档中表格数据保存到服务器的需求,此时可以使用 PageOffice 提取 Word 文档数据区域中表格数据的功能。在服务器端创建 PageOffice 的 Word 命名空间中的 WordDocumentReader 对象并获取到 DataRegion 对象,再调用 DataRegion 对象的 openTable 方法就可以获得表格对象,进而获取并处理各个单元格的值,比如保存到数据库。

注意
PageOffice 获取 Word 文档中指定位置的数据,是通过调用 PageOffice 获取数据区域的功能,实现此目的。在 PageOffice 的概念里提到的数据区域,本质上就是书签,但是只有“PO_”开头的书签才叫数据区域。

后端代码

在后端编写代码调用 webOpen 方法以表单提交模式 docSubmitForm 打开文件,设置数据区域 Editing 属性为 true,并设置接收处理 PageOffice 客户端控件提交数据的服务器端后台方法为:saveData,用户在线编辑 Word 文档数据区域中表格数据,点保存时,服务器端后台方法 saveData 中就可以通过 DataRegion 对象就可以获取到完整的表格数据。

注意

注意
由于整个数据区域都是可编辑的,数据区域中的表格也是可以编辑的,包括样式、行列等,所以此实现方式对用户的操作有一定的要求,就是让用户不能随便修改表格的结构,行数、列数、合并单元格等操作,否则服务器端获取表格数据的代码就会无法确定每个单元格数据的含义是什么,也就无法做进一步处理。由于整个数据区域都是可编辑的,数据区域中的表格也是可以编辑的,包括样式、行列等,所以此实现方式对用户的操作有一定的要求,就是让用户不能随便修改表格的结构,行数、列数、合并单元格等操作,否则服务器端获取表格数据的代码就会无法确定每个单元格数据的含义是什么,也就无法做进一步处理。

    PageOfficeCtrl poCtrl = new PageOfficeCtrl(request);
<span class="hljs-type">WordDocumentWriter</span> <span class="hljs-variable">wordDoc</span> <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">WordDocumentWriter</span>();
<span class="hljs-comment">//打开数据区域</span>
<span class="hljs-type">DataRegionWriter</span> <span class="hljs-variable">dTable</span> <span class="hljs-operator">=</span> wordDoc.openDataRegion(<span class="hljs-string">"PO_table"</span>);
<span class="hljs-comment">//设置数据区域可编辑性</span>
dTable.setEditing(<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>);

在服务器端后台方法 saveData 中,创建 com.zhuozhengsoft.pageoffice.word 命名空间中的 WordDocumentReader 对象,提取数据区域中的图片。

    WordDocumentReader doc = new WordDocumentReader(request, response);
    DataRegionReader dataReg = doc.openDataRegion("PO_table");
    TableReader table = dataReg.openTable(1);
<span class="hljs-comment">//输出提交的table中的数据。以下代码非必须,仅是为了展示后台获取到的数据。</span>
response.setCharacterEncoding(<span class="hljs-string">"UTF-8"</span>);
response.setContentType(<span class="hljs-string">"text/html;charset=UTF-8"</span>);
response.getWriter().<span class="hljs-built_in">print</span>(<span class="hljs-string">"Table Data: &lt;br/&gt;&lt;br/&gt;"</span>);
StringBuilder dataStr = <span class="hljs-built_in">new</span> StringBuilder();
<span class="hljs-keyword">for</span> (<span class="hljs-type">int</span> i = <span class="hljs-number">1</span>; i &lt;= table.getRowsCount(); i++) {
    dataStr.<span class="hljs-built_in">append</span>(<span class="hljs-string">"&lt;div style='width:220px;'&gt;"</span>);
    <span class="hljs-keyword">for</span> (<span class="hljs-type">int</span> j = <span class="hljs-number">1</span>; j &lt;= table.getColumnsCount(); j++) {
        dataStr.<span class="hljs-built_in">append</span>(<span class="hljs-string">"&lt;div style='float:left;width:70px;border:1px solid red;'&gt;"</span> + table.openCellRC(i, j).getValue() + <span class="hljs-string">"&lt;/div&gt;"</span>);
    }
    dataStr.<span class="hljs-built_in">append</span>(<span class="hljs-string">"&lt;/div&gt;"</span>);
}
response.getWriter().<span class="hljs-built_in">print</span>(dataStr.toString());
<span class="hljs-comment">//向客户端显示提交的数据</span>
doc.showPage(<span class="hljs-number">300</span>, <span class="hljs-number">300</span>);<span class="hljs-comment">// 此行代码非必须,仅是为了展示后台获取到的数据。</span>

doc.<span class="hljs-built_in">close</span>();

参考链接:提取数据区域中表格