xlsx.js 是一个开源且应用广泛的前端类库。读取导入工作簿的办法大致分为三步:

0、泛微E8表单页面中引入 xlsx.core.js 。

1、在泛微E8的表单页面设计器中,增加一个文件上传字段并设置 id(实际是一个 input 元素)。

2、用 js 或库(如 jQuery)监听该文件上传字段的 change 事件,将回调对象 e 的 e.target.files 的值读取为上传的全部文件名(数组)。

3、实例化 xlsx.core.js 中的 FileReader() 对象,并调用 FileReader 对象的 read(单个文件名) 方法进行读取和获取各行的值,将工作簿各行中单元格的值、赋给泛微E8表单页面的对应(明细表)的单元格。

注意:泛微E8的明细表单元格中,如两个明细表中有同名的字段,则前端脚本是无法进行区分的。首先获取目标明细表的最大行数,如需要导入的工作簿超过当前的最大行数,则先(循环)往目标明细表插入一行,再(循环)导入工作簿的对应一行。

另外,导入的单元格如未填入值,读取的内容中将没有这个单元格的属性,直接读取会抛出异常、需要进行捕捉处理。

可以看到 L2 单元格如果没有值,连 L2 这个属性都不会产生。

导入一个含有表头(第0行)的模板的代码大致如下:

/* 1、创建接收导入 excel 文件的元素 */
function createInputFirst(){ //在表单的对应 id 的单元格中,插入接收导入模板的 input 元素//不能直接在表单设计器中新建 附件上传 字段来替代此功能,否则会报错jQuery(".drsj").append("<input type='file' class='excel-file'>");
}/* 2、监听接收导入 excel 文件的元素,并写入对应明细行的单元格 */
function loadExcelThen(){//貌似只能读取xls,读取xlsx的数据读取不了//明细1增加行之前,先清空明细表1的行jQuery('.excel-file').change(function(e) {var files = e.target.files;WfForm.delDetailRow("detail_1", "all");var filename = files[0].name;if (filename.substring(filename.length - 3, filename.length) != 'xls') {alert("只支持xls的文件,不支持xlsx文件,请将xlsx另存为xls文件再上传");return;}var fileReader = new FileReader();// 以二进制方式打开文件fileReader.readAsBinaryString(files[0]);fileReader.onload = function (ev) {try {var data = ev.target.result,workbook = XLSX.read(data, {type: 'binary'}) // 以二进制流方式读取得到整份excel表格对象} catch (e) {alert('文件类型不正确');return;}var cell = '';var flag = "";var mxb = 0;var add = 0;var oTable0index = 0;var add1 = 0;var oTable1index = 0;var lshs1 = new Array();var lshylds1 = new Array();for (var sheet in workbook.Sheets) {//遍历sheetif (workbook.Sheets.hasOwnProperty(sheet)) {lastRow = workbook.Sheets[sheet]['!ref']; // A1:AC2var xx = lastRow.indexOf(":"); //2lastRow = lastRow.substring(lastRow.indexOf(":") + 3, lastRow.length);//找到最后一行,避免遍历过多的空行// lastROw 应为 1,2,3 ...cell = workbook.Sheets[sheet];for (var x = 1; x <= lastRow; x++) {//遍历行数var AfirstSheet;if(flag == ""){try {AfirstSheet = cell['A' + x].v;//每一行的首列} catch (e) {AfirstSheet = "";}if (AfirstSheet == "标准板类型") {//开始遍历flag = 'mx0';continue;}}if (AfirstSheet == "") {//为防止用户表格有几万条空行,首列为空时,退出循环break;}//add 2022-02-22var currentCellVal = "";//end addif (flag == 'mx0' && AfirstSheet != "") {DPTools.DPAddDetailRow(1);//明细表1增加一行oTable0index = getMaxRowIndex(0);try {//add 2022-02-22currentCellVal = cell['A' + x].v;//end addDPSetValue(fieldMap.MX1_BZBLX + oTable0index, cell['A' + x].v);//标准版类型} catch (e) {console.log("导入单元格 A 错误:目标值"+currentCellVal+";异常原因:"+e);}try {//add 2022-02-22currentCellVal = cell['B' + x].v;//end addDPSetValue(fieldMap.MX1_BZBBH + oTable0index, cell['B' + x].v);//标准版编号} catch (e) {console.log("导入单元格 B 错误:目标值"+currentCellVal+";异常原因:"+e);}/* 中间省略 */try {//add 2022-02-22currentCellVal = cell['AC' + x].v;//end addDPSetValue(fieldMap.MX1_GDCPJF + oTable0index, cell['AC' + x].v);//高端产品积分(%):(非经销商为0)} catch (e) {console.log("导入单元格 AC 错误:目标值"+currentCellVal+";异常原因:"+e);}add++;}}break;}}}});
}

xlsx.js 的文档可以参考这个:js-xlsx: Documentation | Openbasejs-xlsx docs, getting started, code examples, API reference and morehttps://openbase.com/js/js-xlsx/documentation

后续有其他的再补充。

(完)

泛微E8使用 xlsx.core.js 导入页面数据相关推荐

  1. 泛微E8编辑出口条件

    编辑流程出口条件的时候,既可以单独设置多个条件.也可以在一个条件中使用 and 或者 or 关键字来实现. 操作入口见上图. 删除某个条件的截图如上.可以直接删除,不必在规则栏逐个操作了. 同样双击已 ...

  2. 泛微E8设置签字后提交流程

    设置 / 放开签字后才可以提交流程,是泛微E8常见的功能之一.具体步骤如下: 1.找到表单设计器,需要设置 / 放开签字后才可以提交流程的流程环节. 2.点击该环节所在行,最右侧的 "... ...

  3. 泛微html模板与表单分离,泛微eteams业务表单,自动生成数据和报表

    原标题:泛微eteams业务表单,自动生成数据和报表 eteams业务表单用数据重新定义协作,台帐记录.数据汇报.外部调研收集一并搞定.彻底告别传统纸笔数据收集方式,实时完成数据提交,自动生成数据和报 ...

  4. 泛微华南牵手深圳前海第三方供应链数据方案有限公司

    近日,泛微成功签约深圳前海第三方供应链数据方案有限公司,通过搭建泛微e-cology协同管理平台,整合企业资源,提高整体办公效率. 深圳前海第三方供应链数据方案有限公司(简称前海第三方供应链公司)成立 ...

  5. 泛微E8自定义查询和第三方页面参数交互

    最近接到一个需求,要做一个整体报表.且在明细行的某个单元格点击时,可以根据当前明细行的多个参数.传递到一个第三方页面并将查询结果展示在第三方页面. 思考了一下.目前泛微支持的表单建模中,配置的跳转链接 ...

  6. 泛微E8设置开发环境

    首先找到 Idea 开发工具的设置: 在 File Types 里面,找忽略的文件夹,是否有 classbean.如有则无法将其添加为泛微的系统库: 然后添加 Resin 目录下的 /lib 目录.项 ...

  7. 泛微E8创建自定义报表

    创建一个带有查询条件的自定义报表,可以选择 "建模引擎" 中的虚拟表单,将一个已有的数据库视图转换为表单. 这里引用的数据库视图必须以 CUS_ 开头,且数据源一般不要选 loca ...

  8. 泛微E8开启允许转发和允许删除

    开启泛微的允许流程转发,需要设置 "流转设置" -"节点信息"中,各节点的 "操作菜单".点击齿轮图标,进行编辑. 点击齿轮图标后,会显示下 ...

  9. 泛微E8流程导入操作

    从原始流程导出导入 workflow.xml 文件后,可以选择[新增 / 修改].[系统一致 / 系统不一致]两个维度来进行导入. 如果选择[新增]的方式导入 workflow.xml,导入的流程将不 ...

  10. 泛微e9隐藏明细表_泛微E8 隐藏行、明细表

    jQuery(document).ready(function() { //绑定值变更事件,支持所有浏览器,请不要使用 onpropertyChange 事件进行绑定. jQuery("#f ...

最新文章

  1. XCode删除多余的Simulator(模拟器)
  2. Linux学习总结(七十)docker-2
  3. 交叉编译ncurses5.6
  4. ModelCoder状态机中的State逻辑
  5. Oracle回退不小心drop掉得表
  6. matlab打开矩阵表,如何将Excel数据导入MATLAB中?:EXCLE中通过矩阵表输出选项
  7. w我的世界pe开服器php7,我的世界手机自主开启PE服务器教程
  8. GridView 72般绝技(一)
  9. 男子因惧内欲退还iPad 2苹果免费赠送
  10. Unity播放序列帧
  11. 西门子MM440变频器调试小记
  12. 实际开发中implement与extend区别
  13. cortex a7 a53_试驾初体验--我与奥迪A7的七天之旅
  14. 论文阅读:(arXiv 2022) MINER: Multiscale Implicit Neural Representations
  15. Error creating bean with name ‘dataSource‘: Error setting property,river for test database type [HSQ
  16. 中国做SaaS为什么这么难?
  17. 35页智慧安防小区管控系统 解决方案
  18. bad transparency mask. 解决办法
  19. Unity鼠标滚轴缩放大小
  20. 计算机英语比赛,传亚运精神,燃英语激情——记计算机学院第八届英语演讲比赛初赛...

热门文章

  1. Fluentd日志采集使用教程
  2. guice android,android – 如何使用Guice的@Singleton?
  3. Hello Guice
  4. 基于C语言开发的教师管理系统
  5. 用Python实现一个简单的微信聊天机器人
  6. Docker下载redis镜像
  7. 考CFA证书只通过一级有用吗?
  8. 最简单音乐播放器,还有歌词
  9. office2007中把文件转换成pdf格式的问题
  10. MC下载Forge/Optifine不想有广告怎么办