以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();
}
}
分享到:
相关推荐
在导出大数据量时,通过设置内存中的行数限制,可以有效防止内存溢出,同时保持较高的性能。 在"excelUtils"这个工具类中,我们可能会看到以下关键功能: 1. **模板导出**:用户可以预先定义Excel模板,包括单元格...
9. **考虑使用其他库**:除了Interop,还有许多第三方库(如EPPlus、NPOI)提供更高效的数据导出,它们不依赖于Excel进程,适合大数据量操作。 在提供的`Demo`文件中,可能包含了实现以上优化策略的示例代码,你...
C#大量数据导出到Excel,超过65536行时自动分页导出
其次,在实验过程中,大数据量的导出很容易引发内存溢出,调整JVM的内存大小治标不治本。很多人建议保存为.CSV格式的文件。不过,.CSV方式导出也存在问题:首先,如果用excel来打开csv,超过65536行的数据都会看不见...
可以 一次性下载较大的数据量,提供磁盘缓冲,避免了下载时JVM溢出
在Java开发中,导出大数据量到Excel是一个常见的需求,特别是在数据分析、报表生成或数据交换等场景。"jxl"库是一个广泛使用的Java库,它允许开发者方便地读取和写入Excel文件。本篇文章将深入探讨如何使用jxl库实现...
为了将这些数据导出到Excel,我们需要在KEIL中设置数据导出选项。通常,KEIL可以通过仿真器或调试器的内存查看器来查看和复制内存数据。在内存窗口中选择要导出的数据范围,然后通过复制(Ctrl+C)将数据粘贴到Excel...
在IT行业中,将大量数据导出到Excel是常见的需求,特别是在数据分析、报表生成或数据共享时。本话题主要探讨如何高效地处理百万级别的数据导出,并利用内置的压缩功能优化存储和传输。以下是对这个主题的详细阐述: ...
在IT行业中,大数据量的处理是一项常见的挑战,尤其是在数据导出和存储方面。"多个Excel导出压缩成zip文件"的场景通常是为了解决数据量过大导致的文件管理不便、传输效率低以及存储空间占用过多等问题。下面我们将...
这是我在公司实习的时候研究的课题,主要将大量数据从数据库导出到Excel文件。(一般是值Excel2007及以后版本)因为Excel2003及以前的版本中能保持的数据量是有限制的。Excel2007及以后版本中的数据能保持100万条...
在Java开发中,批量导出大数据量到Excel是一项常见的任务,尤其在数据分析、报表生成或者数据交换场景下。为了高效地处理这种情况,开发者通常需要掌握一些特定的技术和策略。本资料"Java_批量导出大数据量Excel方法...
Java多线程导出Excel是处理大数据量时的一种高效策略,尤其在面对千万级别的数据时。传统的Apache POI库在处理大规模数据时可能会遇到栈溢出(StackOverflowError)和内存溢出(OutOfMemoryError)等问题,因为这些...
Delphi 高效率导出数据到 Excel Delphi 是一个功能强大的开发工具,可以用于开发各种类型的应用程序,而 Excel 是一个非常popular的电子表格软件,经常用于...这将大大提高数据导出效率,尤其是在数据量很大的情况下。
在ThinkPHP 3.2版本中,我们有时需要将数据库中的数据导出为Excel格式,以便用户可以方便地查看、分析或进一步处理。这时,我们可以利用PHPExcel这个强大的库来实现这一功能。下面,我们将深入探讨如何在ThinkPHP ...
web项目中需要有将数据导出excel的操作需求 使用html格式导出方法,但在导出时,根据最大行数重新建立新的excel文件; 数据从数据库取出使用纯jdbc方式读数据,边读边向文件中写; 待所有数据写完,将各个小excel...
"plsql大数据量导出工具"是专为解决这类问题而设计的工具,它能有效地从Oracle数据库中导出大规模数据,并将其保存为CSV格式,这种格式在数据交换、分析和存储方面广泛使用。 1. **SQL*Loader(SQLULDR2)详解**: ...
### Java POI 大量数据导出到Excel详解 #### 一、背景介绍 在日常工作中,经常需要处理大量的数据并将其导出为Excel文件,特别是在金融、电商等行业。Java POI库作为一款强大的用于读写Microsoft Office文档的Java ...
在IT行业中,前端数据处理和展示是至关重要的,特别是在企业级应用中,用户往往需要将大量数据导出为便于分析的格式,如Excel。本文将详细介绍如何在基于EasyUI的前端框架下实现数据导出为Excel的功能。 EasyUI是一...
3. **Power Pivot数据模型**:对于大数据量的分析,Excel的Power Pivot提供了强大的数据建模功能。用户可以构建数据模型并导出为Power BI报表,实现更高级的数据可视化和分析。 4. **VBA编程导出**:通过VBA,可以...