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

QQ登录

只需一步,快速开始

鱼跃此时海

注册会员

4

主题

5

帖子

21

积分

注册会员

积分
21
  • 51

    金币

  • 4

    主题

  • 5

    帖子

鱼跃此时海
注册会员   /  发表于:2025-4-15 14:01  /   查看:103  /  回复:5
存在数据量非常大场景,如代码示例和附件为1W条 实际场景可能超千万,数据按批给过来,可能为1000条一个批次,且需要结果按照条数进行分文件生成

最终效果如附件,简化模板如附件,数据按1000条进行批次提供,最终生成结果文件

import com.alibaba.fastjson.JSONObject;
import com.grapecity.documents.excel.*;


import java.io.*;
import java.util.*;

public class gcexcelSplit {

    static class DataSourceData{
        CustInfo custInfo;
        Manager manager;
        Linker linker;
        List<Bu> bu;
        String buFeeAmtTotal = "1000";
        String buRebateAmtTotal ="0";
        String buShouldPayAmountTota="1000";
        List<ExpressWaybill> expressWaybill;
        List<JSONObject> expressFastWaybill;
        SumInfo sumInfo;

    }

    static class ExpressWaybill{
        String orderNo = "SF001";
        String itemNo ;

        public String getItemNo() {
            return itemNo;
        }

        public void setItemNo(String itemNo) {
            this.itemNo = itemNo;
        }
    }


    static class SumInfo{
        String expressWaybillFeeAmtTotal = "1000";
        String expressWaybillRebateAmtTotal ="0";
        String expressWaybillShouldPayAmountTotal= "1000";
        String expressFastWaybillFeeAmtTotal= "1000";
        String expressFastWaybillRebateAmtTotal="0";
        String expressFastWaybillShouldPayAmountTotal= "1000";

    }

    static class Manager{
        String name = "XXX";
        String mobile = "qwe";
    }

    static class Linker{
        String name = "XXX";
        String mobile = "qwe";
        String email = "asda";
    }


    static class CustInfo{
        String custName ="xxx";
        String custCode = "9700";
        String period = "202504";
        String total = "1000";
        String shouldPayAmount = "1000";
        String sfCompanyName = "XXX";
        String sfBankName = "YYY";
        String sfBankAccount = "ZZZ9900";
    }

    static class Bu{
        String name;
        String feeAmt;
        String rebateAmt;
        String shouldPayAmount;

        public Bu(String name, String feeAmt, String rebateAmt, String shouldPayAmount) {
            this.name = name;
            this.feeAmt = feeAmt;
            this.rebateAmt = rebateAmt;
            this.shouldPayAmount = shouldPayAmount;
        }
    }


    public static void main(String[] args) throws IOException {

        System.out.println(System.currentTimeMillis());

        Workbook workbook2 = new Workbook();
        workbook2.open("E:\\template.xlsx");
        DataSourceData ds = new DataSourceData();
        ds.sumInfo = new SumInfo();
        ds.linker = new Linker();
        ds.manager = new Manager();
        ds.custInfo = new CustInfo();
        List<Bu> bus = new ArrayList<>();
        bus.add(new Bu("SF","1000","0","1000"));
        bus.add(new Bu("KY","1000","0","1000"));
        ds.bu = bus;
        List<ExpressWaybill> expressWaybill = new ArrayList<>();

        for(int i=0;i<10000;i++){
            ExpressWaybill data  = new ExpressWaybill();
            data.setItemNo(i+"");
            expressWaybill.add(data);
        }

        ds.expressWaybill = expressWaybill;

        List<JSONObject> expressFastWaybill = new ArrayList<>();
        ds.expressFastWaybill = expressFastWaybill;

        workbook2.addDataSource("ds",ds);
        workbook2.processTemplate();
        workbook2.save("E:\\templateRes2.xlsx");
        System.out.println(System.currentTimeMillis());
    }
}

template.zip

13.06 KB, 阅读权限: 1, 下载次数: 5

templateRes2-1.zip

53.57 KB, 阅读权限: 1, 下载次数: 5

5 个回复

倒序浏览
Ellia.DuanSpreadJS 开发认证
超级版主   /  发表于:2025-4-15 15:19:15
沙发
本帖最后由 Ellia.Duan 于 2025-4-15 17:58 编辑

问题收到,调研后尽快给您结论。DOCXLS-12229
回复 使用道具 举报
Ellia.DuanSpreadJS 开发认证
超级版主   /  发表于:2025-4-15 17:23:11
板凳
本帖最后由 Ellia.Duan 于 2025-4-15 17:25 编辑

第一个文件包括“报告总览” ,第二个sheet table中数据80万行(此demo中8千行)截断,加一个合计。
第二个文件,没有“报告总览”sheet ,生成剩余20万行(此demo中2千行),加一个合计列。 以及继续添加table。直到生成所有的数据渲染。

由于之前了解到的需求和您结果稍微有点差异,我重新调整了下结果页。您再次确认下。 result1.xlsx (251.73 KB, 下载次数: 5)
回复 使用道具 举报
鱼跃此时海
注册会员   /  发表于:2025-4-16 16:12:46
地板
Ellia.Duan 发表于 2025-4-15 17:23
第一个文件包括“报告总览” ,第二个sheet table中数据80万行(此demo中8千行)截断,加一个合计。
第二 ...

不是的   可以理解为文件按照行数拆分  第一个文件是包括表头以及第一行到9999行  第二个文件是10000行到后续的模板以及合计但是不包含表头    合计也是总量的合计  不是单文件的合计
回复 使用道具 举报
Ellia.DuanSpreadJS 开发认证
超级版主   /  发表于:2025-4-17 10:11:07
5#
您好,初步完成了一部分的demo ,见附件:

测试数据是第一个table表18条数据,第二个table表12条数据,按每个工作簿每个sheet仅能存放8条记录为准。结果如下:
image.png174536742.png
接下来为您调研,如何进行res_way16.xlsx和res_fast_way0.xlsx拼接,以及合计的一些工作量。

以及稍微调整了下模板,将table中模板改为List 见下图
image.png156681212.png

Test5.java

6.76 KB, 下载次数: 2

template_bill.xlsx

14.68 KB, 下载次数: 2

回复 使用道具 举报
Ellia.DuanSpreadJS 开发认证
超级版主   /  发表于:2025-4-17 11:31:31
6#
本帖最后由 Ellia.Duan 于 2025-4-17 11:33 编辑

已完成两个table的拼接,以及合计。
image.png118069762.png
具体参考附件。 Test5.java (10.17 KB, 下载次数: 3)
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部