文件打包下载excel导出和word导出

0.文件下载接口

        请求 GET

        /pm/prj/menu/whsj/download/{affixId}

       文件affixId多个id以逗号隔开。多个文件会以打包得形式。

 

1.Excel导出

        1.0接口

POST

127.0.0.1:8400/pm/io/exportExcel/year-plan-table-workflow/report

参数

[{"org":"011","report":"年度计划表","fiscalYear":"2023","mofDivCode":"371000"}] 

 

    1.1配置模板

数据要以 [entity.object]为模板配置,而且下方必须空一行不然导入会报错

1.2导入模板配置导出配置

多个集合需要配置多个查询条件,配置得服务接口要跟代码里面得对应服务接口得代码

package com.wenzheng.whsj.prj.export;import com.wenzheng.module.common.excel.suite.service.DataSourceProvider;
import com.wenzheng.platform.core.bean.LoginUser;
import com.wenzheng.whsj.prj.persistence.entity.YearPlanInfo;
import com.wenzheng.whsj.prj.service.PmPrjConcentrateArgumentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;
import java.util.Map;/**** 年度计划表导出** @Author ZRP* @Date 2023/10/13 14:36*/
@Service(value = "gzw.yearPlanTableCloudProjectExport")
public class YearPlanTableCloudProjectExport implements DataSourceProvider {@Autowiredprivate PmPrjConcentrateArgumentService pmPrjConcentrateArgumentService;@Overridepublic List<Map<String, Object>> findData(Map<String, Object> param) {LoginUser user = new LoginUser();user.setFiscalYear(param.get("fiscalYear").toString());user.setMofDivCode(param.get("mofDivCode").toString());user.setOrgCode(param.get("org").toString());YearPlanInfo yearPlanInfo = pmPrjConcentrateArgumentService.selectYearPlan(0, user, null, null, null, null);return yearPlanInfo.getCloudProjectList();}
}

2.导出word

     2.0接口

年度计划书导出 接口

POST

http://10.30.4.96:8400/pm/io/exportExcel/year-plan-book-workflow/report

参数

[{"org":"011","report":"年度计划书","fiscalYear":"2023","mofDivCode":"371000"}]

   2.1模板

2.2配置模板

2.3编写替换数据代码

 @Autowiredprivate PmTemplateAffixService templateAffixService;@Autowiredprotected SuiteExportService exportService;@Autowiredprivate OfficeService officeService;@Value("${base.uploadpath:upload}")private String uploadPath;@Autowiredprivate PmBaseAffixMapper affixMapper;@Autowiredprivate FundsAnalysisService fundsAnalysisService;@Overridepublic ResponseEntity<byte[]> downloadWordReport(HttpServletRequest request, String id, Map<String, Object> params, LoginUser user) throws Exception {if (BaseUtils.isNull(id)) {return null;}if (org.apache.commons.collections4.MapUtils.isEmpty(params)) {params = new HashMap<>();params.put("fiscalYear", user.getFiscalYear());params.put("mofDivCode", user.getMofDivCode());}String useObject = exportService.getExpKeyByExportSwitch("year-plan-table-workflow-report", params, user.getFiscalYear(), user.getMofDivCode(), SuiteExportService.TYPE_WORD);// 取得模板List<PmTemplateAffix> lstTemplate = templateAffixService.selectByUseObject(useObject, user.getFiscalYear(),user.getMofDivCode());if (lstTemplate == null || lstTemplate.isEmpty()) {throw new TemplateSetException("模板没定义");}PmTemplateAffix affixTemp = lstTemplate.get(0);byte[] data = affixTemp.getFileData();//查询数据Map<String, Object> map = pmPrjMeasurementReferenceDao.selectById(id);if (map == null) {throw new TemplateSetException("暂无当前数据");}map = initData(map, user, request);String prjName = map.get("prj_name").toString();String fileName = prjName + affixTemp.getFileName().substring(0, affixTemp.getFileName().indexOf(".")) + "." + affixTemp.getFileType();// 替换data = officeService.createDoc(data, map);createFile(data, map, lstTemplate.get(0), fileName);//如果是生成的,则直接返回 如果是下载用下面这些代码直接输出文件流HttpHeaders headers = new HttpHeaders();// 处理文件名编码问题String userAgent = request.getHeader("user-agent");if (HttpUtils.isMSBrowser(userAgent)) {// 如果是IE浏览器,则用URLEncode解析fileName = URLEncoder.encode(fileName, "UTF-8");fileName = fileName.replace("+", " ");} else {// 如果是谷歌、火狐则解析为ISO-8859-1fileName = new String(fileName.getBytes("gbk"), StandardCharsets.ISO_8859_1);}headers.set("Content-Disposition", "attachment; filename=\"" + fileName + "\"");headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);return new ResponseEntity<>(data, headers, HttpStatus.OK);}//创建文件出来,存入文件库 获得文件要下载文件id
public String createFile(byte[] data, Map<String, Object> map, PmTemplateAffix pmTemplateAffix, String fileName) {String useObject = "yearPlanReport";DateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");String dateStr = dateFormat.format(new Date());String uuidName = UUID.randomUUID().toString();String fileRealName = UUID.randomUUID().toString();File templateAffixFile = null;try {templateAffixFile = FileTool.fileToBytes(data, uploadPath + "/" + useObject + "/" + dateStr + "/", "/" + uuidName);} catch (Exception e) {System.err.println("===========>" + e.getMessage());}MultipartFile multipartFile = FileTool.getMultipartFile(templateAffixFile);PmBaseAffix affix = new PmBaseAffix();affix.setAffixId(UUID.randomUUID().toString());if (map.get("affix_id") != null) {affix.setPrjId(map.get("affix_id").toString());} else {affix.setPrjId(UUID.randomUUID().toString());}affix.setJobId(affix.getPrjId());affix.setUseObject(useObject);affix.setFileType(pmTemplateAffix.getFileType());affix.setFileSize(BaseUtils.sizeParse(multipartFile.getSize()));affix.setFileName(fileName);affix.setFileTitle(fileName);affix.setFileRealName(uuidName);affix.setFilePath(File.separator + affix.getUseObject() + File.separator + dateStr);affix.setUpdateTime(new Date());List<PmBaseAffix> pmBaseAffix = pmPrjMeasurementReferenceDao.selectByPrjCode(affix.getPrjId(), useObject);if (pmBaseAffix.size() == 0) {affixMapper.insert(affix);} else {affix.setAffixId(pmBaseAffix.get(0).getAffixId());affixMapper.updateByPrimaryKeySelective(affix);}return affix.getAffixId();}

用到的工具方法

/*** 将Byte数组转换成文件** @param bytes    byte数组* @param filePath 文件路径  如 D:\\Users\\Downloads\\* @param fileName 文件名*/public static File fileToBytes(byte[] bytes, String filePath, String fileName) {BufferedOutputStream bos = null;FileOutputStream fos = null;File file = null;try {file = new File(filePath + fileName);if (!file.getParentFile().exists()) {//文件夹不存在 生成file.getParentFile().mkdirs();}fos = new FileOutputStream(file);bos = new BufferedOutputStream(fos);bos.write(bytes);} catch (Exception e) {e.printStackTrace();} finally {if (bos != null) {try {bos.close();} catch (IOException e) {e.printStackTrace();}}if (fos != null) {try {fos.close();} catch (IOException e) {e.printStackTrace();}}}return file;}public static  MultipartFile getMultipartFile(File file) {FileInputStream fileInputStream = null;MultipartFile multipartFile = null;try {fileInputStream = new FileInputStream(file);multipartFile = new MockMultipartFile(file.getName(), file.getName(),ContentType.APPLICATION_OCTET_STREAM.toString(), fileInputStream);} catch (Exception e) {e.printStackTrace();}return multipartFile;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/112979.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

docker更新容器映射端口

一个容器已经暴露了一个端口被外界使用&#xff0c;但是这个端口被公司不允许使用&#xff0c;需要修改为其他的端口&#xff0c;怎么办&#xff1f; 1、删除原容器&#xff0c;重启新容器 删除已启动容器&#xff0c;从镜像重启新容器。2、修改原容器配置文件 3、生成镜像&…

Selenium定向爬取PubMed生物医学摘要信息

本文主要是自己的在线代码笔记。在生物医学本体Ontology构建过程中,我使用Selenium定向爬取生物医学PubMed数据库的内容。 PubMed是一个免费的搜寻引擎,提供生物医学方面的论文搜寻以及摘要。它的数据库来源为MEDLINE(生物医学数据库),其核心主题为医学,但亦包括…

java8 Optional理解及示例

大量判空的代码 实际中&#xff0c;对象不判空会导致空指针异常。 为了规避为指针&#xff0c;不得不写出这种非常冗长又丑陋的空指针判断。 public void tooMuchNull(Worker worker) {if (worker ! null) {Address addressworker.getAddress();if (address ! null) {String…

react-router-dom v6版本实现Tabs路由缓存切换

目录 文章目录 概要 效果 完整代码 概要 摆了半年摊&#xff0c;好久没写代码了&#xff0c;今天有人问我怎么实现React-Router-dom类似标签页缓存。后面看了一下router的官网。很久以前用的是react-router v5那个比较容易实现。v6变化挺大&#xff0c;但了解react的机制和rea…

Android一些新的技术栈,你都会哪些?

Jetpack Compose&#xff1a; Jetpack Compose是一种全新的声明式UI框架&#xff0c;用于构建Android应用的用户界面。它使UI开发更加简单和直观&#xff0c;通过使用Kotlin语言来创建交互式和动态的UI组件。 Kotlin Multiplatform&#xff1a; Kotlin Multiplatform允许开发者…

uniapp检测新版本

一、代码 在app.vue中写入 Update() {const updateManager uni.getUpdateManager();console.log(版本,updateManager,uni.getSystemInfoSync());updateManager.onCheckForUpdate(function(res) {// 请求完新版本信息的回调console.log(版本更新, res);});updateManager.onUpd…

2023年【北京市安全员-A证】考试报名及北京市安全员-A证考试资料

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 北京市安全员-A证考试报名根据新北京市安全员-A证考试大纲要求&#xff0c;安全生产模拟考试一点通将北京市安全员-A证模拟考试试题进行汇编&#xff0c;组成一套北京市安全员-A证全真模拟考试试题&#xff0c;学员可…

粗糙集知识约简的python代码

看到不少人给我留言关于粗糙集的问题&#xff0c; 由于以前代码写的时间太长了&#xff0c;而且过于简化&#xff0c;我都忘了自己怎么写的了&#xff0c;我就没有每个人都回应。 现在更新新版的粗糙集代码 知识约简也相当简单&#xff0c;只要调用RoughSets.cores就可以看到哪…

【LeetCode】59. 螺旋矩阵 II

1 问题 给你一个正整数 n &#xff0c;生成一个包含 1 到 n2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;[[1,2,3],[8,9,4],[7,6,5]] 示例 2&#xff1a; 输入&#xff1a;n…

windows 11 安装PHP8.2

环境说明 windows:windows 11 x64apache: Apache/2.4.43php :php-8.2.11 一.php 1、PHP下载 PHP For Windows: Binaries and sources Releases 注意&#xff1a; 1.要下载Thread Safe&#xff0c;否则没有php8apache2_4.dll这个文件&#xff1b;如果使用Apache作为服务器…

SpringSecurity+ Oauth2.0+JWT 0-1

这里写目录标题 准备工作准备SQL添加用户添加依赖准备UserInfoUserMapperUserServiceUserServiceImpl配置SpringDataUserDetailsService 授权服务器&#xff1a;AuthorizationServer配置客户端详细信息管理令牌定义TokenConfig定义AuthorizationServerTokenServices 令牌访问端…

k8s 实战 常见异常事件 event 及解决方案分享

k8s 实战 常见异常事件 event 及解决方案分享 集群相关 Coredns容器或local-dns容器 重启集群中的coredns组件发生重启(重新创建)&#xff0c;一般是由于coredns组件压力较大导致oom&#xff0c;请检查业务是否异常&#xff0c;是否存在应用容器无法解析域名的异常。如果是l…

Python爬虫基础之Selenium详解

目录 1. Selenium简介2. 为什么使用Selenium&#xff1f;3. Selenium的安装4. Selenium的使用5. Selenium的元素定位6. Selenium的交互7. Chrome handless参考文献 原文地址&#xff1a;https://program-park.top/2023/10/16/reptile_3/ 本文章中所有内容仅供学习交流使用&…

左连接一对多的情况

左连接一对多时候&#xff0c;应该以主表唯一数据为左表 GROUP_CONCAT&#xff08;&#xff09;

Flutter之Widget生命周期

目录 初始化构造函数initStatedidChangeDependencies 运行时builddidUpdateWidget 组件移除deactivatedisposereassemble 函数生命周期说明&#xff1a;实际场景App生命周期 前言&#xff1a;生命周期是一个组件加载到卸载的整个周期&#xff0c;熟悉生命周期可以让我们在合适的…

父组件与子组件的属性透传

透传是vue中一种特性&#xff0c;官方的解释是&#xff1a;“透传 attribute”指的是传递给一个组件&#xff0c;却没有被该组件声明为 props 或 emits 的 attribute 或者 v-on 事件监听器。最常见的例子就是 class、style 和 id。这句话解释过来就是一些不被prop定义的属性直接…

django 支付宝支付

支付宝支付 1.注册开发者账号 调试支付宝支付需要先在支付宝开放平台进行组测&#xff0c;入驻为“自助研发者”&#xff0c;链接为支付宝开放平台 2.进入开发者工具中的沙箱 里面有所需的id 域名 3.RSA 加密算法

尚硅谷Flink(完)FlinkSQL

&#x1f9d9;FlinkSQL&#x1f3c2;&#x1f93a; Table API 和 SQL 是最上层的 API&#xff0c;在 Flink 中这两种 API 被集成在一起&#xff0c;SQL 执行的对象也是Flink 中的表&#xff08;Table&#xff09;&#xff0c;所以我们一般会认为它们是一体的。 SQL API 是基于…

短视频矩阵系统源头开发

一、智能剪辑、矩阵分发、无人直播、爆款文案于一体独立应用开发 抖去推----主要针对本地生活的----移动端(小程序软件系统&#xff0c;目前是全国源头独立开发)&#xff0c;开发功能大拆解分享&#xff0c;功能大拆解&#xff1a; 7大模型剪辑法&#xff08;数学阶乘&#x…

openHarmony UI开发

常用组件和布局方式 组件 ArkUI有丰富的内置组件&#xff0c;包括文本、按钮、图片、进度条、输入框、单选框、多选框等。和布局一样&#xff0c;我们也可以将基础组件组合起来&#xff0c;形成自定义组件。 按钮&#xff1a; Button(Ok, { type: ButtonType.Normal, stateEf…