文件打包下载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;}
相关文章:

文件打包下载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","re…...

模拟退火算法求解TSP问题(python)
模拟退火算法求解TSP的步骤参考书籍《Matlab智能算法30个案例分析》。 问题描述 TSP问题描述在该书籍的第4章 算法流程 部分实现代码片段 坐标轴转换成两点之间直线距离长度的代码 coordinates np.array([(16.47, 96.10),(16.47, 94.44),(20.09, 92.54),(22.39, 93.37),(2…...

电路基础元件
文章目录 每周电子w5——电路元件基本电路元件电阻元件电容元件电感元件 每周电子w5——电路元件 基本电路元件 电路元件:是电路中最基本的组成单元 电路元件通过其端子与外部相连接;元件的特性则通过与端子有关的物理量描述每一种元件反映某种确定的电…...

百度地图API:JavaScript开源库几何运算判断点是否在多边形内(电子围栏)
百度地图JavaScript开源库,是一套基于百度地图API二次开发的开源的代码库。目前提供多个lib库,帮助开发者快速实现在地图上添加Marker、自定义信息窗口、标注相关开发、区域限制设置、几何运算、实时交通、检索与公交驾车查询、鼠标绘制工具等功能。 判…...

BFS专题8 中国象棋-马-无障碍
题目: 样例: 输入 3 3 2 1 输出 3 2 1 0 -1 4 3 2 1 思路: 单纯的BFS走一遍即可,只是方向坐标的移动变化,需要变化一下。 代码详解如下: #include <iostream> #include <vector> #include…...

R语言中fread怎么使用?
R语言中 fread 怎么用? 今天分享的笔记内容是数据读取神器fread,速度嘎嘎快。在R语言中,fread函数是data.table包中的一个功能强大的数据读取函数,可以用于快速读取大型数据文件,它比基本的read.table和read.csv函数更…...

element-plus 表格-自定义样式实现2
<template><h2>表格修改样式利用属性修改</h2><h3>row-style 行样式</h3><h3>row-style header-row-style 不能改背景色</h3><h3>cell-style header-cell-style能改背景色</h3><el-tableref"tableRef":dat…...

Mysql中的RR 隔离级别,到底有没有解决幻读问题
Mysql 中的 RR 事务隔离级别,在特定的情况下会出现幻读的问题。所谓的幻读,表示在同一个事务中的两次相同条件的查询得到的数据条数不一样。 在 RR 级别下,什么情况下会出现幻读 这样一种情况,在事务 1 里面通过 update 语句触发当…...

Visual Studio 2022下载安装的详细步骤-----C语言编辑器
目录 一、介绍 (一)和其他软件的区别 (二)介绍编写C语言的编辑器类型 二、下载安装 三、创建与运行第一个C语言程序 (一)创建项目 (二)新建文件 (三)…...

数据可视化与GraphQL:利用Apollo创建仪表盘
前言 「作者主页」:雪碧有白泡泡 「个人网站」:雪碧的个人网站 「推荐专栏」: ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄,vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄ÿ…...
Java中静态常量和枚举类的区别
在项目中我们有时候会使用常量、静态常量以及枚举,那么他们有什么区别呢?我们先看几个例子: 若依框架中使用的常量: /** 正常状态 */public static final String NORMAL "0";/** 异常状态 */public static final Stri…...
GenericWriteAheadSink每次checkpoint后事务是否必须成功
背景 GenericWriteAheadSink原理是把接收记录按照检查点进行分段,每个到来的记录都放到对应的分段中,这些分段内的记录是作为算子状态的形式存储和故障恢复的,对于每个分段内的记录列表,flink会在收到检查点完成的通知时把他们都…...

[深入浅出AutoSAR] SWC 设计与应用
依AutoSAR及经验辛苦整理,原创保护,禁止转载。 专栏 《深入浅出AutoSAR》 全文 3100 字, 包含 1. SWC 概念 2. 数据类型(Datatype) 3. 端口(Port) 4. 端口接口(Portinterface&…...

【Ubuntu系统搭建STM32开发环境(国内镜像全程快速配置)】
源于本人失败的经历苦心研究 虚拟机安装ubuntu换源VScode安装安装Java环境安装cubemx安装 arm-Linux-gcc安装gdb server安装OpenOCD 虚拟机安装ubuntu 系统镜像可以在阿里云镜像站且下载速度很快。 选择安装的版本。 我选择的是:ubuntu-22.10-desktop-amd64.iso。…...

Java 中的 Default 关键字
default 关键字:是在 Java 8 中引入的新概念,也可称为 Virtual extension methods——虚拟扩展方法与public、private等都属于修饰符关键字,与其它两个关键字不同之处在于default关键字大部分都用于修饰接口。 default 修饰方法时只能在接口…...

AdaBoost:增强机器学习的力量
一、介绍 机器学习已成为现代技术的基石,为从推荐系统到自动驾驶汽车的一切提供动力。在众多机器学习算法中,AdaBoost(自适应增强的缩写)作为一种强大的集成方法脱颖而出,为该领域的成功做出了重大贡献。AdaBoost 是一…...

c++踩坑点,类型转换
std::string转换到PVOID std::string转换到PVOID的方式如下 这样的话成功转换 “const char *” 类型的实参与 “WCHAR *” “const char *” 类型的实参与 “WCHAR *” 类型的形参不兼容 可以看到这种报错,可以直接强转如下: 但是在我们这里不适…...

mysql—面试50题—1
注:面试50题将分为5个部分,每部分10题 一、查询数据 学生表 Student create table Student(SId varchar(10),Sname varchar(10),Sage datetime,Ssex varchar(10)); insert into Student values(01 , 赵雷 , 1990-01-01 , 男); insert into Student …...
vue解决报错Unable to preventDefault inside passive event listener invocation.
"Unable to preventDefault inside passive event listener invocation"是浏览器开发中的一个警告信息。这个警告通常出现在使用passive事件监听器时,当在事件处理函数中调用preventDefault()方法时会引发该警告。 在传统的事件监听模型中,当…...

实际项目中最常用的设计模式
在软件开发领域,设计模式是一种经过验证的通用解决方案,用于解决各种常见问题。它们有助于提高代码的可维护性、可扩展性和可重用性。虽然有许多不同的设计模式,但以下是实际项目中最常用的一些: 1. 单例模式 (Singleton Pattern) 单例模式确保一个类只有一个实例,并提供…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...

ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...
CSS设置元素的宽度根据其内容自动调整
width: fit-content 是 CSS 中的一个属性值,用于设置元素的宽度根据其内容自动调整,确保宽度刚好容纳内容而不会超出。 效果对比 默认情况(width: auto): 块级元素(如 <div>)会占满父容器…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)
前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 …...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...

Unity中的transform.up
2025年6月8日,周日下午 在Unity中,transform.up是Transform组件的一个属性,表示游戏对象在世界空间中的“上”方向(Y轴正方向),且会随对象旋转动态变化。以下是关键点解析: 基本定义 transfor…...

Python训练营-Day26-函数专题1:函数定义与参数
题目1:计算圆的面积 任务: 编写一个名为 calculate_circle_area 的函数,该函数接收圆的半径 radius 作为参数,并返回圆的面积。圆的面积 π * radius (可以使用 math.pi 作为 π 的值)要求:函数接收一个位置参数 radi…...

基于stm32F10x 系列微控制器的智能电子琴(附完整项目源码、详细接线及讲解视频)
注:文章末尾网盘链接中自取成品使用演示视频、项目源码、项目文档 所用硬件:STM32F103C8T6、无源蜂鸣器、44矩阵键盘、flash存储模块、OLED显示屏、RGB三色灯、面包板、杜邦线、usb转ttl串口 stm32f103c8t6 面包板 …...