国产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);
WordDocumentWriter wordDoc = new WordDocumentWriter();
//打开数据区域
DataRegionWriter dTable = wordDoc.openDataRegion("PO_table");
//设置数据区域可编辑性
dTable.setEditing(true);
poCtrl.setWriter(wordDoc);//此行必须
poCtrl.setSaveDataPage("saveData");
//webOpen的第一个参数支持能够输出下载文件的Url相对地址或者文件在服务器上的磁盘路径两种方式
poCtrl.webOpen("D:\\documents\\test.docx", OpenModeType.docSubmitForm, "张三");
在服务器端后台方法saveData中,创建com.zhuozhengsoft.pageoffice.word命名空间中的WordDocumentReader对象,提取数据区域中的图片。
WordDocumentReader doc = new WordDocumentReader(request, response);
DataRegionReader dataReg = doc.openDataRegion("PO_table");
TableReader table = dataReg.openTable(1);
//输出提交的table中的数据。以下代码非必须,仅是为了展示后台获取到的数据。
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
response.getWriter().print("Table Data: <br/><br/>");
StringBuilder dataStr = new StringBuilder();
for (int i = 1; i <= table.getRowsCount(); i++) {
dataStr.append("<div style='width:220px;'>");
for (int j = 1; j <= table.getColumnsCount(); j++) {
dataStr.append("<div style='float:left;width:70px;border:1px solid red;'>" + table.openCellRC(i, j).getValue() + "</div>");
}
dataStr.append("</div>");
}
response.getWriter().print(dataStr.toString());
//向客户端显示提交的数据
doc.showPage(300, 300);// 此行代码非必须,仅是为了展示后台获取到的数据。
doc.close();
参考链接:提取数据区域中表格