SpringBoot 导出数据生成excel文件返回方式

一、基于框架

1.IDE

IntelliJ IDEA

2.软件环境

Spring boot

mysql

mybatis

org.apache.poi

二、环境集成

1.创建spring boot项目工程

略过

2.maven引入poi

<!--数据导出依赖 excel-->
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
<dependency>
 <groupId>org.apache.poi</groupId>
 <artifactId>poi</artifactId>
 <version>3.17</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
<dependency>
 <groupId>org.apache.poi</groupId>
 <artifactId>poi-ooxml</artifactId>
 <version>3.17</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml-schemas -->
<dependency>
 <groupId>org.apache.poi</groupId>
 <artifactId>poi-ooxml-schemas</artifactId>
 <version>3.17</version>
</dependency>
<!--数据导出依赖 End excel-->

三、代码实现

此处以导出云端mysql数据中的用户表为例(数据为虚假数据)

1.配置xls表格表头

此处我创建一个class(ColumnTitleMap)来维护需要导出的mysql表和xls表头显示的关系

代码注释已经清晰明了,就不再赘述

/**
 * @desc:数据导出,生成excel文件时的列名称集合
 * @author: chao
 * @time: 2018.6.11
 */
public class ColumnTitleMap {
 private Map<String, String> columnTitleMap = new HashMap<String, String>();
 private ArrayList<String> titleKeyList = new ArrayList<String> ();

 public ColumnTitleMap(String datatype) {
  switch (datatype) {
   case "userinfo":
    initUserInfoColu();
    initUserInfoTitleKeyList();
    break;
   default:
    break;
  }

 }
 /**
  * mysql用户表需要导出字段--显示名称对应集合
  */
 private void initUserInfoColu() {
  columnTitleMap.put("id", "ID");
  columnTitleMap.put("date_create", "注册时间");
  columnTitleMap.put("name", "名称");
  columnTitleMap.put("mobile", "手机号");
  columnTitleMap.put("email", "邮箱");
  columnTitleMap.put("pw", "密码");
  columnTitleMap.put("notice_voice", "语音通知开关");
  columnTitleMap.put("notice_email", "邮箱通知开关");
  columnTitleMap.put("notice_sms", "短信通知开关");
  columnTitleMap.put("notice_push", "应用通知开关");
 }

 /**
  * mysql用户表需要导出字段集
  */
 private void initUserInfoTitleKeyList() {
  titleKeyList.add("id");
  titleKeyList.add("date_create");
  titleKeyList.add("name");
  titleKeyList.add("mobile");
  titleKeyList.add("email");
  titleKeyList.add("pw");
  titleKeyList.add("notice_voice");
  titleKeyList.add("notice_email");
  titleKeyList.add("notice_sms");
  titleKeyList.add("notice_push");
 }

 public Map<String, String> getColumnTitleMap() {
  return columnTitleMap;
 }

 public ArrayList<String> getTitleKeyList() {
  return titleKeyList;
 }
}

2.controller

提供对外接口,ExportDataController.java

package com.mcrazy.apios.controller;

import com.mcrazy.apios.service.ExportDataService;
import com.mcrazy.apios.service.UserInfoService;
import com.mcrazy.apios.util.datebase.columntitle.ColumnTitleMap;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * @desc:数据导出api控制器
 * @author: chao
 * @time: 2018.6.11
 */

@Controller
@RequestMapping(value = "/exportdata")
public class ExportDataController {
 @Autowired
 UserInfoService userInfoService;
 @Autowired
 ExportDataService exportDataService;

 /**
  * @api: /apios/exportdata/excel/
  * @method: GET
  * @desc: 导出数据,生成xlsx文件
  * @param response 返回对象
  * @param date_start 筛选时间,开始(预留,查询时并未做筛选数据处理)
  * @param date_end 筛选时间,结束(预留,查询时并未做筛选数据处理)
  */
 @GetMapping(value = "/excel")
 public void getUserInfoEx(
   HttpServletResponse response,
   @RequestParam String date_start,
   @RequestParam String date_end
 ) {
  try {
   List<Map<String,Object>> userList = userInfoService.queryUserInfoResultListMap();
   ArrayList<String> titleKeyList= new ColumnTitleMap("userinfo").getTitleKeyList();
   Map<String, String> titleMap = new ColumnTitleMap("userinfo").getColumnTitleMap();
   exportDataService.exportDataToEx(response, titleKeyList, titleMap, userList);
  } catch (Exception e) {
   //
   System.out.println(e.toString());
  }
 }
}


3.service

(1).用户表数据

UserInfoMapper.java

package com.mcrazy.apios.mapper;

import com.mcrazy.apios.model.UserInfo;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;
import java.util.Map;

@Mapper
public interface UserInfoMapper {
 /**
  * @desc 查询所有用户信息
  * @return 返回多个用户List
  * */
 List<Map<String,Object>> queryUserInfoResultListMap();
}

UserInfoMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.mcrazy.apios.mapper.UserInfoMapper">
 <select id="queryUserInfoResultListMap" resultType="HashMap">
  select * from user_info
 </select>
</mapper>

UserInfoService.java

package com.mcrazy.apios.service;

import com.mcrazy.apios.mapper.UserInfoMapper;
import com.mcrazy.apios.model.UserInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;

@Service
public class UserInfoService {
 @Autowired
 UserInfoMapper userInfoMapper;

 /**
  * @desc 查询所有用户信息
  * @return 返回多个用户List
  * */
 public List<Map<String,Object>> queryUserInfoResultListMap() {
  List<Map<String,Object>> list = userInfoMapper.queryUserInfoResultListMap();
  return list;
 }
}

(2). 生成excel文件和导出

ExportDataService.java

package com.mcrazy.apios.service;

import com.mcrazy.apios.util.datebase.ExportExcelUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * @desc:数据导出服务
 * @author: chao
 * @time: 2018.6.11
 */
@Service
public class ExportDataService {
 @Autowired
 ExportExcelUtil exportExcelUtil;

 /*导出用户数据表*/
 public void exportDataToEx(HttpServletResponse response, ArrayList<String> titleKeyList, Map<String, String> titleMap, List<Map<String,Object>> src_list) {
  try {
   exportExcelUtil.expoerDataExcel(response, titleKeyList, titleMap, src_list);
  } catch (Exception e) {
   System.out.println("Exception: " + e.toString());
  }
 }
}

导出工具封装,ExportExcelUtil.java

package com.mcrazy.apios.util.datebase;

import com.mcrazy.apios.util.object.DateUtils;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.springframework.stereotype.Service;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * @desc:数据导出,生成excel文件
 * @author: chao
 * @time: 2018.6.12
 */
@Service
public class ExportExcelUtil {

 public void expoerDataExcel(HttpServletResponse response, ArrayList<String> titleKeyList, Map<String, String> titleMap, List<Map<String,Object>> src_list) throws IOException {

  String xlsFile_name = DateUtils.currtimeToString14() + ".xlsx";  //输出xls文件名称
  //内存中只创建100个对象
  Workbook wb = new SXSSFWorkbook(100);   //关键语句
  Sheet sheet = null;  //工作表对象
  Row nRow = null;  //行对象
  Cell nCell = null;  //列对象

  int rowNo = 0;  //总行号
  int pageRowNo = 0; //页行号

  for (int k=0;k<src_list.size();k++) {
   Map<String,Object> srcMap = src_list.get(k);
   //写入300000条后切换到下个工作表
   if(rowNo%300000==0){
    wb.createSheet("工作簿"+(rowNo/300000));//创建新的sheet对象
    sheet = wb.getSheetAt(rowNo/300000);  //动态指定当前的工作表
    pageRowNo = 0;  //新建了工作表,重置工作表的行号为0
    // -----------定义表头-----------
    nRow = sheet.createRow(pageRowNo++);
    // 列数 titleKeyList.size()
    for(int i=0;i<titleKeyList.size();i++){
     Cell cell_tem = nRow.createCell(i);
     cell_tem.setCellValue(titleMap.get(titleKeyList.get(i)));
    }
    rowNo++;
    // ---------------------------
   }
   rowNo++;
   nRow = sheet.createRow(pageRowNo++); //新建行对象

   // 行,获取cell值
   for(int j=0;j<titleKeyList.size();j++){
    nCell = nRow.createCell(j);
    if (srcMap.get(titleKeyList.get(j)) != null) {
     nCell.setCellValue(srcMap.get(titleKeyList.get(j)).toString());
    } else {
     nCell.setCellValue("");
    }
   }
  }
  response.setContentType("application/vnd.ms-excel;charset=utf-8");
  response.setHeader("Content-disposition", "attachment;filename=" + xlsFile_name);
  response.flushBuffer();
  OutputStream outputStream = response.getOutputStream();
  wb.write(response.getOutputStream());
  wb.close();
  outputStream.flush();
  outputStream.close();
 }
}

三、运行

至此,所有代码工作已经做完,把程序运行起来,在浏览器调用接口,会自动下载到电脑中

浏览器打开:

http://192.168.1.70:8080/apios/exportdata/excel/?time_start=2018-12-19&end_start=2018-12-19

效果

得到xlsx文件,查看数据

以上这篇SpringBoot 导出数据生成excel文件返回方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • POI通用导出Excel(.xls,.xlsx)的方法

    POI操作EXCEL对象 HSSF:操作Excel 97(.xls)格式 XSSF:操作Excel 2007 OOXML (.xlsx)格式,操作EXCEL内存占用高于HSSF SXSSF:从POI3.8 beta3开始支持,基于XSSF,低内存占用. 使用POI的HSSF对象,生成Excel 97(.xls)格式,生成的EXCEL不经过压缩直接导出. 线上问题:负载服务器转发请求到应用服务器阻塞,以及内存溢出 . 如果系统存在大数据量报表导出,则考虑使用POI的SXSSF进行EXCEL操作.

  • SpringBoot中EasyExcel实现Excel文件的导入导出

    前言 在我们日常的开发过程中经常会使用Excel文件的形式来批量地上传下载系统数据,我们最常用的工具是Apache poi,但是如果数据到底上百万时,将会造成内存溢出的问题,那么我们怎么去实现百万数据批量导入导出. 正文 Easyexcel Easyexcel 是阿里巴巴的开源项目,用来优化Excel文件处理过程: poi消耗内存严重:Java解析.生成Excel比较有名的框架有Apache poi.jxl.但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的

  • Springboot使用POI实现导出Excel文件示例

    前面讲述了使用POI导出Word文件和读取Excel文件,这两个例子都相对简单,接下来要讲述的使用POI导出Excel文件要复杂得多,内容也会比较长. 创建表头信息 表头信息用于自动生成表头结构及排序 public class ExcelHeader implements Comparable<ExcelHeader>{ /** * excel的标题名称 */ private String title; /** * 每一个标题的顺序 */ private int order; /** * 说对

  • SpringBoot 导出数据生成excel文件返回方式

    一.基于框架 1.IDE IntelliJ IDEA 2.软件环境 Spring boot mysql mybatis org.apache.poi 二.环境集成 1.创建spring boot项目工程 略过 2.maven引入poi <!--数据导出依赖 excel--> <!-- https://mvnrepository.com/artifact/org.apache.poi/poi --> <dependency> <groupId>org.apac

  • Python实现导出数据生成excel报表的方法示例

    本文实例讲述了Python实现导出数据生成excel报表的方法.分享给大家供大家参考,具体如下: #_*_coding:utf-8_*_ import MySQLdb import xlwt from datetime import datetime def get_data(sql): # 创建数据库连接. conn = MySQLdb.connect(host='127.0.0.1',user='root'\ ,passwd='123456',db='test',port=3306,char

  • C#导出数据到Excel文件的方法

    本文实例讲述了C#导出数据到Excel文件的方法.分享给大家供大家参考.具体实现方法如下: /// <summary> /// 导出到Excel类,项目需引用Microsodt.Office.Interop.Excel, /// 类文件需using System.Data与System.Windows.Forms命名空间 /// </summary> public class CToExcel { /// <summary> /// 导出到Excel /// </

  • 在django项目中导出数据到excel文件并实现下载的功能

    依赖模块 xlwt下载:pip install xlwt 后台模块 view.py # 导出Excel文件 def export_excel(request): city = request.POST.get('city') print(city) list_obj=place.objects.filter(city=city) # 设置HTTPResponse的类型 response = HttpResponse(content_type='application/vnd.ms-excel')

  • Codeigniter+PHPExcel实现导出数据到Excel文件

    PHPExcel是用来操作OfficeExcel文档的一个PHP类库,它基于微软的OpenXML标准和PHP语言.可以使用它来读取.写入不同格式的电子表格.而Codeigniter是一个功能强大的PHP框架.二者结合就能起到非常棒的效果啦! 1.准备工作下载PHPExcel:http://phpexcel.codeplex.com这是个强大的Excel库,这里只演示导出Excel文件的功能,其中的大部分功能可能都用不着.2.安装PHPExcel到Codeigniter1)解压压缩包里的Class

  • ASP.NET MVC使用EPPlus,导出数据到Excel中

    好久没写博客了,今天特地来更新一下,今天我们要学习的是如何导出数据到Excel文件中,这里我使用的是免费开源的Epplus组件. 源代码下载:https://github.com/caofangsheng93/ExcelExportInMvc 介绍 这篇文章,介绍的是怎样导出数据到Excel文件中,大多数的后端程序都有报表功能:把显示在Grid中的数据导出到Excel文件中,这篇文章中使用的是EPPlus组件. EPPlus是一个基于OOXML[Open Extended Markup Lang

  • C#导出生成excel文件的方法小结(xml,html方式)

    直接贴上代码,里面都有注释 复制代码 代码如下: /// <summary> /// xml格式生成excel文件并存盘;        /// </summary>        /// <param name="page">生成报表的页面,没有传null</param>        /// <param name="dt">数据表</param>        /// <param

  • java导出大批量(百万以上)数据的excel文件

    本文实例为大家分享了java导出百万以上数据的excel文件,供大家参考,具体内容如下 1.传统的导出方式会消耗大量的内存,2003每个sheet页最多65536条数据,2007每个sheet页可以达到100万条数据以上,2007会在生成Workbook时清理数据,所以2007导出量更大; 2.可以导出多个excel文件到某个目录中,然后打包下载; 3.导出excel格式的xml文件,这种方式可以分批导出数据,适用于大批量数据的导出,以下简单介绍这种方式: 代码如下: package com.e

  • C#导出GridView数据到Excel文件类实例

    本文实例讲述了C#导出GridView数据到Excel文件类.分享给大家供大家参考.具体如下: 这段C#代码自定义了一个封装类,用于将GridView数据导出到Excel文件 using System; using System.Web; using System.Web.UI; using System.IO; using System.Web.UI.WebControls; namespace DotNet.Utilities { public class ExportExcel { pro

随机推荐