EasyExcel 附带超链接文件下载

下载带超链接的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()来实现自定义单元格样式。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇