以jdbc为例,手动拼装sql
//定义Excel表头
String[] topNamelist = new String[]{"姓名","住址"}
//对应的key键
String[] fieldNameList = new String[]{"name","address"};
//需要HttpServletResponse response
//sql语句
String sql = "select name,address from t_user where ooxx=?";
公共方法里
/**
* @Description: Excel大数据量导出
* @param topNamelist Excel表头
* @param fieldNameList Map数据对象的key
* @param sql 查询语句
* @param obj 查询sql的参数
*/
public void excelDownload(String[] topNamelist,String[] fieldNameList, String sql, Object[] obj, String excelName) {
//每个sheet写入65530行数,如果内存溢出可以调整内存或者把这个参数改小点
int sheetSize = Constant.SHEET_SIZE;
//当前sheet页
int sheetIndex = 1;
//总sheet数
int totalSheet = 1;
//总记录数
int count = DataTool.executeQueryCount(sql, obj);
//计算总共多少个sheet
if (count % sheetSize == 0) { //总记录数与每页显示记录数取余
totalSheet = count / sheetSize;
} else {
totalSheet = (int) Math.floor(count / sheetSize) + 1;
}
//临时文件存放路径c:\\bdtemp\\
String pathFolder = Constant.TEMP_PATH;
//文件名称,UUID命名保证文件唯一
String fileName = pathFolder + CommonUtil.getUuid() + ".xls";
//创建文件夹
File fileFolder = new File(pathFolder);
if (!fileFolder.exists()) {
fileFolder.mkdir();
}
File file = new File(fileName);
//分页写入结果集
for (int k = 0; k < totalSheet; k++) {
List list = new ArrayList();
sheetIndex = k + 1;
StringBuffer buf = new StringBuffer();
buf.append("select * from (");
buf.append("select a.*,rownum row_num from(");
buf.append(sql);
buf.append(") a where rownum<=").append(sheetSize * sheetIndex);
buf.append(") b where b.row_num > ").append(
sheetSize * (sheetIndex - 1));
//一个sheet的数据,DataTool为jdbc执行sql的封装类
list = DataTool.executeQuery(buf.toString(), obj);
MyUtil.writeExcel(list, file, sheetIndex-1, "sheet"+sheetIndex,topNamelist, fieldNameList);
}
//下载Excel
MyUtil.downloadFile(fileName, response, excelName+".xls");
}
writeExcel方法里
public static void writeExcel(List list, File file, int sheetIndex, String sheetName,
String[] topNamelist, String[] fieldNameList) {
try {
WritableWorkbook wwb=null;
if(sheetIndex==0){
//首次创建一个Excel文件
wwb= Workbook.createWorkbook(file);
}else{
//非首次,获取已创建Excel文件
Workbook wb=Workbook.getWorkbook(file);
// 打开一个文件的副本,并且指定数据写回到原文件
wwb= Workbook.createWorkbook(file,wb);
}
WritableSheet ws = wwb.createSheet(sheetName, sheetIndex);
// 写入列名称
for (int i = 0; i < topNamelist.length; i++) {
Label label = new Label(i, 0, topNamelist[i].toString());
ws.addCell(label);
}
//写入数据
for (int i = 0; i < list.size(); i++) {
int x = i + 1;
Map map = (Map) list.get(i);//testReflect(list.get(i));
for (int j = 0; j < fieldNameList.length; j++) {
if (map.get(fieldNameList[j]) != null) {
Label labela = new Label(j, x, String.valueOf(map.get(fieldNameList[j])));
ws.addCell(labela);
} else {
Label labela = new Label(j, x, null);
ws.addCell(labela);
}
}
}
//写入
wwb.write();
//关闭
wwb.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* @Description: 文件下载
* @param filePath 文件路径
* @param response HttpServletResponse
* @param fileName 文件名,输出到用户的下载对话框
*/
public static void downloadFile(String filePath,
HttpServletResponse response, String fileName) {
try {
fileName = new String(fileName.getBytes("GB2312"), "ISO8859_1");
// 打开指定文件的流信息
FileInputStream fs = null;
File file = new File(filePath);
fs = new FileInputStream(file);
OutputStream os = null;
response.setContentType("APPLICATION/DOWNLOAD");
response.setHeader("Content-Disposition", "attachment; filename=\""
+ fileName + "\"");// ***是文件名
response.setContentLength(fs.available());
os = response.getOutputStream();
int iBytesRead = 0;
byte[] buffer = new byte[8192];
while ((iBytesRead = fs.read(buffer, 0, 8192)) != -1) {
os.write(buffer, 0, iBytesRead);
}
response.flushBuffer();
fs.close();
os.close();
file.delete();
} catch (Exception e) {
e.printStackTrace();
}
}
分享到:
相关推荐
支持模板导出 ,支持分页查询 , 支持大数据量,采用SXSSFWorkbook
C#大量数据导出到Excel,超过65536行时自动分页导出
可以 一次性下载较大的数据量,提供磁盘缓冲,避免了下载时JVM溢出
根据Microsoft.Office.Interop.Excel,优化大数据量快速导出到 Excel 的方法
jxl 导出Excel 支持大数据量导出 导出数据量大 速度也快
其次,在实验过程中,大数据量的导出很容易引发内存溢出,调整JVM的内存大小治标不治本。很多人建议保存为.CSV格式的文件。不过,.CSV方式导出也存在问题:首先,如果用excel来打开csv,超过65536行的数据都会看不见...
见到导出大量数据 自己定义Excel表格样式 用html当时定义见到导出大量数据 自己定义Excel表格样式 用html当时定义见到导出大量数据 自己定义Excel表格样式 用html当时定义见到导出大量数据 自己定义Excel表格样式 用...
解决大批量数据导出Excel产生内存溢出的方案
轻松解决普通poi形式导出Excel的中出现的栈溢出问题,此资源可实现千万级数据分批导出csv文件,csv大数据量导出(千万级别,不会内存溢出),多线程导出 ,生产环境已经很稳定的使用着
这是我在公司实习的时候研究的课题,主要将大量数据从数据库导出到Excel文件。(一般是值Excel2007及以后版本)因为Excel2003及以前的版本中能保持的数据量是有限制的。Excel2007及以后版本中的数据能保持100万条...
java poi导出大量数据到Excel
Java_批量导出大数据量Excel方法.zip
导出大量数据到excel,本人已亲测,对几百万数据已测试过,导出数据比较乐观,里面自带压缩文件功能。
js 导出 Excel 【支持大量数据导出,亲测】、支持IE噢
前端导出数据为excel(兼容chrome 和 IE10以上版本),列举了网上常用的两种方法外,新增了可以导出超过5W行数据的方法
解决poi大数据量导出excel的代码,该代码中所用的jar包是poi3.9。在测试过程中单个sheet中导出20万数据没有问题。
直接可以用的项目。数据量大,导出多个excel然后压缩成zip文件。。。
Excel数据批量导入与Excel文件的导出,Excel数据批量导入与Excel文件的导出
C# datatable直接导出数据到Excel,(数据量百万级只需3秒)
POI百万级大数据量EXCEL导出 - 请叫我猿叔叔的博客 - CSDN博客.htm