积木报表导出数据量太大报错问题处理
- 问题背景
- 解决方案
- 运行结果
- 关键代码
问题背景
积木报表在导出大量数据时可能会遇到报错,这通常是由于数据量大导致的性能问题或数据处理方式不当引起的。以下是一些可能导致报错的原因及相应的解决方法:
性能问题:当数据量非常大时,积木报表在导出过程中可能会遇到性能瓶颈,导致导出过程缓慢甚至失败。这可能是因为报表工具本身或其所依赖的库(如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、注入拦截器
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Resource
private ExportExcelInterceptor exportExcelInterceptor;
@Override
public void addCorsMappings(CorsRegistry registry ){
//
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry ){
//
}
@Override
public void addInterceptors(InterceptorRegistry registry ){
// 注入自己写的拦截器
registry.addInterceptor(exportExcelInterceptor);
}
}
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)
495




被折叠的 条评论
为什么被折叠?



