java web开发中大量数据导出Excel超时(504)问题解决

发布时间 - 2026-01-11 00:37:54    点击率:
import java.io.IOException;
import java.io.OutputStream;
import java.lang.reflect.Field;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang3.StringUtils;
import org.joda.time.DateTime;
import com.travelzen.framework.net.http.TZHttpClient;
import com.travelzen.tops.front.ota.member.item.CustomerItem;
public class CSV {
  /**
   * 目标输出流
   */
  private OutputStream stream;
  /**
   * 表头
   */
  private Map<String,String> fields;

  /**
   * 数据源model所有字段map
   */
  private static Map<String, Field> fieldMap = new HashMap<>();
  public CSV(HttpServletResponse response,Map<String,String> fields,String fileName,Class<?> clz) throws IOException{
    if(response == null || fields == null || fileName == null || clz == null)
      throw new IllegalArgumentException();
    getFieldMap(clz,fieldMap);
    this.stream = response.getOutputStream();
    this.fields = fields;
    response.setContentType("application/octet-stream;charset=GBK");
    response.setHeader("Content-Disposition", "attachment;fileName="+ fileName);
    //写表头,生成指定名字的文件,返回客户端
    StringBuilder hb = new StringBuilder();
    for(Entry<String, String> e : fields.entrySet())
      hb.append(e.getValue()+",");
    stream.write(hb.substring(0, hb.length() - 1).getBytes("GBK"));
    stream.flush();
  }
  /**
   * 往表格中插入记录
   */
  public void write(List<Object> data) throws IllegalArgumentException, IllegalAccessException, IOException{
    for(Object o : data){
      StringBuilder sb = new StringBuilder();
      sb.append("\n");
      for(String field : fields.keySet()){
        Field f = fieldMap.get(field);
        f.setAccessible(true);
        Object value = f.get(o);
        if(value == null || StringUtils.isBlank(value.toString())){
          sb.append(" ,");
        } else if (f.getType() == Date.class) {
          sb.append(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(value) + ",");
        } else if (f.getType() == DateTime.class) {
          sb.append(((DateTime)value).toString("yyyy-MM-dd HH:mm:ss") + ",");
        } else {
          String tmp = value.toString();
          if(tmp.contains(","))
            tmp = tmp.replace(",", "\",\"");
          sb.append(value.toString() + ",");
        }
      }
      stream.write(sb.substring(0, sb.length() - 1).getBytes("GBK"));
      stream.flush();
    }
  }
  public void close() throws IOException{
    stream.close();
  }
  private static <T extends Object> void getFieldMap(Class<T> clz, Map<String, Field> result) {
    for (Field field : clz.getDeclaredFields()) {
      result.put(field.getName(), field);
    }
    if (clz.getSuperclass() != null) {
      getFieldMap(clz.getSuperclass(), result);
    }
  }
}

web开发中常见的准备Excel数据需要从数据库查询数据,或者跨系统调用接口查询数据,耗费大量时间,因此未及时向浏览器返回数据,导致504超时。

本工具使用ServletOutputStream分段的往浏览器flush数据。调用方式:先new CSV(),传入指定参数,不断的调用wirte()方法往浏览器写入数据,最后调用close方法关闭流。

本工具导出的文件格式为.csv文件,windows office工具默认编码为ASCI,wps会匹配各种编码,libreOffice calc可以指定编码,故此设置编码为GBK,兼容三种Excel软件,也可根据自身需求设置编码。

本工具只处理了CSV中”,”的转码,对于双引号并未处理。

希望本文能够对遇到此问题的朋友能有所帮助


# java大量数据导出Excel超时问题  # java导出excel超时  # java大量导出excel  # 基于java web获取网页访问次数代码实例  # Javaweb实现在线人数统计代码实例  # Javaweb监听器实例之统计在线人数  # 详解javaweb中jstl如何循环List中的Map数据  # Javaweb使用cors完成跨域ajax数据交互  # javaweb中mysql数据库连接步骤方法及其实例  # Java web数据可视化实现原理解析  # 也可  # 三种  # 格式为  # 客户端  # 数据库查询  # 双引号  # travelzen  # public  # framework  # CSV  # lt  # stream  # private  # CustomerItem  # front  # tops  # TZHttpClient  # ota  # item  # member 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: INTERNET浏览器怎样恢复关闭标签页_INTERNET浏览器标签恢复快捷键与方法【指南】  详解Huffman编码算法之Java实现  无锡营销型网站制作公司,无锡网选车牌流程?  php打包exe后无法访问网络共享_共享权限设置方法【教程】  网站优化排名时,需要考虑哪些问题呢?  如何快速选择适合个人网站的云服务器配置?  Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤  如何快速搭建高效可靠的建站解决方案?  轻松掌握MySQL函数中的last_insert_id()  公司网站制作需要多少钱,找人做公司网站需要多少钱?  laravel怎么在请求结束后执行任务(Terminable Middleware)_laravel Terminable Middleware请求结束任务执行方法  简单实现Android验证码  如何在万网开始建站?分步指南解析  Laravel Blade模板引擎语法_Laravel Blade布局继承用法  Google浏览器为什么这么卡 Google浏览器提速优化设置步骤【方法】  高防服务器如何保障网站安全无虞?  详解vue.js组件化开发实践  电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?  如何续费美橙建站之星域名及服务?  如何用搬瓦工VPS快速搭建个人网站?  Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面  开心动漫网站制作软件下载,十分开心动画为何停播?  如何制作一个表白网站视频,关于勇敢表白的小标题?  想要更高端的建设网站,这些原则一定要坚持!  标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?  JavaScript如何实现路由_前端路由原理是什么  Laravel如何连接多个数据库_Laravel多数据库连接配置与切换教程  javascript事件捕获机制【深入分析IE和DOM中的事件模型】  laravel怎么为应用开启和关闭维护模式_laravel应用维护模式开启与关闭方法  iOS中将个别页面强制横屏其他页面竖屏  悟空识字如何进行跟读录音_悟空识字开启麦克风权限与录音  佛山网站制作系统,佛山企业变更地址网上办理步骤?  Laravel路由怎么定义_Laravel核心路由系统完全入门指南  laravel怎么使用数据库工厂(Factory)生成带有关联模型的数据_laravel Factory生成关联数据方法  Laravel如何实现邮箱地址验证功能_Laravel邮件验证流程与配置  香港网站服务器数量如何影响SEO优化效果?  nodejs redis 发布订阅机制封装实现方法及实例代码  laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法  Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】  如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?  laravel怎么配置Redis作为缓存驱动_laravel Redis缓存配置教程  大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?  如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南  微信小程序 闭包写法详细介绍  详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南  Claude怎样写结构化提示词_Claude结构化提示词写法【教程】  如何在腾讯云免费申请建站?  图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?  如何在阿里云购买域名并搭建网站?  高性能网站服务器部署指南:稳定运行与安全配置优化方案