excel或word模板填充数据后模板导出并压缩为zip导出

news/2024/7/21 4:28:28 标签: excel, word, zip, 模板压缩下载

后台util

fileParamList中为每个模板的参数,参数包括filePath模板文件路径(templates下面的),downloadFileName为带后缀的文件名

    public word">static word">void batchDownLoadExcelForZip(List<Map<String, Object>> fileParamList, HttpServletResponse response)
            throws Exception {

        OutputStream os = null;
        ZipOutputStream zipOutputStream = null;
        try{

            response.setHeader("Content-disposition", "attachment; filename=" + "test.zip");
            response.setContentType("application/zip; charset=utf-8");
            os = new BufferedOutputStream(response.getOutputStream());

            zipOutputStream = new ZipOutputStream(os);
            word">for(Map<String, Object> paramMap:fileParamList){
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                word">if("word".equals(paramMap.get("fileType"))){
                    InputStream is = TemplateExcelUtils.class.getClassLoader().getResourceAsStream("templates/"+paramMap.get("filePath"));
                    word">if(null!=is){
                        XWPFTemplate template = XWPFTemplate.compile(is).render(new HashMap<>());
                        template.write(baos);
                        is.close();
                    }
                }word">else{//导出excel
                    Workbook workBook = getWorkBookForDownLoad(paramMap);
                    //将workbook写入内存流
                    workBook.write(baos);
                    workBook.close();
                }
                ZipEntry zipEntry = new ZipEntry((String) paramMap.get("downloadFileName"));
                zipOutputStream.putNextEntry(zipEntry);
                //将内存流写入zip文件
                zipOutputStream.write(baos.toByteArray());
            }
        }catch (Exception e){
            e.printStackTrace();
            throw e;
        }finally {
            word">if(null !=zipOutputStream){
                zipOutputStream.closeEntry();
                zipOutputStream.flush();
                zipOutputStream.close();
            }
            word">if(null != os){
                os.close();
            }
        }
    }
    private word">static Workbook getWorkBookForDownLoad(Map<String, Object> fileParams) throws Exception {
        Workbook workbook = null;
        try {
            //读取模板
            InputStream is = TemplateExcelUtils.class.getClassLoader().getResourceAsStream("templates/"+fileParams.get("filePath"));
            XLSTransformer transformer = new XLSTransformer();
            //向模板中写入内容
            workbook = transformer.transformXLS(is, fileParams);
            HSSFSheet sheet = (HSSFSheet) workbook.getSheetAt(0);
            word">if(ObjectUtils.isNotEmpty(fileParams.get("mergCellNos"))){
                List<Map<String,Integer>> mergCellNoMaps = (List<Map<String, Integer>>) fileParams.get("mergCellNos");
                word">for(Map<String,Integer> mergMap:mergCellNoMaps){
                    sheet.addMergedRegion(new CellRangeAddress(mergMap.get("firstRow"),mergMap.get("lastRow"),mergMap.get("firstCell"),mergMap.get("lastCell")));//起始行,截止行号,起始列,截止列
                }
            }
        }catch (Exception e){
            e.printStackTrace();
            throw e;
        }finally {
            word">if(null !=workbook){
                //workbook.close();
            }
        }
        word">return workbook;
    }

controller

    @PostMapping("/exporttest")
    public word">void exportDirectorData(@RequestBody Map<String, Object> param, HttpServletResponse httpServletResponse) {
        List<Map<String, Object>> fileParamList = cmBaseDirectorExport.getFileParams(param);
        try{
            TemplateExcelUtils.batchDownLoadExcelForZip(fileParamList,httpServletResponse);
        }catch (Exception e){
            e.printStackTrace();
        }
    }

前台写法

   handleExportDs() {
      word">const that = this
      // const queryParams = JSON.parse(JSON.stringify(this.queryParams))
      let param = { id: '123' }
      this.$confirm('请确认是否导出?', '警告', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      })
        .then(function() {
          that.loading = true
          request({
            method: 'post',
            url: 'test/exporttest',
            data: param,
            responseType: 'blob'
          }).then(res => {
            that.loading = false
            word">const aLink = document.createElement('a')
            var fileName = '测试数据导出' + moment().format('YYYYMMDDHHmmss') + '.zip'
            fileName = fileName.replace(/\"/g, '')
            word">const url = window.URL.createObjectURL(res)
            aLink.href = url
            aLink.download = fileName
            aLink.click()
            aLink.remove()
            URL.revokeObjectURL(url)
          })
        })
        .catch(function() { })
    },

http://www.niftyadmin.cn/n/5275082.html

相关文章

2.vue学习(8-13)

文章目录 8.数据绑定9.el与data的2种写法10.理解mvvm11.object.defineProperty12. 理解数据代理13 vue中的数据代理 8.数据绑定 单向数据绑定就是我们学的v-bind的方式&#xff0c;vue对象变了&#xff0c;页面才变。但是页面变了&#xff0c;vue对象不会变。 双向数据绑定需要…

C语言——谁考了第k名

目录 一、题目描述&#xff1a; 二、输入格式&#xff1a; 三、输出格式&#xff1a; 四、输出样例&#xff1a; 五、输出样例&#xff1a; 六、代码呈现&#xff1a; 一、题目描述&#xff1a; 在一次考试中&#xff0c;每个学生的成绩都不相同&#xff0c;现知道了每个…

图形的绘制

画线&#xff0c;画矩形&#xff0c;画圆&#xff0c;画椭圆&#xff0c;画多边形&#xff0c;绘制字体 绘制直线 绘制直线相关知识 画线的API: line(img,开始点&#xff0c;结束点&#xff0c;颜色……&#xff09; img&#xff1a;在哪张图像上画线 开始点&#xff0c;结…

【MongoDB】--MongoDB的Sort排序问题

目录 一、问题背景描述1.1、问题背景1.2、问题分析 二、建立索引支持深度翻页查询2.1、调整sort排序的内存限制【不建议】2.2、创建索引2.3、拓展--组合索引什么时候失效 二、聚合查询解决深度翻页查询 一、问题背景描述 1.1、问题背景 现实系统页面翻页到20000页之后&#x…

【《漫画算法》笔记】找数组中出现奇数次的元素

给定数组&#xff0c;只有一个元素出现过奇数次 思路&#xff1a; 考虑到异或运算的性质——两个等值数的异或结果等于0&#xff0c;两个不等值的数异或结果为1&#xff0c; 将给定数组的所有元素异或起来&#xff0c;最终结果就是那个“唯一出现过计数次”的数。 给定数组&a…

C语言——小细节和小知识5

一、某些预处理指令 #ifdef #else #endif 这三个预处理指令用于条件编译&#xff0c;#ifdef用于判断某个宏是否被定义过&#xff0c;#endif用于结束#ifdef的作用范围&#xff0c;例如&#xff1a; #include <stdio.h>#define MAX 10int main() { #ifdef MAXprintf(&…

【jvm从入门到实战】(九) 垃圾回收(2)-垃圾回收器

垃圾回收器是垃圾回收算法的具体实现。 由于垃圾回收器分为年轻代和老年代&#xff0c;除了G1之外其他垃圾回收器必须成对组合进行使用 垃圾回收器的组合使用关系图如下。 常用的组合如下: Serial&#xff08;新生代&#xff09; Serial Old&#xff08;老年代&#xff09; Pa…

软信天成:产品信息管理(PIM)对零售行业有何意义?

产品信息管理&#xff08;PIM&#xff09;&#xff0c;通过快速收集、管理和共享横跨整个企业、合作伙伴和供应商的产品信息&#xff0c;整合分散在不同系统或部门的数据信息&#xff0c;创建实时、可信的产品数据源&#xff0c;及时获取整个企业详细、准确和一致的产品信息&am…