Java 实现前端数据的导出操作

news2024/11/25 10:13:12

前端

<el-button class="export" type="primary" icon="el-icon-download" @click="exportData()">导出</el-button>


    exportData() {
        //data 操作data 变成后端需要的格式
        let data = {
            capacityVos: resultVo
          }
        this.$confirm("是否确认导出曲线信息?", "警告", {
        confirmButtonText: "确定",
        cancelButtonText: "取消",
        type: "warning",
      }).then(response => {
        exportExcelData(data).then(res => {
          if (res.code == 200) {
            this.jnpf.downloadFile(res.data.url)  
          }
        })
      })
    }

前端跳后端

// 导出
export function exportExcelData(data) {
  return request({
    url: define.api + '/user/export',
    method: 'post',
    data:data,
  });
}

模板excel

后端接口

    //xAxixAndData 导出的数据
    @ApiOperation("导出Excel")
    @PostMapping("/export")
    public ActionResult export(@RequestBody XAxixAndData xAxixAndData){
        Map<String, Object> map = new HashMap<>();
        List<Map<String, Object>> vos = hisCapacityService.getByOne(xAxixAndData);
        List<Map<String,String>> names = hisCapacityService.getDataName(xAxixAndData);
        map.put("data", vos);
        map.put("names", names);

        //1.获取导出模板地址Curve
        ClassPathResource classPathResource = new ClassPathResource("static/CurveModel.xlsx");
        String path = classPathResource.getPath();
        TemplateExportParams templateExportParams = new TemplateExportParams(path);
        // 2.执行excel导出
        Workbook workbook = ExcelExportUtil.exportExcel(templateExportParams, map);
        //3.获取到第0个sheet
        Sheet sheet = workbook.getSheetAt(0);
        //4.创建标题行 数据有几列--标题合并居中有几列
        List<Map<String,String>> names1 = (List) map.get("names");
        int num = names1.size();
        Row titleRow = sheet.createRow(0);
        Cell titleCell = titleRow.createCell(0);
        if(ObjectUtil.isNotNull(xAxixAndData.getVos())){
            //风电
            titleCell.setCellValue("风电出力曲线");
        }else if(ObjectUtil.isNotNull(xAxixAndData.getCapacityVos())){
            //光伏
            titleCell.setCellValue("光伏出力曲线");
        }else if(ObjectUtil.isNotNull(xAxixAndData.getCurveVos())){
            //曲线目录
            titleCell.setCellValue(xAxixAndData.getCurveVos().get(0).getName());
        }
        CellRangeAddress range = new CellRangeAddress(
                0, // first row (0-based)
                0, // last row
                0, // first column (0-based)
                num  // last column
        );
        sheet.addMergedRegion(range);
        Font font = workbook.createFont();
        Font font2 = workbook.createFont();
        font.setFontHeightInPoints((short) 14); // 设置字体大小
        font.setBold(true); // 设置加粗
        font2.setBold(true);
        CellStyle style = workbook.createCellStyle();
        CellStyle style2 = workbook.createCellStyle();
        style.setAlignment(HorizontalAlignment.CENTER);// 设置单元格格式为居中
        style2.setAlignment(HorizontalAlignment.CENTER);
        style.setFont(font);
        style2.setFont(font2);
        titleCell.setCellStyle(style);
        //5.创建列名所在的行
        Row columnRow = sheet.createRow(1);
        Cell columnRowCell = columnRow.createCell(0);
        columnRowCell.setCellValue("时刻");
        columnRowCell.setCellStyle(style2);
        for (int i = 1; i <= names1.size(); i++) {
            Cell columnRowCell1 = columnRow.createCell(i);
            columnRowCell1.setCellValue(names1.get(i-1).get("name"));
            columnRowCell1.setCellStyle(style2);
        }

        //6.循环row设置行高自适应
        for(int i = 0;i <= sheet.getLastRowNum();i ++){
            XSSFRow xssfRow = (XSSFRow) sheet.getRow(i);
            CTRow ctRow = xssfRow.getCTRow();
            ctRow.setCustomHeight(false);
        }
        //7.设置列宽
        List<Map<String, Object>> data = (List) map.get("data");
        for (int i = 1; i < data.size(); i++) {
            sheet.setColumnWidth(i,10 * 256);
        }
        //8.重命名第0个sheet名称
        workbook.setSheetName(0, "曲线数据");
        DownloadVO vo = this.creatModelExcel(fileApi.getPath(FileTypeEnum.TEMPORARY), userInfo, workbook);
        return ActionResult.success(vo);
    }

后端--导出表格

    /***
     * 导出表格
     * @Author lixi
     * @date 2023-09-14
     * @return jnpf.base.vo.DownloadVO
     **/
    public DownloadVO creatModelExcel(String path, UserInfo userInfo, Workbook workbook) {
        DownloadVO vo = DownloadVO.builder().build();
        String sheetName =  "名字";
        ExportParams exportParams = new ExportParams(null, sheetName);
        exportParams.setType(ExcelType.XSSF);
        try {
            String name = sheetName + ".xlsx";
            @Cleanup ByteArrayOutputStream output = new ByteArrayOutputStream();
            workbook.write(output);
            byte[] barray = output.toByteArray();
            //将Excel文件二进制转为inputstream对象
            @Cleanup InputStream ins = new ByteArrayInputStream(barray);
            //上传文件
            GetStrategy.getInstance(fileCoreProperties.getDefaultPlatform()).uploadFile(path.toLowerCase(), FileTypeEnum.TEMPORARY, name, ins);
            vo.setName(name);
            vo.setUrl(UploaderUtil.uploaderFile(userInfo.getId() + "#" + name + "#" + "Temporary"));
        } catch (Exception e) {
            log.error("信息导出Excel错误:{}", e);
        }
        return vo;
    }

前端将导出的结果显示在网页上

 exportExcelData(data).then(res => {
          if (res.code == 200) {
//调用this.jnpf.downloadFile方法即可
            this.jnpf.downloadFile(res.data.url)  
          }
 })

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

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

相关文章

28 drf-Vue个人向总结-1

文章目录 前后端分离开发展示项目项补充知识开发问题浏览器解决跨域问题 drf 小tips设置资源root目录使用自定义的user表设置资源路径media数据库补充删除表中数据单页面与多页面模式过滤多层自关联后端提交的数据到底是什么jwt token登录设置普通的 token 原理使用流程解析 jw…

二十,镜面IBL--打印BRDF积分贴图

比起以往&#xff0c;这节应该是最轻松的了&#xff0c; 运行结果如下 代码如下&#xff1a; #include <osg/TextureCubeMap> #include <osg/TexGen> #include <osg/TexEnvCombine> #include <osgUtil/ReflectionMapGenerator> #include <osgDB/Re…

git之merge和rebase的区别

准备 创建仓库 test-01文件 test-02文件 创建test01分支和test02分支 这里我们使用idea打开源代码 test02分支同操作 大致操作 test01分支对文件test01文件操作&#xff1a; 1.添加内容&#xff1a;test01第一次修改1 2.git commit 3.添加内容&#xff1a; test01第二次…

Arduino驱动DFPlayer Mini MP3模块

文章目录 Mini MP3模块简介产品参数引脚定义实验准备程序下载实物接线总结 Mini MP3模块 简介 DFPlayer Mini是一款小巧且价格低廉的MP3模块&#xff0c;可以直接接驳扬声器。模块配合供电电池、扬声器、按键可以单独使用&#xff0c;也可以通过串口控制&#xff0c;作为Ardui…

7.1 为什么要用函数

主要内容&#xff1a; 这段文字主要讲述了为什么要使用函数来进行程序设计&#xff0c;以及函数在程序设计中的重要性和作用。以下是这段文字的主要内容和要点&#xff1a; ### 1. **简化和清晰度** - 当程序规模较大&#xff0c;功能较多时&#xff0c;如果所有代码都写在主…

颜色+情感的英语表达还有这些,零基础学英语口语去哪里,柯桥有推荐的吗?

当我们探讨关于"blue"&#xff08;蓝色&#xff09;的多义性时&#xff0c;我们会发现英语中有许多其他词汇也有类似的双关意义。 既可以表示一种颜色或物理属性&#xff0c;又可以代表一种情感或心理状态。 这种现象在语言中很常见&#xff0c;反映了语言的丰富性和…

网址静态码手机制作教程,附图文详解!

网址的静态码是如何生成的呢&#xff1f;静态码是二维码的一种常用类型&#xff0c;一般常见的静态码类型主要是文本或者网址&#xff0c;那么在电脑制作静态码的方法相信很多小伙伴都知道怎么做&#xff0c;那么手机上制作的方法&#xff0c;大家感兴趣吗&#xff1f;下面来给…

百度主动推送不能用了,百度自动推送代码送给大家

从9月初&#xff0c;百度就开始大规模的删除网站&#xff0c;绝对大部分站长的大部分网站都失去了百度主动推送的资格&#xff0c;那么还有其他的方法推送给百度吗&#xff1f; 答案是有的&#xff0c;那就是百度自动推送。我们先来了解一下百度主动推送和百度自动推送的相关知…

【计算机网络笔记十】计算机网络面试问题总结

1. 计算机网络的各层协议及作用&#xff1f; 计算机网络体系可以大致分为一下三种&#xff0c;OSI 七层模型、TCP/IP 四层模型和五层模型。 OSI 七层模型&#xff1a;大而全&#xff0c;但是比较复杂、而且是先有了理论模型&#xff0c;没有实际应用。TCP/IP 四层模型&#x…

Fireboom on Sealos:半小时搞定一个月的接口工作

后端日常开发工作中有 88% 的接口都是 CURD&#xff0c;占用了超过 6 成开发时间。这些工作枯燥乏味&#xff0c;且价值低下&#xff0c;不仅荒废了时间&#xff0c;还无法获得任何成就感。而 Fireboom 可在 2 分钟内&#xff0c;完成传统模式下 2 天才能完成的接口&#xff0c…

实战项目:VB结合数据库实现-登录注册增删改查刷新

文章目录: 一&#xff1a;效果演示 二&#xff1a;实现思路 三&#xff1a;代码实现 form1 效果图 代码 form2 效果图 代码 form3 效果图 代码 一&#xff1a;效果演示 效果图◕‿◕✌✌✌ VB结合数据库实现-登录注册增删改查刷新 代码下载 数据库建表 外接程序—…

CISSP学习笔记:安全模型的原则、设计和功能

第八章 安全模型的原则、设计和功能 8.1 使用安全设计原则实施和管理工程过程 项目开发的早起阶段考虑安全是非常重要的 8.1.1 客体和主体 主体&#xff1a;请求访问资源的用户或进程客体&#xff1a;用户或进程想要的访问信任传递&#xff1a;A信任B并且B信任C&#xff0c…

用Python实现ROS节点(编写简单的消息发布器和订阅器)

用Python实现ROS节点(编写简单的消息发布器和订阅器) 圆圈是节点、中间的chatter是话题 可以用rosrun运行&#xff0c;也可以用python3 直接运行

leetcodetop100(29) K 个一组翻转链表

K 个一组翻转链表 给你链表的头节点 head &#xff0c;每 k 个节点一组进行翻转&#xff0c;请你返回修改后的链表。 k 是一个正整数&#xff0c;它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍&#xff0c;那么请将最后剩余的节点保持原有顺序。 你不能只是单纯的改…

什么样的人适合学习网络安全?你在其中吗?

有很多想要转行网络安全或者选择网络安全专业的人在进行决定之前一定会有的问题&#xff1a;什么样的人适合学习网络安全&#xff1f;我适不适合学习网络安全&#xff1f; 会产生这样的疑惑并不奇怪&#xff0c;毕竟网络安全这个专业在2017年才调整为国家一级学科&#xff0c;…

施耐德电气:勾勒未来工业愿景,赋能中国市场

9月19日&#xff0c;第23届中国国际工业博览会&#xff08;简称“工博会”&#xff09;在上海隆重召开。作为全球能源管理和自动化领域的数字化转型专家&#xff0c;施耐德电气在工博会现场全方位展现了自身对未来工业的全新视野与深刻见解&#xff0c;不仅展示了其贯通企业设计…

中药材商城小程序的作用是什么

古往今来中药材的作用非常大&#xff0c;无论中医院还是相关药材作坊都会有大量人购买&#xff0c;随着互联网电商拓展更多商品类目&#xff0c;中药材也可以通过线上销售&#xff0c;让消费者随时购买到所需商品&#xff0c;商家也能获得更多生意。 那么通过【雨科】平台搭建中…

二、2023.9.28.C++基础endC++内存end.2

文章目录 17、说说new和malloc的区别&#xff0c;各自底层实现原理。18、 说说const和define的区别。19、 说说C中函数指针和指针函数的区别&#xff1f;20、 说说const int *a, int const *a, const int a, int *const a, const int *const a分别是什么&#xff0c;有什么特点…

标题:探寻电大搜题,广东开放大学的智慧之旅

随着信息技术的快速发展和互联网的普及&#xff0c;越来越多的人开始选择通过电大学习。作为知名的广东开放大学&#xff0c;一直致力于提供高质量的教育资源&#xff0c;让更多人实现自己的梦想。在这个过程中&#xff0c;电大搜题微信公众号成为了学生们的得力助手&#xff0…

iTOP-RK3588开发板rknn_multiple_input_demo 体验

这个实例是展示同时输入多个(input1.bin 和 input2.bin)同时输入进行推理识别的例子。按照 3.2 章节设置 ndk 和编译即可&#xff0c;这里只给出编译和运行结果&#xff0c;如下图所示&#xff1a; 编译完成之后如下图所示&#xff1a; 编译完成之后&#xff0c;通 adb 命令在开…