本文档描述了一个在特定开发环境下(4.0及以上版本)实现的功能,即将Excel文件(.xlsx格式)中的数据通过上传并解析后,引入到系统页面的单据体中。功能实现过程包括配置引出单据体数据、上传Excel文件、Java后端解析Excel文件数据、将解析的数据回传至父页面并渲染显示。实现过程中涉及到了附件上传监听、Excel文件解析、页面间数据传递与展示等关键步骤,并提供了部分Java代码示例。文档还提醒了文件流解析的复杂性,建议处理基础数据类型,并提供了参考资料链接。
关键词:单据体、引入引出、execl、xlsx(.xlsx)、附件
一、需求
在页面点击按钮将引出的单据体数据引入到当前页面单据体
二、思路与方案
1、引出数据比较简单,配置即可实现
2、利用附件面板将引出的excel上传
3、java解析xlsx数据
4、回传数据到父页面
5、渲染数据
三、实现过程
1、新建单据
2、配置引出单据体数据的操作
3、维护数据导出即可
4、在需要引入数据的位置绘制按钮和渲染需要的单据体,我这里利用的是点击弹窗,上传数据
因此需要多一个表单
父页面:
子页面:
5、页面绘制完成后实现解析数据,并写入页面缓存
(这里就不多讲弹窗,携带数据返回等操作了,都有对应资料学习)
代码如下:
public class AttImportPlugin extends AbstractFormPlugin implements UploadListener { @Override public void registerListener(EventObject e) { super.registerListener(e); AttachmentPanel panel = this.getControl("kdec_attachmentpanelap"); panel.addUploadListener(this);// 监听附件面板上传 this.addClickListeners("btnok"); } @Override public void afterUpload(UploadEvent evt) { UploadListener.super.afterUpload(evt); Map<String, Object> map = (Map<String, Object>) evt.getUrls()[0];// 上传完成后解析数据流 showExcel(map);// 解析excel } @SuppressWarnings("resource") public void showExcel(Map<String, Object> map) { // 读Excel文件内容 try { TempFileCache tempFileCache = CacheFactory.getCommonCacheFactory().getTempFileCache(); InputStream inStream = null; inStream = tempFileCache.getInputStream(map.get("url").toString());// 获取流 Workbook wb; wb = new XSSFWorkbook(inStream);// 转化文件流,这里用的方法是解析xlsx后缀的 // 开始解析 Sheet sheet = wb.getSheetAt(0); // 读取sheet 0 int firstRowIndex = sheet.getFirstRowNum() + 1; // 第一行是列名,所以不读 int lastRowIndex = sheet.getLastRowNum(); System.out.println("firstRowIndex: " + firstRowIndex); System.out.println("lastRowIndex: " + lastRowIndex); List<String> values = new ArrayList<>(); for (int rIndex = firstRowIndex; rIndex <= lastRowIndex; rIndex++) { // 遍历行 System.out.println("rIndex: " + rIndex); Row row = sheet.getRow(rIndex); if (row != null) { int firstCellIndex = row.getFirstCellNum(); int lastCellIndex = row.getLastCellNum(); for (int cIndex = firstCellIndex; cIndex < lastCellIndex; cIndex++) { // 遍历列 Cell cell = row.getCell(cIndex); if (cell != null) { values.add(cell.toString()); System.out.println(cell.toString()); } } } } JSONObject jsonObject = new JSONObject(); jsonObject.put("values", values); this.getPageCache().put("values", jsonObject.toString());//转化为jsonobj便于解析 } catch (IOException e) { System.out.println(e.getMessage()); e.printStackTrace(); } catch (KDException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } }
6、点击确定后返回数据
@Override public void click(EventObject evt) { super.click(evt); this.getView().returnDataToParent(this.getPageCache().get("values")); this.getView().close(); }
7、父页面解析数据展示即可
@Override public void closedCallBack(ClosedCallBackEvent evt) { super.closedCallBack(evt); if (evt.getActionId().equals("input")) { JSONObject re = JSONObject.fromObject(evt.getReturnData()); if (null!=re&&re.getJSONArray("values").size()>0) { JSONArray data = re.getJSONArray("values"); this.getModel().batchCreateNewEntryRow("kdec_entryentity", data.size()); for (int i = 0; i < data.size(); i++) { this.getModel().setValue("kdec_textfield", data.get(i),i); } } } this.getView().showSuccessNotification("引入成功"); }
四、效果图
引出数据:
打开弹窗:
上传数据:
点击确定返回数据:
五、开发环境版本
4.0及以上
六、注意事项
注册监听
文件流的解析比较复杂,注意其他复杂数据类型的使用,建议处理基础类型即可
七、参考资料
https://vip.kingdee.com/article/184984394732327424
https://blog.csdn.net/gxx_csdn/article/details/79085713
元数据与源代码已上传附件
kdec_case-kdec_entry-202203071 …(10.58KB)
推荐阅读