下载带超链接的Excel文件,并超链到同级目录附件,最后以压缩包的形式下载
public void downloadWorkOrder(HttpServletRequest request,HttpServletResponse response){
// 在项目根目下创建临时文件
File fileDir = new File("download");
if(!fileDir.exists()){
fileDir.mkdir();
}
// 在临时文件中创建目标文件 text.xlsx
String filePath = "download/test.xlsx";
File file = new File(filePath);
// excel写入流
ExcelWrite excelWrite = EasyExcel.write(file).build();
WriteSheet mainSheet = EasyExcel.writeSheet(0,"工单信息").head(WorkOrderExcel.class).registerWriteHandler(new ExcelHyperlinkHandler(1,new int[]{21})).build();
excelWriter.write(data,mainSheet);
// 主动关闭流
excelWrite.finish();
// 批量将附件下载到同级目录
data.forEach(k->{ URLDownLoad(k.getLink())});
// 打成压缩包
downloadZip(request,response,new Date());
// 删除缓存目录
File end = new File("download");
if(end.exists()){
FileUtils.deleteDirectory(end);
}
}
// 获取远程服务文件流
public void URLDownLoad(Strin linkUrl) throws IOException{
if(ObjectUtil.isEmpty(linkUrl)){
return;
}
URL url = new URL(linkUrl);
URLConnection conn = url.openConnection();
//设置超时间为3秒
conn.setConnectTimeout(3 * 1000);
//防止屏蔽程序抓取而返回403错误 模仿浏览器行为
conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
//得到输入流
InputStream inputStream = conn.getInputStream();
//得到远程文件
String urlFile = conn.getURL().getFile();
String[] split = urlFile.split("/");
//截取文件名称
String var = split[split.length - 1];
// 3.创建临时文件
File fileDir = new File("download");
if(!fileDir.exists()){
fileDir.mkdir();
}
String filePath = "download/"+var;
File file = new File(filePath);
file.createNewFile();
FileOutputStream outputStream = new FileOutputStream(file);
byte[] buffer = new byte[1024 * 5];
int len;
while((len = inputStram.read(buffer))!= -1){
outputStream.write(buffer,0,len);
}
outputStream.close();
inputStream.close();
}
/**
* 下载压缩包
*/
public void downloadZip(HttpServletRequest request,HttpServletResponse response, String nowTime) throws IOException {
OutputStream out = null;
File zip = null;
File fileDir = new File(DOWNLOAD_ZIP);
if(!fileDir.exists()){//如果文件夹不存在
fileDir.mkdir();//创建文件夹
}
//多个文件进行压缩,批量打包下载文件
//创建压缩文件需要的空的zip包
String zipName = "order-".concat(nowTime).concat(".zip");
String zipFilePath = DOWNLOAD_ZIP + File.separator + zipName;
//压缩文件
zip = new File(zipFilePath);
zip.createNewFile();//创建文件,存在覆盖
//创建zip文件输出流
ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zip));
this.zipFile(DOWNLOAD_DIR, zos);
zos.close();
//将打包后的文件写到客户端,输出的方法同上,使用缓冲流输出
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(zipFilePath));
byte[] buff = new byte[bis.available()];
bis.read(buff);
bis.close();
//IO流实现下载的功能
response.setCharacterEncoding("UTF-8"); //设置编码字符
response.setContentType("application/zip");
//防止文件名乱码
String userAgent = request.getHeader("USER-AGENT");
if (userAgent.contains("Firefox") || userAgent.contains("firefox")) {//火狐浏览器
zipName = new String(zipName.getBytes(), "ISO8859-1");
} else {
zipName = URLEncoder.encode(zipName, "UTF-8");//其他浏览器
}
response.setHeader("Content-Disposition", "attachment;filename=" + zipName);//设置下载的压缩文件名称
out = response.getOutputStream(); //创建页面返回方式为输出流,会自动弹出下载框
out.write(buff);//输出数据文件
//下载完后删除文件夹和压缩包
deleteFile(fileDir);
}
/**
* 删除文件及文件夹下所有文件
*/
public void deleteFile(File file) {
//判断文件不为null或文件目录存在
//获取目录下子文件
File[] files = file.listFiles();
//遍历该目录下的文件对象
for (File f : files) {
//判断子目录是否存在子目录,如果是文件则删除
if (f.isDirectory()) {
//递归删除目录下的文件
deleteFile(f);
} else {
//文件删除
f.delete();
}
}
//文件夹删除
file.delete();
}
/**
* 压缩文件
* @param filePath 需要压缩的文件夹
* @param zos zip文件输出流
*/
private void zipFile(String filePath,ZipOutputStream zos) throws IOException {
File inputFile = new File(filePath); //根据文件路径创建文件
if(inputFile.exists()) { //判断文件是否存在
if (inputFile.isFile()) { //判断是否属于文件,还是文件夹
//创建输入流读取文件
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(inputFile));
//将文件写入zip内,即将文件进行打包
zos.putNextEntry(new ZipEntry(inputFile.getName()));
//写入文件的方法,同上
int size = 0;
byte[] buffer = new byte[1024]; //设置读取数据缓存大小
while ((size = bis.read(buffer)) > 0) {
zos.write(buffer, 0, size);
}
bis.close();
} else { //如果是文件夹,写入zip
File[] files = inputFile.listFiles();
if (files != null) {
for (File fileTem : files) {
zipFile(fileTem.toString(),zos);
}
}
}
}
//关闭输入输出流
zos.closeEntry();
}
超链接样式
可以通过实现CellwriteHandler,继承afterCellCreate()来实现自定义单元格样式。