`
simplehumn
  • 浏览: 186501 次
  • 性别: Icon_minigender_1
  • 来自: 石家庄
社区版块
存档分类
最新评论

Excel大数据量导出

 
阅读更多
以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();
	}
}
分享到:
评论
2 楼 simplehumn 2012-03-29  
liuwenfeng554 写道
能否给我看看导出excel后台的完整操作文件代码  最好是涉及这几个文件  你的MyUtil类  还算是明白  只是在前面公共方法里面是否是一个servlet类呢?  response参数传入的值是没事 能否分享一下涉及到的这些类文件或发到我邮箱里面吧 谢谢了  277302106@qq.com

已发,另外公共方法就是一个普通方法,我已经把方法名及参数加上了。
1 楼 liuwenfeng554 2012-03-23  
能否给我看看导出excel后台的完整操作文件代码  最好是涉及这几个文件  你的MyUtil类  还算是明白  只是在前面公共方法里面是否是一个servlet类呢?  response参数传入的值是没事 能否分享一下涉及到的这些类文件或发到我邮箱里面吧 谢谢了  277302106@qq.com

相关推荐

    java excel大数据量导出demo,可支持模板导出

    在导出大数据量时,通过设置内存中的行数限制,可以有效防止内存溢出,同时保持较高的性能。 在"excelUtils"这个工具类中,我们可能会看到以下关键功能: 1. **模板导出**:用户可以预先定义Excel模板,包括单元格...

    C# 大数据量快速导出到 Excel方法

    9. **考虑使用其他库**:除了Interop,还有许多第三方库(如EPPlus、NPOI)提供更高效的数据导出,它们不依赖于Excel进程,适合大数据量操作。 在提供的`Demo`文件中,可能包含了实现以上优化策略的示例代码,你...

    C#大量数据导出到Excel自动分页导出

    C#大量数据导出到Excel,超过65536行时自动分页导出

    数据库大量数据导出Excel

    其次,在实验过程中,大数据量的导出很容易引发内存溢出,调整JVM的内存大小治标不治本。很多人建议保存为.CSV格式的文件。不过,.CSV方式导出也存在问题:首先,如果用excel来打开csv,超过65536行的数据都会看不见...

    excel大数据量导出

    可以 一次性下载较大的数据量,提供磁盘缓冲,避免了下载时JVM溢出

    导出Excel 支持大数据量导出

    在Java开发中,导出大数据量到Excel是一个常见的需求,特别是在数据分析、报表生成或数据交换等场景。"jxl"库是一个广泛使用的Java库,它允许开发者方便地读取和写入Excel文件。本篇文章将深入探讨如何使用jxl库实现...

    Data From Keil to Excel (keil数据导出至excel)

    为了将这些数据导出到Excel,我们需要在KEIL中设置数据导出选项。通常,KEIL可以通过仿真器或调试器的内存查看器来查看和复制内存数据。在内存窗口中选择要导出的数据范围,然后通过复制(Ctrl+C)将数据粘贴到Excel...

    导出大量数据到excel

    在IT行业中,将大量数据导出到Excel是常见的需求,特别是在数据分析、报表生成或数据共享时。本话题主要探讨如何高效地处理百万级别的数据导出,并利用内置的压缩功能优化存储和传输。以下是对这个主题的详细阐述: ...

    多个excel导出压缩成zip 文件 数据量大导出

    在IT行业中,大数据量的处理是一项常见的挑战,尤其是在数据导出和存储方面。"多个Excel导出压缩成zip文件"的场景通常是为了解决数据量过大导致的文件管理不便、传输效率低以及存储空间占用过多等问题。下面我们将...

    从数据库将大量数据导出到Excel文件程序总结

    这是我在公司实习的时候研究的课题,主要将大量数据从数据库导出到Excel文件。(一般是值Excel2007及以后版本)因为Excel2003及以前的版本中能保持的数据量是有限制的。Excel2007及以后版本中的数据能保持100万条...

    Java_批量导出大数据量Excel方法.zip

    在Java开发中,批量导出大数据量到Excel是一项常见的任务,尤其在数据分析、报表生成或者数据交换场景下。为了高效地处理这种情况,开发者通常需要掌握一些特定的技术和策略。本资料"Java_批量导出大数据量Excel方法...

    java多线程导出excel(千万级别)优化

    Java多线程导出Excel是处理大数据量时的一种高效策略,尤其在面对千万级别的数据时。传统的Apache POI库在处理大规模数据时可能会遇到栈溢出(StackOverflowError)和内存溢出(OutOfMemoryError)等问题,因为这些...

    delphi高效率导出数据到excel

    Delphi 高效率导出数据到 Excel Delphi 是一个功能强大的开发工具,可以用于开发各种类型的应用程序,而 Excel 是一个非常popular的电子表格软件,经常用于...这将大大提高数据导出效率,尤其是在数据量很大的情况下。

    Thinkphp 3.2利用phpexcel将数据通过excel导出

    在ThinkPHP 3.2版本中,我们有时需要将数据库中的数据导出为Excel格式,以便用户可以方便地查看、分析或进一步处理。这时,我们可以利用PHPExcel这个强大的库来实现这一功能。下面,我们将深入探讨如何在ThinkPHP ...

    JAVA导出数据到excel中大数据量的解决方法

    web项目中需要有将数据导出excel的操作需求 使用html格式导出方法,但在导出时,根据最大行数重新建立新的excel文件; 数据从数据库取出使用纯jdbc方式读数据,边读边向文件中写; 待所有数据写完,将各个小excel...

    plsql大数据量导出工具

    "plsql大数据量导出工具"是专为解决这类问题而设计的工具,它能有效地从Oracle数据库中导出大规模数据,并将其保存为CSV格式,这种格式在数据交换、分析和存储方面广泛使用。 1. **SQL*Loader(SQLULDR2)详解**: ...

    java poi导出大量数据到Excel

    ### Java POI 大量数据导出到Excel详解 #### 一、背景介绍 在日常工作中,经常需要处理大量的数据并将其导出为Excel文件,特别是在金融、电商等行业。Java POI库作为一款强大的用于读写Microsoft Office文档的Java ...

    easyui+数据导出为Excel

    在IT行业中,前端数据处理和展示是至关重要的,特别是在企业级应用中,用户往往需要将大量数据导出为便于分析的格式,如Excel。本文将详细介绍如何在基于EasyUI的前端框架下实现数据导出为Excel的功能。 EasyUI是一...

    Excel数据批量导入与Excel文件的导出

    3. **Power Pivot数据模型**:对于大数据量的分析,Excel的Power Pivot提供了强大的数据建模功能。用户可以构建数据模型并导出为Power BI报表,实现更高级的数据可视化和分析。 4. **VBA编程导出**:通过VBA,可以...

Global site tag (gtag.js) - Google Analytics