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

QQ登录

只需一步,快速开始

miaoyj

注册会员

3

主题

7

帖子

46

积分

注册会员

积分
46
  • 133

    金币

  • 3

    主题

  • 7

    帖子

最新发帖
miaoyj
注册会员   /  发表于:2025-11-21 14:03  /   查看:94  /  回复:4
1金币
本帖最后由 Wilson.Zhang 于 2025-11-26 09:57 编辑

产品:GcExcel
版本:8.2.3
调研编号:GCEXCEL-11855
Last Review:2025-11-26
当前进展:对Table列设置列公式,并对数据源中该字段不设置值,绑定数据源后遍历该列的各单元格访问值。

定义record1.city = "=B3 & C3";
结果输出的文件ExpandBoundRows.xlsx和控制台打印的worksheet.getDataSource():中City是=B3 & C3,并没有执行公式计算
  1. @Data
  2.     @NoArgsConstructor
  3.     static class SalesData {
  4.         private List<SalesRecord> sales;
  5.     }

  6.     @Data
  7.     @NoArgsConstructor
  8.     static class SalesRecord {
  9.         private String area;
  10.         private String city;
  11.         private String category;
  12.         private String name;
  13.         private double revenue;
  14.     }


  15.     public static void main(String[] args) {
  16.         Workbook workbook = new Workbook();
  17.         SalesData datasource = new SalesData();
  18.         datasource.sales = new ArrayList<>();

  19.         SalesRecord record1 = new SalesRecord();
  20.         record1.area = "North America";
  21.         record1.city = "=B3 & C3";
  22.         record1.category = "Consumer Electronics";
  23.         record1.name = "Bose 785593-0050";
  24.         record1.revenue = 92800;
  25.         datasource.sales.add(record1);

  26.         SalesRecord record2 = new SalesRecord();
  27.         record2.area = "North America";
  28.         record2.city = "New York";
  29.         record2.category = "Consumer Electronics";
  30.         record2.name = "Bose 785593-0050";
  31.         record2.revenue = 92800;
  32.         datasource.sales.add(record2);

  33.         SalesRecord record3 = new SalesRecord();
  34.         record3.area = "South America";
  35.         record3.city = "Santiago";
  36.         record3.category = "Consumer Electronics";
  37.         record3.name = "Bose 785593-0050";
  38.         record3.revenue = 19550;
  39.         datasource.sales.add(record3);
  40. //#endregion
  41.         IWorksheet worksheet = workbook.getWorksheets().get(0);
  42. // Add a table
  43.         ITable table = worksheet.getTables().add(worksheet.getRange("B2:F4"), true);

  44. // Set table column data field
  45.         table.getColumns().get(0).setDataField("area");
  46.         table.getColumns().get(1).setDataField("city");
  47.         table.getColumns().get(2).setDataField("category");
  48.         table.getColumns().get(3).setDataField("name");
  49.         table.getColumns().get(4).setDataField("revenue");

  50. // Set ExpandBoundRows to true
  51.         table.setExpandBoundRows(true);

  52. // Binding data to table
  53.         table.setBindingPath("sales");

  54. // Set data source
  55.         worksheet.setDataSource(datasource);

  56. // Save to an excel file
  57.         workbook.calculate();
  58.         workbook.save("ExpandBoundRows.xlsx");

  59.         System.out.println("worksheet.getDataSource(): " + worksheet.getDataSource());
  60.     }
复制代码



最佳答案

查看完整内容

您好!经调研,了解到GcExcel的数据绑定并非双向绑定,即绑定数据源后修改数据源不会将修改后的数据同步至Worksheet中。 对于您需要对city字段设置公式的需求,可以绑定数据源中各数据对象的city不设置具体值,对该字段所在列设置列公式,这样整列均可根据公式执行计算。然而,因为数据源中不包含该字段的显式值,所以Worksheet:getDataSource()返回值中该字段的值是null。可以通过Table访问指定字段City所在列的数据区域,即IT ...

4 个回复

最佳答案
最佳答案
Wilson.Zhang
超级版主   /  发表于:2025-11-21 14:03:12
来自 4#
您好!经调研,了解到GcExcel的数据绑定并非双向绑定,即绑定数据源后修改数据源不会将修改后的数据同步至Worksheet中。

对于您需要对city字段设置公式的需求,可以绑定数据源中各数据对象的city不设置具体值,对该字段所在列设置列公式,这样整列均可根据公式执行计算。然而,因为数据源中不包含该字段的显式值,所以Worksheet:getDataSource()返回值中该字段的值是null。可以通过Table访问指定字段City所在列的数据区域,即ITableColumn:getDataBodyRange(),之后对遍历该区域访问每个单元格中的数据,即city的计算结果,如下代码所示:
  1. IRange range = table.getColumns().get("City").getDataBodyRange();
  2. //  遍历Table City列区域,可以获取到列公式计算结果
  3. for (int i = range.getRow(); i < range.getRow() + range.getRowCount(); i++) {
  4.     System.out.println("formula: " + worksheet.getRange(i, range.getColumn()).getFormula());
  5.     System.out.println("value: " + worksheet.getRange(i, range.getColumn()).getValue());
  6. }
复制代码

请您知悉。
回复 使用道具 举报
Wilson.Zhang
超级版主   /  发表于:2025-11-21 17:39:33
2#
您好!收到反馈,调研后给您同步结论,请耐心等候。
回复 使用道具 举报
Wilson.Zhang
超级版主   /  发表于:2025-11-24 11:22:43
3#
您好!您提供的代码片段中,record.1city = "=B3 & C3",如下图所示,这一句代码为数据对象的city设置的值并非公式,而会被当作字符串处理,无法对其运算:


GcExcel不支持数据绑定公式,您使用了Table数据绑定,可以对Table的某列设置列公式,如下代码所示:
  1. table.getColumns().get("City").getDataBodyRange().setFormula("=[@Category] & [@Area]");
复制代码

这样可以确保数据绑定后Table列公式字段中的数据为公式计算结果,访问单元格getValue()结果也是计算结果。然而,由于数据源中设置了列公式的字段其值为null,所以getDataSource的返回结果中该字段值也是null。
关于这一点,我正在调研,调研编号为GCEXCEL-11855,待有结论向您同步。在此之前,您可以针对指定单元格getValue以访问其中的实际数据。

本帖子中包含更多资源

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

x
回复 使用道具 举报
Wilson.Zhang
超级版主   /  发表于:2025-12-4 12:29:15
5#
您好!由于您较长时间未回复,已向您提供解决方案,那就结贴了。如果遇到新问题,欢迎发新帖交流。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部