Springboot实现前后端分离excel下载

目录
  • Springboot前后端分离excel下载
  • 前后端分离Excle下载乱码问题
    • 前端请求方式 : ajax请求

Springboot前后端分离excel下载

现在公司的技术栈是springboot作为后端,前端是vue, 现在要做excel的导出功能, 之前没做过,写一下记录下.

springboot版本是2.0.6 poi 3.14 ,jdk1.8

类上面的注解是: @RestController

/**
     * 导出excel
     *
     */
    @GetMapping("export")
    public void exportExcel() {
        XSSFWorkbook workbook = placeStatService.exportExcel();
        // 设置生成的Excel的文件名,并以中文进行编码
        String fileName = null;
        try {
            fileName = URLEncoder.encode("房间预约使用统计表" + ".xlsx", "utf-8").replaceAll("\\+", "%20");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        response.setCharacterEncoding("UTF-8");
        response.setHeader("Content-type", "application/vnd.ms-excel");
        response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
        // 响应类型,编码
        response.setContentType("application/octet-stream;charset=UTF-8");
        try {
            // 形成输出流
            OutputStream osOut = response.getOutputStream();
            // 将指定的字节写入此输出流
            workbook.write(osOut);
            // 刷新此输出流并强制将所有缓冲的输出字节被写出
            osOut.flush();
            // 关闭流
            osOut.close();
            workbook.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
@Override
    public XSSFWorkbook exportExcel) {
        List<RoomOrderDetailModel> roomOrdersList = getRoomOrderList();
        XSSFWorkbook data = ExcelUtil.setExcelData(roomOrdersList);
        return data;
    }
 
package com.util;
import com.curefun.place.model.RoomOrderDetailModel;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

/**
 * @author excel 工具类. 导出功能
 */
public class ExcelUtil { 

    /**
     * 数据导出, 获取一个excel对象
     *
     * @param
     */
    public static XSSFWorkbook setExcelData(List<RoomOrderDetailModel> orderDetailModels) {
        //创建一个book,对应一个Excel文件
        XSSFWorkbook workbook = new XSSFWorkbook();
        //在book中添加一个sheet,对应Excel文件中的sheet
        XSSFSheet sheet = workbook.createSheet("教室预约使用记录");
        //设置六列的宽度
        sheet.setColumnWidth(0, 4000);
        sheet.setColumnWidth(1, 3000);
        sheet.setColumnWidth(2, 3800);
        sheet.setColumnWidth(3, 2800);
        sheet.setColumnWidth(4, 3200);
        sheet.setColumnWidth(5, 3600);
        sheet.setColumnWidth(6, 2850);

        //居中的样式
        XSSFCellStyle centerStyle = getCenterStyle(workbook);

        // 第三步,在sheet中添加表头第0行
        XSSFRow row0 = sheet.createRow(0);
        setFirstRow(centerStyle, row0);

        int rowNum = 1;
        for (RoomOrderDetailModel model : orderDetailModels) {
            XSSFRow row = sheet.createRow(rowNum);
            row.createCell(0).setCellValue(rowNum);
            rowNum++;
            row.createCell(1).setCellValue(model.getBuildingName());
            row.createCell(2).setCellValue(model.getRoomNo());
            row.createCell(3).setCellValue(model.getRoomName());
            row.createCell(4).setCellValue(model.getEventType());
            row.createCell(5).setCellValue(model.getEventName());
            row.createCell(6).setCellValue(model.getUserRealName());
        }
        return workbook;
    }  

    /**
     * 获取居中的样式.
     *
     * @param workbook
     * @return
     */
    private static XSSFCellStyle getCenterStyle(XSSFWorkbook workbook) {
        XSSFCellStyle cellStyle = workbook.createCellStyle();
        //设置水平对齐的样式为居中对齐;
        cellStyle.setAlignment(HorizontalAlignment.CENTER);
        //垂直居中
        cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
        return cellStyle;
    } 

    /**
     * 设置第一行的表头
     *
     * @param centerStyle
     * @param row
     */
    private static void setFirstRow(XSSFCellStyle centerStyle, XSSFRow row) {
        XSSFCell cell0 = row.createCell(0);
        cell0.setCellValue("序号");
        cell0.setCellStyle(centerStyle);
        XSSFCell cell1 = row.createCell(1);
        cell1.setCellValue("楼栋信息");
        cell1.setCellStyle(centerStyle);
        XSSFCell cell2 = row.createCell(2);
        cell2.setCellValue("房号");
        cell2.setCellStyle(centerStyle);
        XSSFCell cell3 = row.createCell(3);
        cell3.setCellValue("房间名称");
        cell3.setCellStyle(centerStyle);
        XSSFCell cell4 = row.createCell(4);
        cell4.setCellValue("活动类型");
        cell4.setCellStyle(centerStyle);
        XSSFCell cell5 = row.createCell(5);
        cell5.setCellValue("活动名称");
        cell5.setCellStyle(centerStyle);
        XSSFCell cell6 = row.createCell(6);
        cell6.setCellValue("使用人");
        cell6.setCellStyle(centerStyle);
/**
其实完全使用这种方式, 会更加的简单,便于修改
List<String> title = Stream.of("序号", "专业", "班级", "课程名称", "课程内容", "授课教师", "授课时长", "授课时间", "学分", "授课房间")
                .collect(Collectors.toList());
        for (int i = 0; i < title.size(); i++) {
            XSSFCell cell = row.createCell(i);
            cell.setCellValue(title.get(i));
            cell.setCellStyle(centerStyle);
        }
*/
    }
}

其实使用很简单,就是excel的文件名需要进行编码,这个需要注意,其他没啥的了.

前后端分离Excle下载乱码问题

前端:vue+elementUI

后端:springCloud

前端请求方式 : ajax请求

this.$.ajax({
                url :this.url + "/",
                type : 'post',
                data : formData,
                contentType: false,
                processData: false,
                xhrFields: {withCredentials: true, responseType:'arraybuffer'},
                headers : {'Access-Control-Allow-Origin': '*', "Authorization": this.ajaxRequest.getToken()},
                success: function (res, textStatus, request) {
                    var downloadFile = document.createElement('a');
                    let blob = new Blob([res], {type : "application/vnd.ms-excel;charset=UTF-8"});
                    downloadFile.href = window.URL.createObjectURL(blob);
                    console.log(request.getResponseHeader('Content-disposition'));
                    downloadFile.download =
                    decodeURI(request.getResponseHeader('Content-disposition').split('filename=')[1] );
                    downloadFile.click();
                    window.URL.revokeObjectURL(downloadFile.href);
                },
                error : function (res) {
                  console.log(res)
                }
        })

后端处理:导出文件处理

// 输出Excel文件
OutputStream out = null;
out = response.getOutputStream();
response.reset();
response.setCharacterEncoding("UTF-8");
response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF8"));
response.setContentType("application/vnd.ms-excel; charset=utf-8");
// 输出Excel内容,生成Excel文件
wb.write(out);

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • SpringBoot+Vue.js实现前后端分离的文件上传功能

    这篇文章需要一定Vue和SpringBoot的知识,分为两个项目,一个是前端Vue项目,一个是后端SpringBoot项目. 后端项目搭建 我使用的是SpringBoot1.5.10+JDK8+IDEA 使用IDEA新建一个SpringBoot项目,一直点next即可 项目创建成功后,maven的pom配置如下 <dependencies> <dependency> <groupId>org.springframework.boot</groupId> &l

  • spring boot+vue 的前后端分离与合并方案实例详解

    springboot和vue结合的方案网络上的主要有以下两种: 1. [不推荐]在html中直接使用script标签引入vue和一些常用的组件,这种方式和以前传统的开发是一样的,只是可以很爽的使用vue的双向数据绑定,这种方式只适合于普通的全栈开发. 2.[推荐]使用vue官方的脚手架创建单独的前端工程项目,做到和后端完全独立开发和部署,后端单独部署一个纯restful的服务,而前端直接采用nginx来部署,这种称为完全的前后端分离架构开发模式,但是在分离中有很多api权限的问题需要解决,包括部

  • SpringBoot+VUE实现前后端分离的实战记录

    一,前端VUE项目 这里使用VUE UI创建一个VUE项目 命令行输入vue ui进入 手动配置项目 选中这三个 点击下一步->点击创建项目 用IDEA打开刚才创建的项目 IDEA中的安装vue插件并重启 IDEA控制台中输入vue add axios安装axios 新建一个Show.vue 在index,js的routes中配置它的路由 编写Show,vue向后端请求数据并展示 <template> <div> <table> <tr> <td

  • SpringBoot+Vue前后端分离,使用SpringSecurity完美处理权限问题的解决方法

    当前后端分离时,权限问题的处理也和我们传统的处理方式有一点差异.笔者前几天刚好在负责一个项目的权限管理模块,现在权限管理模块已经做完了,我想通过5-6篇文章,来介绍一下项目中遇到的问题以及我的解决方案,希望这个系列能够给小伙伴一些帮助.本系列文章并不是手把手的教程,主要介绍了核心思路并讲解了核心代码,完整的代码小伙伴们可以在GitHub上star并clone下来研究.另外,原本计划把项目跑起来放到网上供小伙伴们查看,但是之前买服务器为了省钱,内存只有512M,两个应用跑不起来(已经有一个V部落开

  • Springboot实现前后端分离excel下载

    目录 Springboot前后端分离excel下载 前后端分离Excle下载乱码问题 前端请求方式 : ajax请求 Springboot前后端分离excel下载 现在公司的技术栈是springboot作为后端,前端是vue, 现在要做excel的导出功能, 之前没做过,写一下记录下. springboot版本是2.0.6 poi 3.14 ,jdk1.8 类上面的注解是: @RestController /** * 导出excel * */ @GetMapping("export")

  • 基于Java SpringBoot的前后端分离信息管理系统的设计和实现

    目录 前言 视频演示 主要功能说明 功能截图 主要代码实现 主要数据表设计 前言 当今社会,随着科学技术的发展,以及市场经济的多元化,使人才的流动速度大大增加,因此也对党建工作的管理层面工作带来了空前且复杂的挑战, 从而使得如何高效的开展管理党建工作成为了亟待解决的问题.为此将高速发展的信息科学技术引入到党建工作管理的应用中,力求合理有效的提升全面各项工作的进展,实现以人为本的科学发展思想和意识,是一种高效可实现的方法. Java作为一种面向对象的.可以撰写跨平台应用软件的程序设计语言,其技术具

  • SpringBoot+Vue前后端分离实现请求api跨域问题

    前言 最近过年在家无聊,刚好有大把时间学习Vue,顺便做了一个增删查改+关键字匹配+分页的小dome,可是使用Vue请求后端提供的Api的时候确发现一个大问题,前后端分离了,但是请求的时候也就必定会有跨域这种问题,那如何解决呢? 前端解决方案 思路:由于Vue现在大多数项目但是用脚手架快速搭建的,所以我们可以直接在项目中创建一个vue.config.js的配置文件,然后在里面配置proxy代理来解决,话不多说,直接上代码 module.exports = { devServer: { proxy

  • SpringBoot Security前后端分离登录验证的实现

    最近一段时间在研究OAuth2的使用,想整个单点登录,从网上找了很多demo都没有实施成功,也许是因为压根就不懂OAuth2的原理导致.有那么几天,越来越没有头绪,又不能放弃,转过头来一想,OAuth2是在Security的基础上扩展的,对于Security自己都是一无所知,干脆就先研究一下Security吧,先把Security搭建起来,找找感觉. 说干就干,在现成的SpringBoot 2.1.4.RELEASE环境下,进行Security的使用. 简单的Security的使用就不说了,目前

  • springboot解决前后端分离时的跨域问题

    随着分布式微服务的兴起,越来越多的公司在开发web项目的时候选择前后端分离的模式开发,前后端分开部署,使得分工更加明确,彻底解放了前端. 我们知道,http请求都是无状态,现在比较流行的都是jwt的形式处理无状态的请求,在请求头上带上认证参数(token等),前后端分离有好处,也有坏处,第一次开发前后端分离项目的人,肯定会遇到前端请求跨域的问题,这个怎么处理呢?在说处理方案前,有必要说明一下为什么会跨域和什么是跨域? 一.为什么会跨域? 出于浏览器的同源策略限制.同源策略(Sameoriginp

  • springboot+VUE前后端分离实现疫情防疫平台JAVA

    目录 主要模块: 系统主要实现如下: 登录之后进入系统首页:目前系统主要功能如下 用户管理模块:用户添加.修改.删除.查询等基本操作 角色管理模块.通过用户绑定角色.角色控制菜单显示.灵活控制菜单. 前端VUE代码添加菜单 菜单添加修改列表层操作 历史行程数据管理:添加修改删除等操作 用户每日健康打卡列表数据展示以及添加打卡信息 员工出行外出报备管理申请 员工复工申请 管理员审核 通知公告模块: 一些设计报告和文档描述参考 数据库连接: 主要模块: 管理员用户登录:用户登录. 用户信息: 用户信

  • springboot+angular4前后端分离 跨域问题解决详解

    springboot中新增一个过滤器如下: package com.rtpksps.kss.config; import org.springframework.stereotype.Component; import javax.servlet.*; import javax.servlet.http.HttpServletResponse; import java.io.IOException; /** * @author Administrator * @title: OriginFilt

  • SpringBoot + Shiro前后端分离权限

    shiro 验证通过后的信息保存在session 中,而ajax 每次传的都是不同的sessionid ,所以主要的区别就是需要修改shiro获取sessionid的方式.这里使用的是登录后将后台的sessionid 传到前端然后存放到 cookie(这个存放的地方视情况而定),然后每次请求后端时在Header中携带此信息,这里起名为Authorization shiro 中 默认获取Sessionid的类是 DefaultWebSessionManager 所以需要重写此类 import or

  • Springboot+Vue+shiro实现前后端分离、权限控制的示例代码

    本文总结自实习中对项目的重构.原先项目采用Springboot+freemarker模版,开发过程中觉得前端逻辑写的实在恶心,后端Controller层还必须返回Freemarker模版的ModelAndView,逐渐有了前后端分离的想法,由于之前,没有接触过,主要参考的还是网上的一些博客教程等,初步完成了前后端分离,在此记录以备查阅. 一.前后端分离思想 前端从后端剥离,形成一个前端工程,前端只利用Json来和后端进行交互,后端不返回页面,只返回Json数据.前后端之间完全通过public A

随机推荐