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?
如何在阿里云购买域名并搭建网站?
高性能网站服务器部署指南:稳定运行与安全配置优化方案

