/**
* 导出项目所有数据
* @param request
* @param response
* @return
* @throws Exception
*/
public void exportAllExcel(HttpServletRequest request, HttpServletResponse response) throws Exception{
try{
String caseId = request.getParameter("caseId");
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
String reportTitle = "caseInfo_"+sdf.format(new Date());//导出文件的名字
String corpQuestionId = null;
String contactQuestionId = null;
List<Object> header = new ArrayList<Object>();
int count = 0;
//项目信息导出
if(contactQuestionId == null && corpQuestionId == null){
header.addAll(Constant.CORP_BASE_INFO_HEADER);//Constant实体中写的是导出的中文表头
header.addAll(Constant.CUSTOMER_REGION_INFO_HEADER);
header.addAll(Constant.CUSTOMER_TRADE_INFO_HEADER);
header.addAll(Constant.CORP_DIAL_INFO_HEADER);
header.addAll(Constant.CONTACT_BASE_INFO_HEADER);
header.addAll(Constant.LEADS_INFO_HEADER);
header.addAll(Constant.CONTACT_DIAL_INFO_HEADER);
count = getQuestionManageService().getAllInfo(Long.parseLong(caseId)).size();//getAllInfo()是查询要导出记录总条数
}
ExcelParser parser = new ExcelParser();
//导出6万以上数据。。。
int pageSiz= 50000;//设置每一个excel文件导出的数量
int page;//页数
//计算分页
page = count/pageSiz+(count%pageSiz > 0 ? 1:0);
String auto_name = PrimaryKeyGenerator.getShortStringKey();//自动的生成一个文件码
//upload.excel是在misc.properties配置文件中配置的一个上传文件的路径,在这个路径下建一个文件夹
String folder = WebUtils.getModuleProperty("upload.excel") + File.separator +auto_name+"_myfolder";
//如果文件夹已存在就删除,可以根据需求安排是否进行删除,按照我的需求我不需要删除,因为我自动生成的文件码不会重复
//dropFolderOrFile(new File(folder));
File myfolder = new File(folder);
myfolder.mkdir();
//开始从第一页循环导出一个文件到那个文件夹
for(int i = 0; i < page; i++){
List<Object[]> pageValues = new ArrayList<Object[]>();
//获取每次分页的数据
RowSelection rows = new RowSelection(i,pageSiz);
//查询要导出的数据
if(contactQuestionId != null && corpQuestionId == null){
pageValues = getQuestionManageService().queryContactContent(Long.parseLong(contactQuestionId),Long.parseLong(caseId), rows);
}else if(corpQuestionId != null && contactQuestionId == null){
pageValues = getQuestionManageService().queryCorpContent(Long.parseLong(corpQuestionId),Long.parseLong(caseId), rows);
}else if(corpQuestionId != null && contactQuestionId != null){
pageValues = getQuestionManageService().getAllQuestionarieInfo(Long.parseLong(corpQuestionId),Long.parseLong(contactQuestionId),Long.parseLong(caseId), rows);
}else if(contactQuestionId == null && corpQuestionId == null){
pageValues = getQuestionManageService().getAllInfo(Long.parseLong(caseId),rows);
}
List<Object[]> excelInfo = new ArrayList<Object[]>();
excelInfo.add(header.toArray());
excelInfo.addAll(pageValues);
int j=i+1;
//一定要在循环里建workBook,不然会造成数据堆积在内存,会溢出
HSSFWorkbook workBook = new HSSFWorkbook();
workBook = parser.getWriteBook(excelInfo);
// System.gc();//什么呀?这个不知道是什么,注释掉
//生成excel文件
File f = new File(myfolder+File.separator+reportTitle+"_"+j+".xls");
if(f.exists()){
f.delete();
}else{
f.createNewFile();
}
OutputStream os = new FileOutputStream(f);
workBook.write(os);
os.flush();
os.close();
}
zipFile(folder);//folder是之前获取的文件夹路径
StringBuilder uri = new StringBuilder();
uri.append(folder);
uri.append(".zip");
Utils.downloadFile(request,response,uri);//去下载zip文件
}catch(Exception e){
logger.error("导数时有错误!", e);
e.printStackTrace();
}
}
/**
* 使用POI进行Excel的写入工作 <br />
* 注:此方法会在生成的Excel工作表的最后多加一列,此列全部为空,不影响查看,<br />
* 但是对再次解析会有一定问题,再次解析这个生成的Excel时POI会认为最后这个空列也是一个有效列,<br />
* 所以我们需要解析的时候处理一下。<br />
* 这样做的原因:<br />
* 在使用jdbc-odbc的方式读取Excel时,用POI生成的Excel的文件的最后一列不被识别,<br />
* 无奈之举,在生成的Excel后面多加一列空列,这样使用jdbc-obdc读取时就不会有问题了。<br />
* 不过这也引出了上面的注意事项。其实,无论是不是poi生成的Excel文档,都需要做类似的判断的,<br />
* 任何的解析器都不会知道这个空列是否有用,那么必然会读取出来由用户来选择是否保留。
*
* @param values
* @throws IOException
* ,FileNotFoundException
* @throws IOException
* @throws
* @throws
* @throws Exception
*/
public HSSFWorkbook getWriteBook(List<Object[]> values) throws IOException,FileNotFoundException {
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet1 = wb.createSheet("Info");
int row = 0;
for (Object[] objs : values) {
HSSFRow row0 = sheet1.createRow(row);
int col = 0;
for (Object obj : objs) {
row0.createCell(col).setCellValue(new HSSFRichTextString(obj == null
|| "null".equals(obj.toString()) ? "": String.valueOf(obj)));
col++;
}
row++;
}
return wb;
}
/**
* 删除文件夹
* @param folder
*/
private void dropFolderOrFile(File file) {
if (file.isDirectory()) {
File[] fs = file.listFiles();
for (File f : fs) {
dropFolderOrFile(f);
}
}
file.delete();
}
/**
* 将指定文件夹打包成zip
* @param folder
* @throws IOException
*/
private void zipFile(String folder) throws IOException {
File zipFile = new File(folder + ".zip");
if (zipFile.exists()) {
zipFile.delete();
}
ZipOutputStream zipout = new ZipOutputStream(new FileOutputStream(zipFile));
File dir = new File(folder);
File[] fs = dir.listFiles();
byte[] buf = null;
if(fs!=null){
for (File f : fs) {
zipout.putNextEntry(new ZipEntry(f.getName()));
FileInputStream fileInputStream = new FileInputStream(f);
buf = new byte[2048];
BufferedInputStream origin = new BufferedInputStream(fileInputStream,2048);
int len;
while ((len = origin.read(buf,0,2048))!=-1) {
zipout.write(buf,0,len);
}
zipout.flush();
origin.close();
fileInputStream.close();
}
}
zipout.flush();
zipout.close();
}
/**导出
* @param response
* @param fileName
* @return
* @throws IOException
*/
public static void downloadFile(HttpServletRequest request,HttpServletResponse response,StringBuilder uri)
throws IOException {
//获取服务其上的文件名称
StringBuffer filename = new StringBuffer();
// filename.append(request.getSession().getServletContext().getRealPath("/"));
filename.append(uri);
File file = new File(filename.toString());
StringBuffer sb = new StringBuffer();
sb.append("attachment; filename=").append(uri.substring(uri.lastIndexOf("//")+1));
response.setHeader("Expires", "0");
response.setHeader("Cache-Control","must-revalidate, post-check=0, pre-check=0");
response.setHeader("Pragma", "public");
response.setContentType("application/x-msdownload;charset=UTF-8");
response.setHeader("Content-Disposition", new String( sb.toString().getBytes(), "ISO8859-1"));
//将此文件流写入到response输出流中
FileInputStream inputStream = new FileInputStream(file);
OutputStream outputStream = response.getOutputStream();
byte[] buffer = new byte[1024];
int i = -1;
while ((i = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, i);
}
outputStream.flush();
outputStream.close();
inputStream.close();
}
分享到:
相关推荐
在给定的ants-demo项目中,可能已经封装了这些功能,提供了便利的工具类,如Excel导出工具、图片下载工具和压缩包生成工具。你可以通过阅读源代码,了解具体的实现细节和调用方法。如果遇到任何问题,可以根据描述中...
- 另外,大量数据可能导致Excel打开速度慢,影响用户体验,尤其是当数据包含复杂公式和图表时。 3. **压缩成zip文件**: - 将多个Excel文件压缩成一个zip文件可以大大减小存储空间需求,便于传输和分享。 - 使用...
本篇文章将详细介绍如何通过ASP.NET结合XML技术来实现出色的Excel导出功能,尤其关注如何在同一个Excel文件中创建多个工作表(Sheet)。 #### XML技术在Excel中的应用 Microsoft Excel支持一种特殊格式的XML文件,...
在IT领域,尤其是在Web开发中,常常需要将网页上的数据导出为常见的电子表格格式,如Excel。这个压缩包文件“html-export-Excel.rar”提供了一个解决方案,它使用JavaScript库`excel-export-excel.js`来实现HTML表格...
在IT行业中,将大量数据导出到Excel是常见的需求,特别是在数据分析、报表生成或数据共享时。本话题主要探讨如何高效地处理百万级别的数据导出,并利用内置的压缩功能优化存储和传输。以下是对这个主题的详细阐述: ...
这一功能对于那些需要处理大量数据并希望以Excel格式存储的Web应用程序来说,是非常实用的。在实际开发中,开发者可以参考压缩包内的代码,理解其工作原理,并根据项目需求进行适当的调整和扩展。
在压缩包"新版excel导出控件"中,可能包含以下内容: 1. 控件库文件:这是PB控件的核心部分,包含了导出功能的实现代码。 2. 示例代码:为了帮助开发者理解和使用这个控件,通常会提供示例程序,展示如何在PB应用中...
在提供的压缩包文件`json2excel`中,很可能包含了示例模板和可能的JSON数据样本,以及如何将它们结合的Java代码。通过学习和理解这些示例,你可以更好地掌握如何利用`jxls-poi`从JSON数据生成Excel文件。 总的来说...
在Java开发中,处理大数据量的Excel导出是一项常见的任务,尤其当数据量达到数十万条时,单个Excel文件可能会遇到性能瓶颈或格式限制...这种方案在实际项目中具有很高的实用价值,尤其对于需要大量数据导出的业务场景。
在提供的压缩包`freemarker总结-例子`中,可能包含了一个简单的示例项目,展示如何使用Freemarker和POI实现Excel导出。这个例子通常包括以下部分: 1. 一个`.ftl`模板文件,描述了Excel表格的布局。 2. Java代码,...
在前端开发中,有时我们需要与Excel文件进行交互,例如导入数据、导出数据或从Excel文件中获取数据。"xlsx.full.min.js" 是一个流行的JavaScript库,专门用于处理这种任务。这个库允许开发者在浏览器环境中读写Excel...
标题中的“在excel的一个sheet中导出大批量数据>20万”指的是处理Excel电子表格时,涉及到大量数据(超过20万个单元格)的导出操作。在Excel中,通常20万条数据可能超过了单个工作表的推荐限制,这可能会导致性能...
这个压缩包可能是为了教用户如何在VB程序中创建、操作或导出数据到Excel文件。 描述中提到"vb 将数据导出到EXCEL,EXCEL名称路径可自行确定",这意味着该资源可能包含如何在VB中动态指定Excel文件的保存位置和名称...
它的优点在于内存效率高,对于大量数据处理尤为适合。 3. **ClosedXML**:这个库也是针对Open XML格式的,它提供了丰富的API,使得操作Excel就像操作集合一样简单。ClosedXML支持单元格的公式计算,样式设置,图表...
在C#编程环境中,处理大量数据的导出到Excel...总之,这个压缩包资源为C#开发者提供了一套处理大量数据导出到Excel的实践指南,涵盖了从基础操作到高级技巧的各种知识点,对于提升C#开发者的Excel操作能力非常有帮助。
标题中的“POI实现的基于动态模板的EXCEL数据导出”是指利用Apache POI库来创建一个可以动态填充数据的Excel模板,从而实现大量数据的高效导出。Apache POI是一个开源项目,它允许Java开发者读写Microsoft Office...
本文将详细讲解如何使用给定的压缩包文件中的代码来实现这一功能,特别是导出带边框的Excel和将数据导入DataSet。 首先,"导入导出EXCEL"是指将数据库或其他数据源的数据写入Excel文件,或从Excel文件中读取数据并...
"Excel百万级别数据的导入和导出"这一主题主要关注如何高效、有效地管理大量数据在Excel中的输入与输出。以下将详细讨论相关知识点: 1. **Excel的数据限制**:Excel本身对于单个工作表的数据行数限制在1,048,576行...
在压缩包中的"Dw2xls.pbl"文件,可能是一个包含了实现数据窗口到Excel导出功能的特定类或者函数的库文件。通常,这种库文件可能包含自定义的函数或方法,比如DW_ExportToExcel,用于执行数据窗口到Excel的导出操作。...
在IT行业中,处理数据并以用户友好的方式呈现是至关重要的任务之一,Excel作为广泛使用的电子表格工具,常被用于数据分析、报告制作等场景。"JxlsDemo 1.0.6导出Excel文档Demo" 提供了一个使用JXLS库进行Excel文件...