积木报表导出数据量太大报错

news2024/11/24 21:10:34

积木报表导出数据量太大报错问题处理

  1. 问题背景
  2. 解决方案
  3. 运行结果
  4. 关键代码

问题背景

积木报表在导出大量数据时可能会遇到报错‌,‌这通常是由于数据量大导致的性能问题或数据处理方式不当引起的。‌以下是一些可能导致报错的原因及相应的解决方法:‌

‌性能问题‌:‌当数据量非常大时,‌积木报表在导出过程中可能会遇到性能瓶颈,‌导致导出过程缓慢甚至失败。‌这可能是因为报表工具本身或其所依赖的库(‌如Apache POI)‌在处理大量数据时的性能不足。‌解决这一问题的方法包括优化SQL查询、‌调整分页大小、‌使用更适合处理大量数据的库(‌如阿里巴巴的EasyExcel)‌进行导出,‌或者采用异步处理的方式来避免接口超时1。‌
‌数据处理方式‌:‌如果待导出的数据包含特殊字符,‌如英文双引号或等号,‌这可能导致JSON反序列化报错。‌这种情况下,‌需要检查业务数据,‌确保数据格式正确,‌避免包含可能导致报错的特殊字符23。‌
‌内存溢出‌:‌如果报表工具或其依赖的库不支持流式(‌分批)‌导出,‌大量数据的处理可能会导致内存溢出。‌解决这一问题的方法包括使用流式导出的方式,‌或者检查报表工具是否支持异步分页呈现和流式(‌分批)‌导出Excel的功能4。‌
综上所述,‌解决积木报表在导出大量数据时报错的问题,‌需要从优化数据处理方式、‌调整导出设置、‌以及确保数据格式正确等方面入手。‌通过这些方法,‌可以有效提高报表导出的稳定性和性能。‌

解决方案

1、在项目中写个拦截器,拦截积木报表导出接口
2、获取到积木报表查询的数据,自己实现导出功能,这里我使用的是阿里的easyExcel导出

实现结果

在这里插入图片描述

关键代码

1、添加拦截器

拦截积木报表导出接口/jmreport/exportAllExcelStream
@Component
@Slf4j
public class ExportExcelInterceptor implements HandlerInterceptor {

    @Autowired
    private ExportUtil exportUtil;


    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String requestURI = request.getRequestURI();
        if (requestURI.endsWith("/jmreport/exportAllExcelStream")) {
            // 在这里执行拦截逻辑,例如验证用户权限、记录日志等
            log.info("Intercepted request: {}" , requestURI);
            exportUtil.exportExcel(request, response, handler);
            return false;
            // 返回true表示继续处理请求,返回false表示中断请求处理
        }
        return true;
        // 对于其他请求,不进行拦截
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        // 请求处理完成后的逻辑,如果需要的话
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // 请求完成后的逻辑,如果需要的话
    }

}

2、注入拦截器

在这里插入代码片

3、实现导出

@Component
@Slf4j
public class ExportUtil {

    @Autowired
    private e jmReportDesignService;
    @Autowired
    private JmReportBaseConfig jmBaseConfig;
    @Autowired
    private JimuReportDbDao jimuReportDbDao;

    @Autowired
    private JimuReportDao reportDao;

    @Autowired
    private IJimuReportService jimuReportService;


    public  void exportExcel(HttpServletRequest request, HttpServletResponse response, final Object handler) throws Exception{
        response.setCharacterEncoding("utf-8");
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.addHeader("Content-Disposition", "attachment;filename=jmexport.xlsx");
        log.info("===========exportAllExcelStream 执行导出EXCEL action ==========");
        HashMap map = new HashMap(request.getParameterMap());
        // 获取请求参数
        StringBuilder body = new StringBuilder();
        String line;
        try (BufferedReader reader = request.getReader()) {
            while ((line = reader.readLine()) != null) {
                body.append(line);
            }
        }
        JSONObject jsonObject = JSONObject.parseObject(body.toString());
        boolean isToken = map.containsKey("token");
        if (isToken) {
            map.remove("token");
        }
        String excelConfigId = jsonObject.getString("excelConfigId");
        JSONObject queryParam = jsonObject.getJSONObject("queryParam");
        Map<String, Object> resMap = this.d(excelConfigId);
        List downCodeList = (List)resMap.get("downCodeList");
        Integer var16 = this.jmBaseConfig.getPageSizeNumber();
        this.getData(response, excelConfigId, queryParam, downCodeList, var16);
    }


    public Map<String, Object> getData(HttpServletResponse response, String var1, JSONObject var2, List<String> var3,  int var5)
            throws IOException {
        HashMap var6 = new HashMap(5);
        log.debug("数据源集合数据::" + var3);
        JSONObject jsonObject = new JSONObject();
        boolean isonly = false;
        if (null != var2) {
            jsonObject = JSON.parseObject(var2.toJSONString());
            jsonObject.put("pageSize", var5);
            isonly = "1".equals(jsonObject.getString("onlyPageData"));
        }
        JimuReport jimuReport = this.reportDao.get(var1);
        String jsonStr = jimuReport.getJsonStr();
        this.jsonStr(jsonObject, jsonStr);
        Map reportData = jimuReportService.getDataById(jimuReport, jsonObject, isonly, var3);
        this.getMapData(jsonStr, reportData);
        jimuReport.setDataList(reportData);
        ReportDbInfo reportDbInfo = (ReportDbInfo)reportData.get("project_info");
        List<Map<String, Object>> list = reportDbInfo.getList();
        JSONObject var11 = JSON.parseObject(jsonStr);
        JSONObject var12 = var11.getJSONObject("rows");
        if (var12.containsKey("-1")) {
            var12.remove("-1");
        }

        if (var12.containsKey("len")) {
            var12.remove("len");
        }
        JSONObject jsonObject1 = var11.getJSONObject("rows").getJSONObject("2").getJSONObject("cells");
        List<Integer> keyList = new ArrayList<>();
        jsonObject1.keySet().forEach(key -> {
            keyList.add(Integer.valueOf(key));
        });
        List<List<String>> headList = new ArrayList<>();
        for (int i = 1; i <= keyList.size(); i++) {
            headList.add(Arrays.asList(jsonObject1.getJSONObject(String.valueOf(i)).getString("text")));
        }
        List<List<Object>> dataList = new ArrayList<>();
        for (Map<String, Object> map : list) {
            List<Object> values = new ArrayList<>();
            map.keySet().forEach(key->{
                values.add(map.get(key));
            });
            dataList.add(values);
        }
        EasyExcel.write(response.getOutputStream()).head(new ArrayList<>())
                .sheet("sheet")
                .doWrite(dataList);
        return var6;
    }

    private void jsonStr(JSONObject var1, String var2) {
        if (var1.containsKey("jmViewFirstLoad") && String.valueOf(1).equals(var1.getString("jmViewFirstLoad"))) {
            JSONObject var3 = JSONObject.parseObject(var2);
            if (var3.containsKey("rpbar")) {
                JSONObject var4 = var3.getJSONObject("rpbar");
                if (var4.containsKey("pageSize")) {
                    Integer var5 = var4.getInteger("pageSize");
                    if (var5 != null && !"".equals(var5)) {
                        var1.put("pageSize", var5);
                    }
                }
            }
        }

    }

    private void getMapData(String var1, Map<String, Object> var2) {
        JSONObject var3 = JSON.parseObject(var1);
        if (var3.containsKey("completeBlankRowList")) {
            JSONArray var4 = var3.getJSONArray("completeBlankRowList");
            if (var4.size() > 0) {
                Iterator var5 = var2.keySet().iterator();

                while(true) {
                    Object var11;
                    int var12;
                    JSONObject var13;
                    Integer var17;
                    int var19;
                    do {
                        Object var18;
                        do {
                            String var6;
                            do {
                                do {
                                    JSONObject var7;
                                    do {
                                        if (!var5.hasNext()) {
                                            return;
                                        }

                                        var6 = (String)var5.next();
                                        var7 = null;

                                        for(int var8 = 0; var8 < var4.size(); ++var8) {
                                            JSONObject var9 = var4.getJSONObject(var8);
                                            if (var9.getString("db").equals(var6)) {
                                                var7 = var9;
                                                break;
                                            }
                                        }
                                    } while(var7 == null);

                                    var17 = var7.getInteger("rows");
                                } while(var17 == null);
                            } while(var17 <= 0);

                            var18 = var2.get(var6);
                        } while(!(var18 instanceof ReportDbInfo));

                        ReportDbInfo var10 = (ReportDbInfo)var18;
                        var11 = var10.getList();
                        var12 = ((List)var11).size();
                        var13 = new JSONObject();
                        if (var11 == null) {
                            var11 = new ArrayList();
                        } else if (var12 != 0) {
                            Map var14 = (Map)((List)var11).get(0);
                            Iterator var15 = var14.keySet().iterator();

                            while(var15.hasNext()) {
                                String var16 = (String)var15.next();
                                var13.put(var16, "");
                            }
                        }

                        var19 = var12 % var17;
                    } while(var19 <= 0 && var12 != 0);

                    for(int var20 = var17 - var19; var20 > 0; --var20) {
                        ((List)var11).add(var13);
                    }
                }
            }
        }

    }

    public void a(List<String> var1, String var2, Map<String, Object> var3) {
        ArrayList var4 = new ArrayList();
        int var5 = 0;
        boolean var6 = false;
        String var7 = "";
        ArrayList var8 = new ArrayList();
        ArrayList var9 = new ArrayList();
        Iterator var10 = var1.iterator();

        while(true) {
            while(var10.hasNext()) {
                String var11 = (String)var10.next();
                JmReportDb var12 = this.jimuReportDbDao.getReportDb(var2, var11);
                if (null == var12) {
                    var1.remove(var11);
                } else {
                    DbModel var13 = new DbModel();
                    var13.setCode(var11);
                    var13.setOrder(var5);
                    if ("1".equals(var12.getIsPage())) {
                        var6 = true;
                        var7 = var11;
                        var13.setPage(true);
                    } else {
                        var13.setPage(false);
                    }

                    if (var6 && !"1".equals(var12.getIsPage())) {
                        var9.add(var11);
                    } else if (!var6 && !"1".equals(var12.getIsPage())) {
                        var8.add(var11);
                    }

                    var4.add(var13);
                    var13 = null;
                    ++var5;
                }
            }

            var3.put("moredbSource", var6);
            var3.put("downCodeList", var9);
            var3.put("upCodeList", var8);
            var3.put("pageCode", var7);
            var3.put("dbList", var4);
            return;
        }
    }



    private Map<String, Object> d(String var1) {
        JimuReport var2 = this.jmReportDesignService.getById(var1);
        List var3 = this.jimuReportDbDao.selectList(var1);
        ArrayList var4 = new ArrayList();
        Iterator var5 = var3.iterator();

        while(var5.hasNext()) {
            JmReportDb var6 = (JmReportDb)var5.next();
            var4.add(var6.getDbCode());
        }

        String var19 = var2.getJsonStr();
        ArrayList var20 = new ArrayList();
        JSONObject var7 = JSONObject.parseObject(var19);
        JSONObject var8 = var7.getJSONObject("rows");
        var8 = this.c(var8);
        Iterator var9 = var8.keySet().iterator();

        label80:
        while(true) {
            String var10;
            int var11;
            do {
                do {
                    do {
                        do {
                            do {
                                if (!var9.hasNext()) {
                                    HashMap var21 = new HashMap(5);
                                    this.a((List)var20, (String)var1, (Map)var21);
                                    return var21;
                                }

                                var10 = (String)var9.next();
                            } while("cells".equals(var10));
                        } while("isDrag".equals(var10));
                    } while("len".equals(var10));
                } while("-1".equals(var10));

                var11 = Integer.parseInt(var10);
            } while(var11 < 0);

            JSONObject var12 = var8.getJSONObject(var10).getJSONObject("cells");
            var12 = this.c(var12);
            Iterator var13 = var12.keySet().iterator();

            while(true) {
                String var14;
                do {
                    if (!var13.hasNext()) {
                        continue label80;
                    }

                    var14 = (String)var13.next();
                } while("-1".equals(var14));

                JSONObject var15 = var12.getJSONObject(var14);
                Object var16 = var15.get("text");
                boolean var17 = g.d(var16) && (var16.toString().contains("#{") || var16.toString().contains("${"));
                if (var17) {
                    String var18 = var16.toString();
                    var18 = var18.replace("${", "").replace("#{", "");
                    if (var18.contains(".")) {
                        var18 = var18.substring(0, var18.indexOf("."));
                    }

                    if (!var20.contains(var18) && var4.contains(var18)) {
                        var20.add(var18);
                    }
                }
            }
        }
    }

    private JSONObject c(JSONObject var1) {
        ArrayList var2 = new ArrayList();
        Collections.sort(var2);
        JSONObject var9 = new JSONObject(true);

        JSONObject var7;
        for(Iterator var5 = var2.iterator(); var5.hasNext(); var7 = null) {
            Integer var6 = (Integer)var5.next();
            var7 = var1.getJSONObject(String.valueOf(var6));
            var9.put(String.valueOf(var6), var7);
        }

        return var9;
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2045489.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis13-多级缓存

目录 概述 JVM进程缓存 Caffeine 实现进程缓存 Lua语法 初识Lua 变量和循环 Lua的数据类型 声明变量 循环 条件控制、函数 函数 条件控制 实现多级缓存 安装OpenResty OpenResty快速入门 请求参数处理 查询Tomcat 发送http请求的API 封装http工具 CJSON工…

传感器灯光与避障系统的详细作用!

传感器灯光 视觉指示&#xff1a;传感器灯光为无人机提供了直观的视觉指示&#xff0c;帮助飞行员或地面操作人员清晰地识别无人机的飞行状态、方向和位置。 通信与警示&#xff1a;通过特定的灯光颜色和闪烁模式&#xff0c;传感器灯光能够传达无人机的特定状态或警告信息&a…

Gato:A Generalist Agent

发表时间&#xff1a;11 Nov 2022 论文链接&#xff1a;https://readpaper.com/pdf-annotate/note?pdfId4689785740490440705&noteId2412686834489472512 作者单位&#xff1a;DeepMind 前言&#xff1a;近日&#xff0c;DeepMind发布了文章《A Generalist Agent》&#…

jenkins配置+vue打包多环境切换

jenkins配置流水线过程 1.新建item 加入相关的参数就行了。 流水线脚本设置 后端脚本 node {stage checkoutsh"""#每次打包清空工作空间目录rm -rf $workspace/*cd $workspace#到工作空间下从远端svn服务端拉取代码svn co svn://10.1.19.21/repo/技术中台/低…

深度学习基础之循环神经网络

目录 基本概念与特点 定义与工作原理 结构组成 应用领域 自然语言处理 语音识别 时间序列分析 优缺点 优点 缺点 改进方法 总结 循环神经网络在自然语言处理中的最新应用和研究进展是什么&#xff1f; 长短期记忆网络&#xff08;LSTM&#xff09;与门控循环单元…

国内首个非遗数字人智能体,AI让传统文化“活”起来

在数字化与智能化时代&#xff0c;文化传承正迎来全新的机遇。河南省非物质文化遗产保护和智慧化中心基于百度文心智能体平台&#xff0c;成功推出了国内首个非遗数字人&#xff08;智能体&#xff09;——「河南非遗数字人」&#xff0c;开启了非遗文化传播的新篇章。 河南非遗…

vue3中引入高德地图初始化,并添加、删除marker

目录 先上图 1.npm引入插件&#xff08;高德地图官方推荐&#xff09; 2.页面中引入使用 3.地图初始化 4.标记marker的添加和删除 先上图 1.npm引入插件&#xff08;高德地图官方推荐&#xff09; npm install amap/amap-jsapi-loader 2.页面中引入使用 import AMapLoad…

Therabody™明星产品TheragunⓇ筋膜枪,以科技健康助力舞台高光时刻

&#xff08;2024 年 8月16日&#xff0c;中国上海&#xff09;近日&#xff0c;热门音乐竞演综艺《披荆斩棘》携最新一季热血回归&#xff0c;节目邀请三十四位知名男艺人走上舞台&#xff0c;带来精彩绝伦的表演&#xff0c;受到广大观众的喜欢。Therabody™的明星产品Therag…

科目一满分刷题技巧(三)

十六、三超扣分★常考 口诀&#xff1a;高速扣分&#xff0c;上扣12下扣6&#xff1b; 普路扣分&#xff0c;普车3下6上&#xff1b;校中危记住9/6/1 口诀&#xff1a;校客旅&#xff0c;上扣12&#xff0c;下扣6 普车超载100%扣12&#xff0c;(50%基准&#xff0c;3下6上)…

本地连接腾讯云服务器

本地连接腾讯云服务器 1 查看服务器信息1.1 登录腾讯云官网1.2 打开开发者控制台1.3 打开已购买的服务器1.4 查看系统类型和 IP 2 本地连接服务器 1 查看服务器信息 1.1 登录腾讯云官网 官网链接 1.2 打开开发者控制台 控制台链接 1.3 打开已购买的服务器 1.4 查看系统类型…

企业图纸要怎么加密?2024年最好用的十款图纸加密软件排行榜

在数字化进程不断加速的2024年&#xff0c;企业图纸的安全保护愈发重要。如何有效地对企业图纸进行加密&#xff0c;成为了众多企业关注的焦点。为了帮助您找到最佳的解决方案&#xff0c;我们精心整理了2024年最好用的十款图纸加密软件排行榜。 1. 安秉图纸加密软件 安秉图纸…

AI编程工具合集

GPT-4o (OpenAI) 这里是一些知名和广泛使用的AI编程工具及其简要介绍&#xff1a; 1. 框架和库 (Frameworks and Libraries) - TensorFlow: 由谷歌开发的开源深度学习框架&#xff0c;支持多种平台&#xff0c;适合构建和训练复杂神经网络。 - PyTorch: 由Facebook的人工智能研…

Unity Recttransform操作

1、拉伸铺满 RectTransform rect GetComponent<RectTransform>();rect.anchorMin Vector2.zero;rect.anchorMax Vector2.one;rect.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, Screen.width);rect.SetSizeWithCurrentAnchors(RectTransform.Axis.Verti…

3-3 红外人体感应模块(智能应用篇)

3-3 红外人体感应模块&#xff08;智能应用篇&#xff09; 3-3 红外人体感应模块介绍红外人体感应传感器模块&#xff08;HC-SR501原理&#xff09;电路连接示例程序效果演示人体感应传感器模块调节控制&#xff08;1&#xff09;调节感应距离&#xff08;2&#xff09;调节感应…

COMSOL碱性电解槽

记录下COMSOL案例库里面的碱性电解槽对应的文献资料和心得 文献资料参考&#xff1a; 1&#xff1a;Multiphase Fluid Dynamics and Mass Transport Modeling in a Porous Electrode toward Hydrogen Evolution Reactionhttps://pubs.acs.org/doi/10.1021/acs.iecr.2c00990# 2&…

one-shot 序列图像红外小目标分割

one-shot 序列图像红外小目标分割 IEEE TRANSACTIONS ON GEOSCIENCE AND REMOTE SENSING 代码还未开源 GitHub - D-IceIce/one-shot-IRSTS few-shot&#xff1a;利用少量标注样本进行学习 one-shot: 属于few-shot的特殊情况&#xff0c;只用一个样本进行学习 zero-shot&am…

利用Proxy302构建高效代理IP平台:从功能到架构解析

在现代互联网环境中&#xff0c;代理IP已成为企业和个人在隐私保护、网络爬虫、广告验证等场景中的关键工具。在众多代理IP平台中&#xff0c;如何选择一个高效且易用的平台&#xff1f;怎么搭建企业自己的代理IP平台&#xff0c;本文将从多个维度对进行深度分析与简易架构拆解…

你的 “可爱” 同事 justify-content 还在写 left、right 吗??

据 w3c 文档记录&#xff1a; 所以&#xff1a; justify-content 的取值只有这几种&#xff1a; flex-start | flex-end | center | space-between | space-around 千万不要向我 “可爱” 的同事一样这么写&#xff1a; 和他说了还在那里狡辩说来说去不是她 结果一…

2024.8.16(ansible)

一、回顾 1、mysql和python 1. mysql5.7 1.1 不需要执行mysql_ssl_rsa_setup 1.2 Change_master_to. 不需要get public key 2. 可以使用pymysql非交互的管理mysql 2.1 connpymysql.connect(host,user,password,database,port) 2.2 cursorconn.cursor() 2.3 cursor.execute(&qu…

激光雷达点云投影到图像平面

将激光雷达点云投影到图像平面涉及几何变换和相机模型的应用。以下是该过程的基本原理&#xff1a; 1. 坐标系转换 激光雷达生成的点云通常位于激光雷达的坐标系中&#xff0c;而图像则在相机坐标系中。为了将点云投影到图像上&#xff0c;首先需要将点云从激光雷达坐标系转换…