百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 文章教程 > 正文

java进行后台数据写入word模板再进行压缩包下载

yund56 2025-02-25 00:57 10 浏览

经常会遇到这样需求,写一个导出功能,进行word模板格式进行导出,数据库相应数据回填到word模板中,再对这个模板进行导出功能。如果一次性需要导出多个模板情况下,就要对多个进行压缩成一个压缩包再一次性导出。

废话不多说直接上代码:

需要导入相应jar包:

controller层:

@GetMapping(value = "/export")
public void export(HttpServletResponse response) {
    try {
        taskServic.exportWordZip(response);
    } catch (Exception e) {
        logger.error("导出失败", e);
    }
}

service层:

/**
 * 获取当前系统的临时目录
 */
public final static String SRC_PATH = System.getProperty("java.io.tmpdir");
/**
 * 导出(zip)
 * @param response
 */
public void exportWordZip( HttpServletResponse response) {
    List files = new ArrayList<>();
   //数据库查出来数据--模拟写个测试数据
    DemoVO vo = new DemoVO();
    vo.setName("测试模板数据"+System.currentTimeMillis());
    String zipFileName = "测试模板数据";
    // 动态获取模板名称
    String templateName = "demo.docx";
    //模板
    String fileName = System.currentTimeMillis()+"";
    //要写入模板里数据
    String tempFileTemplate = generate(vo, templateName, fileName);
    if (tempFileTemplate != null) {
        files.add(new File(tempFileTemplate));
    }
    //压缩包下载
    if (files != null) {
        zipDownload(response, zipFileName + "_" + System.currentTimeMillis() + ".zip", files);
    }
}
/**
 * 生成-模板-数据写入.docx文件模板
 *
 * @return
 */
public String generate(Object object, String templateName, String fileName) {
    // 获取当前系统的临时目录
    String filePath = SRC_PATH;
    String addTimeFileName =  fileName;
    //存储的文件路径  File.separator
    String storeFilePath = filePath + addTimeFileName;
    String docxFilePath = storeFilePath + ".docx";
    //后缀
    String suffix = ".docx";
    XWPFTemplate template = null;
    try (OutputStream os = new FileOutputStream(docxFilePath);
         InputStream inputStream = new ClassPathResource("/templates/" + templateName).getInputStream()) {
        DemoVO vo = (DemoVO) object;
        template = XWPFTemplate.compile(inputStream).render(new HashMap() {{
            put("name", vo.getName());
        }});
        template.write(os);
        os.flush();
        return storeFilePath + suffix;
    } catch (Exception e) {
      //  logger.error("生成模板失败", e);
    } finally {
        if (template != null) {
            try {
                template.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    return null;
}
/**
 * zip打包下载
 *
 * @param response
 * @param zipFileName
 * @param fileList
 */
public void zipDownload(HttpServletResponse response, String zipFileName, List fileList) {
    // zip文件路径
    String zipPath = ZipDownloadUtil.FILE_PATH + zipFileName;
    try {
        //创建zip输出流
        try (ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipPath))) {
            //声明文件集合用于存放文件
            byte[] buffer = new byte[1024];
            //将文件放入zip压缩包
            for (int i = 0; i < fileList.size(); i++) {
                File file = fileList.get(i);
                try (FileInputStream fis = new FileInputStream(file)) {
                    out.putNextEntry(new ZipEntry(file.getName()));
                    int len;
                    // 读入需要下载的文件的内容,打包到zip文件
                    while ((len = fis.read(buffer)) > 0) {
                        out.write(buffer, 0, len);
                    }
                    out.closeEntry();
                }
                file.delete();
            }
        }
        //下载zip文件
        ZipDownloadUtil.downFile(response, zipFileName);
    } catch (Exception e) {
      //  logger.error("文件下载出错", e);
    } finally {
        // zip文件也删除
        fileList.add(new File(zipPath));
        ZipDownloadUtil.deleteFile(fileList);
    }
}

看下一个模板内容


看下导出效果:





完美收工。

相关推荐

没有获得Windows 10 20H2升级通知,怎样直接升级

微软公司已经正式发布Windows1020H2操作系统,在正常情况下,微软只会首先推送到少量电脑,然后一边推送一边采集遥测数据。收集遥测数据可以确定哪些电脑可以更新,哪些电脑在更新后可能会失败,微...

不想让人随便卸载你安装的程序,用这四招,他将无计可施

Windows10不提供设置删除应用程序限制的功能,有几种间接方法可以防止用户删除操作系统中的程序和游戏。一、WindowsInstaller服务使用Windows工具,可以部分限制用户的权限。如...

一文看懂苹果全球开发者大会 五大系统全面升级

来源:环球网【环球网智能报道记者张阳】北京时间6月23日凌晨1点,苹果全球开发者大会(WWDC2020)如期举行,还是那个熟悉的乔布斯剧院,依旧是高水准的视频展示,但是这届WWDC,却是苹果历史...

无需等待微软分批推送,23H2可借助注册表快速获取Win11 24H2更新

IT之家10月15日消息,Windows1124H2正在分批推送,但由于存在多种Bug,微软已经开始放缓其推送节奏。WindowsLatest发现,Windows1123H2...

办公小技巧:剑走偏锋 PPT中打造动态图表

年底到了少不了又要制作各种总结报表,为了让自己的报表与众不同,我们可以借助PowerPoint动画组件+报表的方式,打造出更为出彩的动态图表。下面以PowerPoint2016为例,介绍如何使用三维...

文档表格 版本差异何在

在办公过程中,对文档或表格的修改是司空见惯的事。那么,一份文档做了内容改动,如何知道差异在哪里?一份表格改动部分数据,如何知道哪些有所变动?不要说审阅和修订功能,因为不是所有人都会用这些功能来标注的,...

Excel VBA自制日历组件16色可选 完美替代VBA日期控件

本日期组件可跟随单元格跟随窗体中ActiveX文本框组合框控件16种配色可选私信回复880日历可体验效果使用说明1打开自己需要应用日历面板的Excel表,注意必须是启用VBA的格式2在...

如何从交互角度读懂产品需求文档

作为设计师,理解产品经理提供的需求文档是交互设计工作的重要前提与起点,然而对于很多设计师来说,需求文档内容通常非常复杂,设计师们需要花费大量时间去消化、理解和归纳。本文作者结合公司示例,分析设计师如何...

植入让文档变得更强大

有效地利用文档置入技术,会让我们的常用文档功能变得更加强大,实现更加高效或有趣的应用。1.写字板文档嵌入其他文档有时,我们要组织一个大型的文档,但是这些文档的内容可能来自于不同种类的文档编辑器,比如...

Office 2016滚动文本框 顺手就来

【电脑报在线】如果一页PPT内容较多无法在完全显示,就需要用到滚动文本框,在PPT2016中借助控件即可快速制作滚动文本框。在“告诉我你想要做什么”输入“文本框控件”,在搜索结果点击“文本框(Acti...

Axure的多状态复选树

本文将详细介绍如何在Axure中实现一种增强型的多状态复选树组件,它不仅支持全选、半选和未选等状态,还具备动态加载、关键字筛选等高级功能。多状态复选树(Multi-StateCheckboxTre...

办公小技巧:PPT中控件图表巧联动

在利用PPT进行图表演示时,操作者有可能要与图表进行交互联动,比如通过输入数据来预测产品的生产情况等,这时就需要用到“开发工具”中的控件了。几个控件配合几句VBA代码,就可以轻松实现上述交互联动效果(...

用好插件——找回火狐的旧功能

现在的软件,特别是浏览器类软件,更新换代速度都很快,而且无论是外观界面还是系统组件都会有较大的变化,这样会让很多朋友无所适从。以大家常用的火狐浏览器为例,它就已经升级到了最新的35版,而且在新版中对很...

重新认识控件(二)

图片和文字,都是一种数据形式。我平时对文本框的录入,报错和提交的设计比较多。最近涉及到图片控件的设计,细细琢磨一下,这玩意还有一些平时没太注意的细节点,感觉对于其他控件的设计有指导意义,特此总结一下传...

JSA宏教程——在文档中添加复合框控件

上一期,我们初步认识了控件Control,本节我们将继续控件的相关内容。这几期我们将逐一介绍相关控制。本节先介绍复合框(也叫组合框)Combobox。复合框的作用复合框就是一个下拉选项框,一次显示一个...