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

QQ登录

只需一步,快速开始

Jun2005

注册会员

20

主题

69

帖子

199

积分

注册会员

积分
199
Jun2005
注册会员   /  发表于:2025-10-29 16:44  /   查看:100  /  回复:8
1金币
本帖最后由 Wilson.Zhang 于 2025-11-3 16:19 编辑


产品:GcExcel
版本:5.2.4
调研编号:GCEXCEL-11844
Last Review:2025-11-03
当前进展:非功能问题,插入区域应避开Table区域。

创建了2个表格。:
IRange newRage = iWorksheet.getRange("A1:F2");
ITable table1 = iWorksheet.getTables().add(newRage, true);
table1.setName("table1");

IRange newRage2 = iWorksheet.getRange("C10:G11");

ITable table2 = iWorksheet.getTables().add(newRage2, true);
table2.setName("table2");


然后再后面操作中编写如下语句:

ITable iTableNEW = iWorksheet.getTables().get("table1");
iTableNEW.getRows().add(1,100);

执行上述代码 会报java.lang.IllegalStateException: Invalid operation.  为什么会这样。


如果我在 创建表格时候  执行 table1.getRows().add(1,100); 就不会报错,但是我通过 iWorksheet.getTables().get("table1"); 获取的表格对象无法进行add行操作


附上代码:

        Workbook workbook = new Workbook();
        IWorksheet iWorksheet = workbook.getWorksheets().get(0);

        IRange newRage3 = iWorksheet.getRange("B3:F4");
        ITable table3 = iWorksheet.getTables().add(newRage3, true);
        table3.setName("table3");

        IRange newRage = iWorksheet.getRange("B20:E23");
        ITable table1 = iWorksheet.getTables().add(newRage, true);
        table1.setName("table1");
//        table1.getRows().add(-1,10);

        IRange newRage2 = iWorksheet.getRange("C16:H17");
        ITable table2 = iWorksheet.getTables().add(newRage2, true);
        table2.setName("table2");



        ITable iTable = iWorksheet.getTables().get("table3");
        iTable.getRows().add(-1,100);
        workbook.save("D:\\test123.xlsx");


8 个回复

Wilson.Zhang
超级版主   /  发表于:2025-10-30 10:14:56
沙发
您好!您的代码片段中两个Table的区域C:F列是交叉的,如果A1:F2这个Table插入行会侵入C10:G11这个Table区域,所以GcExcel、SpreadJS和Microsoft Excel均不支持这种操作,如下图所示分别是SpreadJS和Microsoft Excel中对此非法操作的提醒:

SpreadJS:


Microsoft Excel:


可取代的操作是不针对Table插入行,而是对sheet插入行,如下图所示代码,新插入的sheet行接在A1:F2这个Table后面,对Table区域也做了扩展:
  1. for (int i = 0; i < 20; i++) {
  2.             worksheet.getRange("A2:F2").getEntireRow().insert();
  3.         }
复制代码

插入效果如下图所示:


可以参考官网教程了解对sheet插入/删除行列:
插入/删除行列

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 使用道具 举报
Jun2005
注册会员   /  发表于:2025-10-31 14:41:46
板凳
Wilson.Zhang 发表于 2025-10-30 10:14
您好!您的代码片段中两个Table的区域C:F列是交叉的,如果A1:F2这个Table插入行会侵入C10:G11这个Table区域 ...

这种情况有个弊端。要是右侧也有表格,sheet插入的时候 右侧那个表格会多一行空白的
回复 使用道具 举报
Wilson.Zhang
超级版主   /  发表于:2025-10-31 17:23:17
地板
Jun2005 发表于 2025-10-31 14:41
这种情况有个弊端。要是右侧也有表格,sheet插入的时候 右侧那个表格会多一行空白的

听起来您的sheet中Table较多,而且布局也不太固定,可能存在扩展区域后交叉的情况。

可以对Table调整大小,对应的API是Table:resize(),这是在既有的sheet行列内扩展区域,也会出现扩展区域后不同Table交叉的情况。

虽然上述方式都能从不同角度扩展Table的区域,但是对您的场景而言容易出现Table错位或者交叉的情况。建议您在使用Table时确定好区域范围,这样的话分散开的各个Table就不会交叉了。
回复 使用道具 举报
Jun2005
注册会员   /  发表于:2025-10-31 17:32:32
5#
Wilson.Zhang 发表于 2025-10-31 17:23
听起来您的sheet中Table较多,而且布局也不太固定,可能存在扩展区域后交叉的情况。

可以对Table调整 ...

Workbook workbook = new Workbook();
        IWorksheet iWorksheet = workbook.getWorksheets().get(0);

        IRange newRage2 = iWorksheet.getRange("B3:G3");
        ITable table1 = iWorksheet.getTables().add(newRage2, true);
        table1.setName("table1");

        IRange newRage = iWorksheet.getRange("I3:k3");
        ITable table2 = iWorksheet.getTables().add(newRage, true);
        table2.setName("table2");

        IRange newRage3 = iWorksheet.getRange("B9:F9");
        ITable table3 = iWorksheet.getTables().add(newRage3, true);
        table3.setName("table3");

        ITable iTable = iWorksheet.getTables().get("table1");
        iTable.convertToRange();
        iWorksheet.getRange("4:20").insert();
        workbook.save("D:\\test123.xlsx");

我这部分代码已经对table1做了转区域,为什么还不能在sheet页签插入行
回复 使用道具 举报
Wilson.Zhang
超级版主   /  发表于:2025-10-31 17:45:00
6#
Jun2005 发表于 2025-10-31 17:32
Workbook workbook = new Workbook();
        IWorksheet iWorksheet = workbook.getWorksheets().get ...

B9:F9的table3就在4~20行之间,我深入调研下这个原因。

另外给您提供一个解决方案,循环调用如下代码在table1区域下方插入多行:
  1. iWorksheet.getRange("4:4").insert();
复制代码
回复 使用道具 举报
Jun2005
注册会员   /  发表于:2025-10-31 17:59:10
7#
本帖最后由 Jun2005 于 2025-10-31 18:22 编辑
Wilson.Zhang 发表于 2025-10-31 17:45
B9:F9的table3就在4~20行之间,我深入调研下这个原因。

另外给您提供一个解决方案,循环调用如下代码 ...

确实只能循环插入 不能这样写 iWorksheet.getRange("4:100").insert();、

现在有个问题。并列表时候就会有异常,第二个表渲染的时候会出问题。

有无spreadjs前端那种方法 渲染表格不需要插入行。通过数据绑定可以直接渲染出表格??
回复 使用道具 举报
Wilson.Zhang
超级版主   /  发表于:2025-11-3 09:29:52
8#
Jun2005 发表于 2025-10-31 17:59
确实只能循环插入 不能这样写 iWorksheet.getRange("4:100").insert();、

现在有个问题。并列表时候就 ...

请问下您的实际需求是怎样的?是否如下:有模板文件中布局了多个Table,Table范围如您的代码所示可能会存在交叉,由于数据量不确定,未能在模板中设置每个Table的具体行数,而获取数据后需要将数据填充到对应的Table中。

如果如上所述,那么GcExcel的Table数据绑定可以满足,请您参考官网教程了解详情。

另外,正在帮您调研您的代码产生的现象,调研编号为GCEXCEL-11844,待有结论向您同步,请耐心等候。
回复 使用道具 举报
Wilson.Zhang
超级版主   /  发表于:2025-11-3 16:17:32
9#
本帖最后由 Wilson.Zhang 于 2025-11-3 16:32 编辑

您好!这个问题和convertToRange无关,如下图所示,第4行是Table区域:


将插入区域修改为5:20,如下代码所示:
  1. worksheet.getRange("5:20").insert();
复制代码

可以成功插入,插入效果如下图所示:



或者将其中所有Table转为Range,这样不修改代码也可以成功插入行,如下图所示:



如果是在前端SpreadJS对Table设置了绑定路径,在GcExcel中对Table设置setExpandBoundRows()为true即可允许Table根据数据量扩展行。
您可以参考产品文档了解详情:
数据绑定

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部