请选择 进入手机版 | 继续访问电脑版
 找回密码
 立即注册

QQ登录

只需一步,快速开始

Aria

中级会员

86

主题

236

帖子

682

积分

中级会员

积分
682
Aria
中级会员   /  发表于:2025-3-10 14:14  /   查看:200  /  回复:13
本帖最后由 Joestar.Xu 于 2025-3-11 09:41 编辑


调研编号:DOCXLS-12047

你好,这个demo的渲染结果result.xlsx,使用前端demo无法打开,一直转圈,

image.png948638915.png

7.0.7-preview版本时还是好的,v7.2.1guandata,v726,v728都不行。

demo如下:
TS-23021_v707.zip (11.34 MB, 下载次数: 9)

13 个回复

倒序浏览
Joestar.XuSpreadJS 开发认证
超级版主   /  发表于:2025-3-11 09:02:13
沙发
您好,您描述的情况我了解了,这边调研一下,后续有进展我会在本贴中回复您。
回复 使用道具 举报
Joestar.XuSpreadJS 开发认证
超级版主   /  发表于:2025-3-11 14:42:59
板凳
本帖最后由 Joestar.Xu 于 2025-3-12 08:54 编辑

您好,经调研,该问题是由于7.1重构后我们采用了更严格的语法解析策略,这个策略会将数据源中的-符号解析为减号。

您可以修改模板中的数据源字段,将其用单引号包裹起来,或者使用下图中的代码来自动解析。

image.png76648558.png

  1. public static void changeResourceName(Workbook workbook, List<String> allResourceNameNeedToChange) {
  2.     for(IWorksheet worksheet : workbook.getWorksheets()) {
  3.         for(String resourceName : allResourceNameNeedToChange) {
  4.             worksheet.getUsedRange().replace(resourceName, "'" + resourceName + "'");
  5.         }
  6.     }
  7. }
复制代码


另外,ITableDataSource的实现类存在问题,column name需要和模板中的字段能够对应起来。

具体请参考:

  1. public class AvroTableDataSource implements ITableDataSource {

  2.     private List<Map<String, Object>> dataTable ;
  3.     private List<String> columnNames;
  4.     private HashMap<String, Integer> columnIndex;

  5.     public AvroTableDataSource(String json) {
  6.         List<JSONObject> array = JSONObject.parseArray(json, JSONObject.class);
  7.         this.dataTable = new ArrayList<>(array.size());
  8.         for (JSONObject jsonObject : array) {
  9.             Map<String, Object> map = new HashMap<>();
  10.             for (Map.Entry<String, Object> entry : jsonObject.entrySet()) {
  11.                 map.put(entry.getKey(), entry.getValue());
  12.             }
  13.             this.dataTable.add(map);
  14.         }
  15.         this.columnNames = new ArrayList<>();
  16.         this.columnIndex = new HashMap<>();
  17.         if (!dataTable.isEmpty()) {
  18.             for (Map.Entry<String, Object> entry : dataTable.get(0).entrySet()) {
  19.                 columnNames.add(entry.getKey());
  20.                 columnIndex.put(entry.getKey(), columnNames.size() - 1);
  21.             }
  22.         }
  23.     }

  24.     @Override
  25.     public Object getValue(int i, int j) {
  26.         return dataTable.get(i).get(getColumnName(j));
  27.     }

  28.     @Override
  29.     public int getRowCount() {
  30.         return dataTable.size();
  31.     }

  32.     @Override
  33.     public int getColumnCount() {
  34.         if (dataTable.isEmpty()) {
  35.             return 0;
  36.         }
  37.         return dataTable.get(0).keySet().size();
  38.     }

  39.     @Override
  40.     public String getColumnName(int i) {
  41.         return columnNames.get(i);
  42.     }

  43.     @Override
  44.     public int getColumnIndex(String s) {
  45.         return columnIndex.get(s);
  46.     }
  47. }
复制代码
回复 使用道具 举报
Aria
中级会员   /  发表于:2025-3-11 17:45:05
地板
收到,我们研究一下。

再帮分析下,除了中划线,下划线是否也会导致类似的情况发生。

因为我们有个功能,可以在渲染前模版和数据都改成ds_0.c0、ds_0.c1、ds_1.c0...这种形式,也就是模版中没有中划线的,有且仅有的符号是下划线,仍会转圈。
回复 使用道具 举报
Joestar.XuSpreadJS 开发认证
超级版主   /  发表于:2025-3-11 17:48:09
5#
导入到SpreadJS耗时长的问题我这边在V18中也测了一下,可以正常导入,V17会出现图表相关的报错,猜测是一个旧版本的Bug,已经在新版中修复。
回复 使用道具 举报
Aria
中级会员   /  发表于:2025-3-11 17:54:18
6#
嗯嗯 我的核心问题是SpreadJS耗时长的问题。所以再确认一下,回复中changeResourceName加双引号的方案,是解决渲染结果不对的问题?还是解决渲染结果导入到SpreadJS(V17耗时)耗时长的问题?

还是说单独升级SpreadJS V18也能解决耗时长问题?
回复 使用道具 举报
Joestar.XuSpreadJS 开发认证
超级版主   /  发表于:2025-3-12 08:55:08
7#
您好,

changeResourceName加单引号解决的是渲染结果不正确的问题。

单独升级SpreadJS V18也能解决导入时报错的问题。
回复 使用道具 举报
Aria
中级会员   /  发表于:2025-3-12 09:43:18
8#
好的,了解了,多谢
回复 使用道具 举报
Joestar.XuSpreadJS 开发认证
超级版主   /  发表于:2025-3-12 10:08:12
9#
回复 使用道具 举报
Aria
中级会员   /  发表于:2025-3-12 11:44:26
10#
这个问题需要再进一步确认一下,使用gcexcel 707的渲染结果导入Spreadjs没问题,使用gcexcel新版渲染结果导入Spreadjs有问题,为什么是Spread旧版bug呢?
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部