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

news2025/1/16 3:50:40

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 {

	@Autowired
	private PmPrjConcentrateArgumentService pmPrjConcentrateArgumentService;


	@Override
	public 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编写替换数据代码

 @Autowired
    private PmTemplateAffixService templateAffixService;
    @Autowired
    protected SuiteExportService exportService;
    @Autowired
    private OfficeService officeService;
    @Value("${base.uploadpath:upload}")
    private String uploadPath;
    @Autowired
    private PmBaseAffixMapper affixMapper;
    @Autowired
    private FundsAnalysisService fundsAnalysisService;



@Override
    public 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-1
            fileName = 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.coloradmin.cn/o/1108125.html

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

相关文章

C#快速排序算法

快速排序实现原理 快速排序&#xff08;Quick Sort&#xff09;是一种常用的排序算法&#xff0c;它基于分治的思想&#xff0c;通过将一个无序的序列分割成两个子序列&#xff0c;并递归地对子序列进行排序&#xff0c;最终完成整个序列的排序。 其基本思路如下&#xff1a; 选…

056:mapboxGL中layer的layout,paint,filter的属性值表达式说明总结

第056个 点击查看专栏目录 本篇文章是mapbox的layer中layout,paint,filter的表达式说明总结。 mapbox中 Expressions 是什么 Expressions:表达式集合(并非 style 的属性,只是 layer 的任何 layout布局属性和 paint绘制属性,以及 filter 属性等,它们的值都可以指定成一…

【NV GPU限制出口】昇腾能否接住滔天富贵

如何评价刘庆峰所言华为GPU已可对标英伟达A100&#xff1f; 国家超级计算济南中心&#xff1a; https://www.nsccjn.cn/

JAVA学习日记1——JAVA简介及第一个java程序

简单记忆 JAVA SE &#xff1a;标准版&#xff0c;核心基础 JAVA EE&#xff1a;企业版&#xff0c;进阶 JDK&#xff1a;Java Development Kit&#xff0c;Java开发工具包&#xff0c;包含JRE JRE&#xff1a;Java Runtime Environment&#xff0c;Java运行时环境&#xff…

Elasticsearch小bug记录:term: XXX was completely eliminated by analyzer

问题&#xff1a; 下面这个报错&#xff0c;是在配置同义词的时候报的错&#xff1a;不能识别南京。 {"error": {"root_cause": [{"type": "illegal_argument_exception","reason": "failed to build synonyms"…

Linux-ssh

文章目录 远程登录服务器配置远程服务器相关信息创建config文件配置config文件 配置密钥登陆先创建密钥配置密钥文件 执行命令scp传文件copy文件copy文件夹配置我们的vim和tmux 远程登录服务器 ssh userhostnameuser:用户名hostname&#xff1a;IP地址或域名 第一次登陆会显示…

Spring MVC(一)【什么是Spring MVC】

重点 Spring&#xff1a;IOC 和 AOP 。 Spring MVC &#xff1a;Spring MVC 的执行流程。 SSM 框架的整合&#xff01; Spring 和 Mybatis 我们不建议使用太多注解&#xff0c;Spring MVC 建议全部使用注解开发&#xff01; 1、MVC 回顾 1.1、什么是MVC MVC是模型(Model)…

音乐播放器VHDL蜂鸣器数码管显示简谱,视频/代码

名称&#xff1a;音乐播放器数码管显示简谱蜂鸣器 软件&#xff1a;Quartus 语言&#xff1a;VHDL 代码功能&#xff1a; 设计音乐播放器&#xff0c;播放一首歌&#xff0c;使用开发板的蜂鸣器播放音乐&#xff0c;使用Quartus内的ROM IP核存储音乐文件&#xff0c;使用数…

编程语言常识

看图区别编程语言 什么是强类型、弱类型语言&#xff1f;哪种更好&#xff1f; 强类型语言 强类型语言是一种强制类型定义的语言&#xff0c;即一旦某一个变量被定义类型&#xff0c;如果不经强制转换&#xff0c;那么它永远就是该数据类型。 在强类型语言中&#xff0c;变量的…

Linux考试复习整理

文章目录 Linux考试整理一.选择题1.用户的密码现象放置在哪个文件夹&#xff1f;2.删除文件或目录的命令是&#xff1f;3.显示一个文件最后几行的命令是&#xff1f;4.删除一个用户并同时删除用户的主目录5.Linux配置文件一般放在什么目录&#xff1f;6.某文件的组外成员的权限…

CUDA编程入门系列(七) GPU内存如何管理

一、内存使用 1.CUDA程序会使用GPU内存与CPU内存 2.CPU内存的分配与释放是标准的,例如new和delete,malloc与free 3.GPU上内存涉及分配和释放使用CUDA提供的库函数实现 4.CUDA/GPU内存与CPU内存的互相传输 这里主要讲全局内存与共享内存的管理 二、CPU内存 栈:有编译器自动分配释…

哪些行业需要做等保?

等保适用于各种行业&#xff0c;尤其是对于涉及国家安全、金融、电信、能源、交通、医疗等重点领域的机构和企业更为重要。以下是一些常见的需要进行等保的行业&#xff1a; 政府部门和政府机构&#xff1a;各级政府部门、公安、国防等机构需要对信息系统进行等级保护测评和认证…

嵌入式养成计划-43----QT QMainWindow中常用类的使用--ui界面文件--资源文件的添加--信号与槽

一百零九、QMainWindow中常用类的使用 109.1 菜单栏 QMenuBar 菜单栏 QMenuBar 最多只能有一个 109.2 工具栏 QToolBar 工具栏 QToolBar 可以有多个 109.3 状态栏QStatusBar 状态栏 QStatusBar 最多只能有一个 109.4 浮动窗口QDockWidget 浮动窗口 可以有多个 109.5 代…

医疗图像分割实践NNUnet-V2 基于window10+3090配置。官方数据Task_02

Window10 配置NNUnet完成官方任务分割 NNUnet论文介绍 nnUnet是一个针对医学图像分割提出得一个即开即用的框架&#xff0c;用户只需要按照官方给出的数据要求进行格式转换便可以进行快速的医学图像分割的训练和推演。其更新的V2版本代码变得更加易读和方便使用&#xff0c;并…

GitLab使用webhook触发Jenkins自动构建

1、jenkins安装gitlab插件 在插件管理中&#xff0c;搜索gitlab安装这个插件。 2、job中配置webhook地址和密钥 进入job设置&#xff0c;构建触发器中就可以看到gitlab的webhook配置&#xff0c;复制URL地址和随机令牌至gitlab中 勾选后&#xff0c;就可以展开设置&#xff…

Go语言入门心法(十):Go语言操作MYSQL(CRUD)

Go语言入门心法(一): 基础语法 Go语言入门心法(二): 结构体 Go语言入门心法(三): 接口 Go语言入门心法(四): 异常体系 Go语言入门心法(五): 函数 Go语言入门心法(六): HTTP面向客户端|服务端编程 Go语言入门心法(八): mysql驱动安装报错onnection failed Go语言入门心法(…

黑白棋(Othello, ACM/ICPC World Finals 1992, UVa220)rust解法

你的任务是模拟黑白棋游戏的进程。黑白棋的规则为&#xff1a;黑白双方轮流放棋子&#xff0c;每次必须让新放的棋子“夹住”至少一枚对方棋子&#xff0c;然后把所有被新放棋子“夹住”的对方棋子替换成己方棋子。一段连续&#xff08;横、竖或者斜向&#xff09;的同色棋子被…

【黑马程序员】MySQL学习记录二(SQL)案例

案例1&#xff08;数据类型、DDL、DML、DQL&#xff09; 根据需求创建表&#xff08;设计合理的数据类型、长度&#xff09; 1、设计一张员工信息表&#xff0c;要求如下 create table emp( id INT COMMENT 编号, workno VARCHAR(10) COMMENT 员工工号, name VARCHAR(10) COM…

企业工厂车间台式电脑经常有静电导致开不开机,如何彻底解决?

环境: HP 480G7 Win10 专业版 问题描述: 企业工厂车间台式电脑经常有静电导致开不开机,如何彻底解决? 开机电源指示灯闪,显示器黑屏没有画面开不了机,一般是把主机电源断了,把主机盖打开 把内存条拔了之后长按开机按键10秒以上然后插上内存条开机正常 相对与有些岗…

智慧应急三维电子沙盘系统

1 概述 深圳易图讯科技有限公司&#xff08;www.3dgis.top&#xff09;采用大数据、云计算、虚拟现实、物联网、AI等先进技术为支撑&#xff0c;以6博硕团队为核心&#xff0c;研发了智慧应急三维电子沙盘系统&#xff0c;成功案例100。该系统支持高清卫星影像、DEM高程数据、…