Wilson.Zhang 发表于 2024-10-31 18:16:04

如何避免 GcExcel 在处理 SpreadJS 自定义单元格类型数据导出时的缺失问题

本帖最后由 Wilson.Zhang 于 2024-11-20 16:06 编辑

在填充自然语言文本的基础上,SpreadJS扩展了单元格类型,既视感即纳入了HTML中的表单输入元素,如单选框、复选框等。然而,Excel并不支持这类单元格类型,好吧,那这些单元格类型就变成了SpreadJS的特产。从SpreadJS产品的应用环境而言,通过浏览器访问SpreadJS页面中的大部分元素都是DOM元素,似乎在其中使用表单元素也很合理。而且,这些自定义单元格类型在数据填报方面可以增强人机交互体验。在导出为Excel文件时,Excel无法复原这些单元格类型的样式,但是可以记录单元格中填充的值,这些值以字符串形式存在。由于对数据的处理方式不同,GcExcel未能同步保留这些数据,而是以数组数据类型保存通过单元格类型填充在单元格中的数据。这便导致GcExcel导出的Excel文件中将会缺失设置了单元格类型的单元格中填充的数据。那么,可否规避这样的问题呢?分析下先。

以复选框列表(CheckBoxListCellType)为例,SpreadJS保存勾选值为字符串,如“1,2,3,4”,如图1所示。


图1. SpreadJS保存复选框列表勾选值
而GcExcel保存值为,导出的Excel文件中无法保留,如图2所示。


图2. GcExcel导出Excel文件未保留勾选数据
既然如此,可以抽取GcExcel数组中的元素,并以西文逗号为分隔符将元素拼接为字符串,之后再将字符串回填至单元格,便可与SpreadJS保持一致的保存方式。如此,对于一个包含了复选框列表单元格类型的ssjson文件,GcExcel和SpreadJS读取后导出的Excel文件中均可显示单元格中保存的勾选值,即便无法显示勾选框的外形,但是被勾选的内容作为有效数据得以保存,如图3所示。


图3. GcExcel重设勾选数据后导出Excel可见
如下代码所示:

IWorksheet w2 = wb.getWorksheets().get("sheet名称");
//设置了CheckBoxListCellType的单元格
Object C2 = w2.getRange("C2").getValue();
StringBuilder sb = new StringBuilder();
if (C2.getClass().isArray()) {
    //转换单元格中存储的数组值为字符串
    for (int i = 0; i < Array.getLength(C2); i++) {
      sb.append(Array.get(C2, i));
      if (i < Array.getLength(C2) -1) {
            sb.append(",");
      }
    }
}
//将转换后的字符串回填至单元格
w2.getRange("C2").setValue(sb.toString());
页: [1]
查看完整版本: 如何避免 GcExcel 在处理 SpreadJS 自定义单元格类型数据导出时的缺失问题