java 压缩导出多个excel
简单介绍下我实现的功能,首先是我的excel上传,它是以blob字段存储在oracel数据库中的,我实现的是循环遍历blob字段并使用io流进行打包下载,如有需要可自行修改
使用技术有,springMVC,mabits , bootstrap
1.前台

这里给出主要代码块
<div class="row">
<div class="col-md-12 ">
<a href="tab-trainer-info.htm?status=1" class="btn btn-danger" title='#springMessage("back")'> <i class="glyphicon glyphicon-step-backward"></i></a> <a href="downloadPreHomeWorkZIP.htm?sessionId=$!sessionId" class="btn btn-info downloadPreZip" title='#springMessage("preWorkZip")'> <i class="glyphicon glyphicon-download-alt"></i> #springMessage("preWorkZip")</a> <a href="downloadAfterHomeWorkZIP.htm?sessionId=$!sessionId" class="btn btn-info downloadAfterZip" title='#springMessage("afterWorkZip")'> <i class="glyphicon glyphicon-download-alt"></i> #springMessage("afterWorkZip")</a>
</div>
</div>
注意这里点击按钮时用的超链接,不要用的ajax提交,ajax慎用,我自己一开始使用的ajax,最后无法下载,搞了半天,后来百度,说ajax下载无法调用浏览器的下载机制,如果有必要也可以使用(要用form封装,我这里不再具体介绍,有尝试的小伙伴,可以共享一下,哈哈)
2. Controller 读取数据
@RequestMapping(value = "downloadPreHomeWorkZIP")
public void downloadLetterZIP(trainTraineeWorkModel query, HttpServletResponse response, HttpServletRequest request)
throws IOException, SQLException {
String serverPath = request.getSession().getServletContext().getRealPath("/") + "\\upload\\tempExcel"; //设置下载excel的临时文件夹
List<File> srcfile = new ArrayList<File>(); //声明一个集合,用来存放多个Excel文件路径及名称
// 得到路径下的文件,如果不存在创建文件夹
File file = new File(serverPath);
if (!file.exists()) {
file.mkdir();
}
List<Map> employees = employeeService // 查询学员上传的课前课后作业 (这里根据自己的需要获取数据,写入流中)
.getMapTraineesBySessionId(query.getSessionId());
if (employees.size() != 0) {
for (Map map : employees) {
BLOB blob = (BLOB) map.get("BEFORECLASS_WORK");
if (blob != null && blob.length() != 0) {
String employeeCode = (String) map.get("EMPLOYEE_CODE");
String filename = employeeCode + "_" + DateUtil.getExportDate(); //定义现在excel文件名称,注意这里不是压缩包的名称
ZipUtils.execute(serverPath +"\\"+ filename+ ".xls", blob); //ZipUtils是我自己定义的一个工具类,因为用到的下载太多了,往下看
String encodedfileName = new String(filename.getBytes(), "UTF-8");
srcfile.add(new File(serverPath + "\\" + encodedfileName + ".xls")); //存放到List集合中
}
}
// 将服务器上存放Excel的文件夹打成zip包
File zipfile = new File(serverPath+"\\" + "PreWork" + ".zip");
ZipUtils.zipFiles(srcfile, zipfile);// 实现将多个excel打包成zip文件
//下载
ZipUtils.downFile(response, serverPath, "PreWork" + ".zip"); //实现将压缩包写入流中,下载到本地,并删除临时文件中的压缩包及文件 }
}
3.使用工具类
这里是我第二步说的自己定义的工具类,我用的maven,需要导入一些Io流包
package common.util; import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream; import javax.servlet.http.HttpServletResponse; import oracle.sql.BLOB; public class ZipUtils {
/**
* 将多个Excel打包成zip文件
* @param srcfile
* @param zipfile
*/
public static void zipFiles(List<File> srcfile, File zipfile) {
byte[] buf = new byte[1024];
try {
// Create the ZIP file
ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipfile));
// Compress the files
for (int i = 0; i < srcfile.size(); i++) {
File file = srcfile.get(i);
FileInputStream in = new FileInputStream(file);
// Add ZIP entry to output stream.
out.putNextEntry(new ZipEntry(file.getName()));
// Transfer bytes from the file to the ZIP file
int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
// Complete the entry
out.closeEntry();
in.close();
}
// Complete the ZIP file
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
//filename为单个excel的路径和excel的名称,blob就是获取的blob数据
public static int execute(String filename, BLOB blob)
{
int success = 1;
try
{
File blobFile = new File(filename);
FileOutputStream outStream = new FileOutputStream(blobFile);
InputStream inStream = blob.getBinaryStream();
int length = -1;
int size = blob.getBufferSize();
byte[] buffer = new byte[size];
while ((length = inStream.read(buffer)) != -1)
{
outStream.write(buffer, 0, length);
outStream.flush();
}
inStream.close();
outStream.close();
}
catch (Exception e)
{
e.printStackTrace();
success = 0;
}
finally
{
return success;
} } /**
* 删除目录下所有的文件;
* @param path
*/
public static boolean deleteExcelPath(File file){
String[] files = null;
if(file != null){
files = file.list();
} if(file.isDirectory()){
for(int i =0;i<files.length;i++){
boolean bol = deleteExcelPath(new File(file,files[i]));
if(bol){
System.out.println("删除成功!");
}else{
System.out.println("删除失败!");
}
}
}
return file.delete();
} public static void downFile(HttpServletResponse response,String serverPath, String str) {
//下面注释代码虽然少,但是慎用,如果使用,压缩包能下载,但是下载之后临时文件夹会被锁住被jvm占用,不能删除
// response.setCharacterEncoding("utf-8");
// try {
// File file=new File(serverPath,str);
// response.setHeader("Content-Disposition",
// "attachment; filename="+ StringUtil.encodingFileName(str));
// response.setContentType("application/octet-stream; charset=utf-8");
// InputStream in1 =new FileInputStream(file.getPath());
// IOUtils.copy(in1, response.getOutputStream());
//
// }
// catch (IOException ex) {
// ex.printStackTrace();
// } try {
String path = serverPath +"\\"+ str;
File file = new File(path);
if (file.exists()) {
InputStream ins = new FileInputStream(path);
BufferedInputStream bins = new BufferedInputStream(ins);// 放到缓冲流里面
OutputStream outs = response.getOutputStream();// 获取文件输出IO流
BufferedOutputStream bouts = new BufferedOutputStream(outs);
response.setContentType("application/ostet-stream");// 设置response内容的类型
response.setHeader(
"Content-disposition",
"attachment;filename="
+ URLEncoder.encode(str, "UTF-8"));// 设置头部信息
int bytesRead = 0;
byte[] buffer = new byte[8192];
//开始向网络传输文件流
while ((bytesRead = bins.read(buffer, 0, 8192)) != -1) {
bouts.write(buffer, 0, bytesRead);
}
bouts.flush();// 这里一定要调用flush()方法
ins.close();
bins.close();
outs.close();
bouts.close();
} else {
response.sendRedirect("../error.jsp");
}
} catch (IOException e) {
e.printStackTrace();
}finally{
File file1=new File(serverPath);
deleteExcelPath(file1); //删除临时目录
}
}
}
java 压缩导出多个excel的更多相关文章
- java代码导出数据到Excel、js导出数据到Excel(三)
jsp内容忽略,仅写个出发按钮: <button style="width: 100px" onclick="expertExcel()&quo ...
- java Servlet导出数据到Excel文件
package com.lbc.excel.servlet; import java.io.IOException; import java.util.ArrayList; import java.u ...
- 在Java中导出word、excel格式文件时JSP页面头的设置
我们在JSP中往往会把一些表格里的东西需要导出到本地,一般都是导成word.excel格式的文件.这只需要在JSP页面头设置及在<head></head>标签中添加下面的代码: ...
- Java中导出到Excel实现_aspose.cells
参考http://183615215-qq-com.iteye.com/blog/1858208 包下载:http://pan.baidu.com/s/1o6ju0ZK,将lib的jar包导入到工程中 ...
- 重构:以Java POI 导出EXCEL为例
重构 开头先抛出几个问题吧,这几个问题也是<重构:改善既有代码的设计>这本书第2章的问题. 什么是重构? 为什么要重构? 什么时候要重构? 接下来就从这几个问题出发,通过这几个问题来系统的 ...
- java压缩文件或文件夹并导出
java压缩文件或文件夹并导出 tozipUtil: package com.zhl.push.Utils; import java.io.File; import java.io.FileInput ...
- 【转载】Java导入导出excel
转自:https://blog.csdn.net/jerehedu/article/details/45195359 目前,比较常用的实现Java导入.导出Excel的技术有两种Jakarta POI ...
- Java 使用stringTemplate导出大批量数据excel(百万级)
目前java框架中能够生成excel文件的的确不少,但是,能够生成大数据量的excel框架,我倒是没发现,一般数据量大了都会出现内存溢出,所以,生成大数据量的excel文件要返璞归真,用java的基础 ...
- Java 导出大批量数据excel(百万级)(转载)
参考资料:http://bbs.51cto.com/thread-1074293-1-1.html http://bbs.51cto.com/viewthread.ph ...
随机推荐
- 简单Elixir游戏服设计-创建玩家模型
删除model.ex 创建玩家模型 player.ex, 简单化,只有唯一标识,昵称,金币,够用了. 选择 map 代表数据,是为了扩展数据结构,方便增加功能.struct也是可以的. add_num ...
- FPGA在其他领域的应用(三)
广播领域: 专业的A/V(音频/视频),和演播室行业正在经历着激动人心的变化,例如,UHD/8K (超高清)视频.多平台内容交付.IP网络传输和云计算.2016里约奥运会使用4K分辨率视频播放,而日本 ...
- ZOJ2067 经典 DP
题目:一个由'.'和'#'组成矩形,统计里面'.'组成的矩形的个数.点击打开链接 自己写挂了,懒得搞了 #include <stdio.h> #include <string.h&g ...
- IBM Minus One 简单字符处理
IBM Minus One Time Limit: 2 Seconds Memory Limit: 65536 KB You may have heard of the book '2001 ...
- sql 时间格式
在SQL Server数据库中,SQL Server日期时间格式转换字符串可以改变SQL Server日期和时间的格式,是每个SQL数据库用户都应该掌握的.本文我们主要就介绍一下SQL Server日 ...
- ELK日志收集分析系统配置
ELK是日志收益与分析的利器. 1.elasticsearch集群搭建 略 2.logstash日志收集 我这里的实现分如下2步,中间用redis队列做缓冲,可以有效的避免es压力过大: 1.n个ag ...
- linux 下的文件目录操作之遍历目录
通过递归调用读取目录和文件信息去遍历整个目录: 示例代码: #include <unistd.h> #include <stdio.h> #include <dirent ...
- jsp中的盲区-面试可能会问到的东西
1.今天看到一个有趣的JSP题目. <body> This is my JSP page. <br> <% int a = 10; %&g ...
- C# WinForm DataGridView让DataPropertyName支持复杂属性
首先给Grid添加BindingSource,类型为BindingForForm2.或者设置Grid的DataSource为IEnumerable<BindingForForm2>. Bi ...
- vue-cli + sass 的正确打开方式
关于在vue-cli搭建的项目中怎么配置sass,网上搜到的基本是这种答案: 但是我认为,直接将样式写在每个单文件的<style>里,是十分不明智的做法.且不说node-sass安装过程的 ...