简单介绍下我实现的功能,首先是我的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的更多相关文章

  1. java代码导出数据到Excel、js导出数据到Excel(三)

     jsp内容忽略,仅写个出发按钮:          <button style="width: 100px" onclick="expertExcel()&quo ...

  2. java Servlet导出数据到Excel文件

    package com.lbc.excel.servlet; import java.io.IOException; import java.util.ArrayList; import java.u ...

  3. 在Java中导出word、excel格式文件时JSP页面头的设置

    我们在JSP中往往会把一些表格里的东西需要导出到本地,一般都是导成word.excel格式的文件.这只需要在JSP页面头设置及在<head></head>标签中添加下面的代码: ...

  4. Java中导出到Excel实现_aspose.cells

    参考http://183615215-qq-com.iteye.com/blog/1858208 包下载:http://pan.baidu.com/s/1o6ju0ZK,将lib的jar包导入到工程中 ...

  5. 重构:以Java POI 导出EXCEL为例

    重构 开头先抛出几个问题吧,这几个问题也是<重构:改善既有代码的设计>这本书第2章的问题. 什么是重构? 为什么要重构? 什么时候要重构? 接下来就从这几个问题出发,通过这几个问题来系统的 ...

  6. java压缩文件或文件夹并导出

    java压缩文件或文件夹并导出 tozipUtil: package com.zhl.push.Utils; import java.io.File; import java.io.FileInput ...

  7. 【转载】Java导入导出excel

    转自:https://blog.csdn.net/jerehedu/article/details/45195359 目前,比较常用的实现Java导入.导出Excel的技术有两种Jakarta POI ...

  8. Java 使用stringTemplate导出大批量数据excel(百万级)

    目前java框架中能够生成excel文件的的确不少,但是,能够生成大数据量的excel框架,我倒是没发现,一般数据量大了都会出现内存溢出,所以,生成大数据量的excel文件要返璞归真,用java的基础 ...

  9. Java 导出大批量数据excel(百万级)(转载)

    参考资料:http://bbs.51cto.com/thread-1074293-1-1.html                 http://bbs.51cto.com/viewthread.ph ...

随机推荐

  1. Python实战之dict简单练习

    ['__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__forma ...

  2. webpack2使用ch7-loader解析css 自动添加浏览器前缀

    1 目录结构  安装的依赖 "autoprefixer": "^6.7.7", "css-loader": "^0.28.0&qu ...

  3. Linux-fdisk磁盘分区命令(16)

    名称: fdisk 使用: fdisk [块设备磁盘] 说明: 将一个块设备(磁盘)分成若干个块设备(磁盘),并将分区的信息写进分区表.  fdisk命令菜单常用参数如下所示: d:(del)删除一个 ...

  4. redis的sentinel主从切换(failover)与Jedis线程池自动重连

    本文介绍如何通过sentinel监控redis主从集群,并通过jedis自动切换ip和端口. 1.配置redis主从实例 10.93.21.21:6379 10.93.21.21:6389 10.93 ...

  5. netfilter/iptables和firewalld的关系

    1.netfilter 是linux 内核模块,其中包含了大量的内核规则,而要想对这些内核规则进行操作,就需要用户态的工具. iptables和firewalld就是一个用户态的工具. 2.iptab ...

  6. scala中的Type使用

    trait Base { val name: String } case class S( name: String, age: Int ) extends Base case class F( na ...

  7. db2备份还原

    还原步骤:创建好数据库后进入该数据库 .restore db TSMESDB from D:\ICSS\dbData on D:\ICSS\dbData  into TSMESDB redirect. ...

  8. C#编译器和CLI的安装

    为了完成C#程序编译和运行,需要安装代码对应版本的编译器和CLI(公共语言框架)平台. (部分内容摘自<C#本质论>) 针对主流的CLI平台(Microsoft .NET),有两种安装方案 ...

  9. JPA + SpringData 操作数据库原来可以这么简单 ---- 深入了解 JPA - 2

    原创播客,如需转载请注明出处.原文地址:http://www.cnblogs.com/crawl/p/7704914.html ------------------------------------ ...

  10. Cosmos OpenSSD--greedy_ftl1.2.0(三)

    我们来假设模拟一个小型的模型来分析写和垃圾回收的过程 假设只有一个die,4个block,每个block4个page,每个page8KB 那么PageMap就是Page[0][0]到Page[0][1 ...