样例 - 单据体引入excel数据原创
金蝶云社区-丨Nick丨
丨Nick丨
11人赞赏了该文章 2,251次浏览 未经作者许可,禁止转载编辑于2022年03月07日 14:38:50
summary-icon摘要由AI智能服务提供

本文档描述了一个在特定开发环境下(4.0及以上版本)实现的功能,即将Excel文件(.xlsx格式)中的数据通过上传并解析后,引入到系统页面的单据体中。功能实现过程包括配置引出单据体数据、上传Excel文件、Java后端解析Excel文件数据、将解析的数据回传至父页面并渲染显示。实现过程中涉及到了附件上传监听、Excel文件解析、页面间数据传递与展示等关键步骤,并提供了部分Java代码示例。文档还提醒了文件流解析的复杂性,建议处理基础数据类型,并提供了参考资料链接。

关键词:单据体、引入引出、execl、xlsx(.xlsx)、附件

一、需求

在页面点击按钮将引出的单据体数据引入到当前页面单据体

二、思路与方案

1、引出数据比较简单,配置即可实现

2、利用附件面板将引出的excel上传

3、java解析xlsx数据

4、回传数据到父页面

5、渲染数据

三、实现过程

1、新建单据

image.png

2、配置引出单据体数据的操作

image.png

3、维护数据导出即可

image.pngimage.png

4、在需要引入数据的位置绘制按钮和渲染需要的单据体,我这里利用的是点击弹窗,上传数据

因此需要多一个表单

父页面:

image.png

子页面:

image.png

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("引入成功");
	}

四、效果图

引出数据:

image.png

打开弹窗:

image.png

上传数据:

image.png

点击确定返回数据:

image.png

五、开发环境版本

4.0及以上


六、注意事项

注册监听

文件流的解析比较复杂,注意其他复杂数据类型的使用,建议处理基础类型即可

七、参考资料

https://vip.kingdee.com/article/184984394732327424

https://blog.csdn.net/gxx_csdn/article/details/79085713

元数据与源代码已上传附件

赞 11