使用SpringBoot+MongoDB数据导出为Excel文件

MongoDB数据导出为Excel文件

注:
本文使用的是POI导出文件

导出数据两种创建工作簿的方式

//  创建工作簿
XSSFWorkbook wb = new XSSFWorkbook();          // 最多只能创建 16384列
HSSFWorkbook workbook = new HSSFWorkbook();   // 最多只能创建 256列
 XSSFWorkbook wb = null;  //.xlsx
 HSSFWorkbook wh = null;  //.xls

XSSFCellStyle 设置导出Excel的格式

https://blog.csdn.net/liyang19951112/article/details/81814747

设置格式部分核心代格式代码

链接: HSSFCellStyle.

设置表格格式

下面我们写一个完整的查询MongoDB数据导出Excel的java代码

  • Gradle配置信息
  • 创建MongoDB数据表
  • entity
    • Dao
      • DaoImpl
    • ExcelUserService
      • ExcelUserServiceImpl
  • ExcelOutController

加入导出数据的包

注:这个是Gradle的导包代码 Maven的可以去Maven官方搜索 org.apache.poi

https://mvnrepository.com/

 //导出文件 这里使用的是3.15版本的,如果下载更高版本 有些方法会提示不建议使用
    compile group: 'org.apache.poi', name: 'poi', version: '3.15-beta1'
    compile group: 'org.apache.poi', name: 'poi-ooxml', version: '3.15-beta1'

创建一个要导出数据的mongoDB

KeyValue
“userId”“VxC01”,
“phone”“12545125412”
“name”“苏大强”
“_class”“com.yst.june.entity.User”
“wxName”“天线宝宝”
//创建MongeDB的User表
  "userId" : "VxC01",
  "phone" : "12545125412",
  "name" : "苏大强",
  "wxName" : "天线宝宝"
  "_class" : "com..entity.User", //这个为映射java的entity类

User --实体类

  //User实体类
 public class User {
    private String userId;

    private String phone;

    private String name;

    private String wxName;

    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId= userId;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }


    public String getWxName() {
        return wxName;
    }

    public void setWxName(String wxName) {
        this.wxName = wxName;
    }
}

UserAo

写这个Ao是为了多表查询的时候可以用到,把自己需要返回的字段都放在一起。。。

  //UserAo
 public class User {
    private String userId;

    private String phone;

    private String name;

    private String wxName;

    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId= userId;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }


    public String getWxName() {
        return wxName;
    }

    public void setWxName(String wxName) {
        this.wxName = wxName;
    }
}

UserDao --Dao接口

  //Dao接口
 public interface UserDao {
      List<User> FindUsers();//查找所有数据
 }

UserDaoImpl --Dao实现层

  //Dao实现层
  @Repository
 public Class UserDao implements UserDaoImpl{
 //注入MongoTemplate 
    @Autowired
    MongoTemplate mongoTemplate;

    @Autowired
    UserDao userDao;

    //查询用户信息
    @Override
    public List<User> selectUsers() {
        Query query = new Query();

        return mongoTemplate.find(query, User.class, CollCons.LLB_USER);//查询信息
    }
 }

ExcelUserService --Service接口

public interface ExcelUserService {
    //查询用户信息
    List<User> selectUsers();
 }

ExcelUserServiceImpl --数据导出ServiceImpl

@Service
public class ExcelUserServiceImpl implements ExcelUserService {
    @Autowired
    ExcelUserDao excelUserDao;

    @Autowired
    MongoTemplate mongoTemplate;


    //User用户
    @Override
    public List<User> selectUsers() {
        List<User> userList = excelUserDao.selectUsers();
        return userList;
    }
 }

ExcelOutController --Controller控制层

导出数据较大,所以采用:
XSSFWorkbook wb = new XSSFWorkbook();

//这里只是导入了要用到的关键包  映射的service ,entity 我都没导入
import org.apache.poi.xssf.usermodel.*;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.List;
/**
 * 〈一句话功能简述〉<br>
 * 〈数据库导出ExcelController〉
 *
 * @author Mr.Wang
 * @create 2019/6/5
 * @since 1.0.0
 */
@Controller
@ResponseBody
@RequestMapping(value = "/export")
public class ExcelOutController {
 @Autowired
    ExcelUserService excelUserService;

    /**
     * @Description: 导出数据库里的数据
     * @Param: 设置导出格式(或许有用.......)
     * @Warning: Excel的导出路径就在D://daochu/这个路径下user.xls表格
     * @Author: Mr.Wang
     * @Date: 2019/6/6
     */
  @RequestMapping(value = "/list")
    @ResponseBody
    public void export(HttpServletResponse response) throws IOException {
     List<User> users = excelUserService.selectUsers();//查询用户信息
        XSSFRow row = null;//声明一个空列

        //获取一个工作簿
        XSSFWorkbook wb = new XSSFWorkbook();// 最多只能创建    16384列
        //HSSFWorkbook workbook = new HSSFWorkbook();    // 最多只能创建 256列
        
        //新建一个表格
        XSSFSheet sheet = wb.createSheet("用户表");//生成一个
        
        //如果需要一个Excel里有多个分表  就像这样继续wb.createSheet 
        XSSFSheet sheet1 = wb.createSheet("第二个用户");//生成第二个
        
        sheet.setDefaultColumnWidth((short) 15);//列宽
        
         /**
         *设置表格抬头  如果不需要可以省略
         */
        row = sheet.createRow(0);//起始坐标
        row.setHeight((short) (18.5 * 20));//设值行高
        row.createCell(0).setCellValue("序号");//为第一个单元格设抬头  这个为自增的id
        row.createCell(1).setCellValue("用户id");//为第一个单元格设抬头  这个为userId
        row.createCell(2).setCellValue("用户名字");//为第二个单元格设抬头
        row.createCell(3).setCellValue("用户手机号");//为第二个单元格设抬头
        row.createCell(4).setCellValue("昵称");//为第四个单元格设抬头
        //获取List<User>根据 size() 循环写入row 里
            for (int i = 0; i < users.size(); i++) {
            row = sheet.createRow(i + 1);
            XSSFCell cell = row.createCell(i + 1);
            
            User user1 = users.get(i);
            // 实例化一个空的Ao进行序号转译后的填充
            UserAo userAo1 = new UserAo();
            BeanUtils.copyProperties(user1, userAo1);
            row.createCell(0).setCellValue(i + 1);
            row.createCell(1).setCellValue(userAo1.getUserId());
            row.createCell(2).setCellValue(userAo1.getName());
            row.createCell(3).setCellValue(userAo1.getPhone());
            row.createCell(4).setCellValue(userAo1.getWxName());
        }
        sheet.setDefaultRowHeight((short) (18.5 * 40));//设置默认行高
        sheet.setDefaultColumnWidth(17);//列宽
        
        //      进行组装生成,并关闭Io操作
        response.setContentType("application/vn.ms-excel;charset=UTF-8");
        OutputStream os = response.getOutputStream();
        //(名称可以自定义filename=*.xls)
        response.setHeader("Content-disposition", "attachment;filename=user.xls");//默认Excel名称
        wb.write(os);
        //路径可自定义
        wb.write(new FileOutputStream(new File("D://DaoChu/user.xls")));//执行成功后在这个路径下寻找User.xls
        os.flush();
        os.close();
   }
 }

同理如果想生成多个子表 使用继续复制写好的然后改变sheet 为sheet1进行追加导出

------------如何运行?

1、第一种 使用接口测试
可以使用测试接口的工具 Insomnia下面为下载链接

链接:https://pan.baidu.com/s/1_vOOy_aKyZFy85QZqG_gnQ
提取码:pzs3
复制这段内容后打开百度网盘手机App,操作更方便哦

2、编写测试类运行
IDEA 生成测试类的快捷键为 Ctrl+Shift+T

import org.junit.Before;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;


import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
/**
 * @Author: Mr.Wang
 * @Description: 测试类使用的是Junit MockMvc测试
 * @Date: Created in 14:21 2019/6/14
 * @Modifind By:
 */
public class ExcelOutControllerTest extends WelApplicationTest {

    private static final Logger log= LoggerFactory.getLogger(BannerControllerTest.class);

    MockMvc mockMvc;

    @Autowired
    public WebApplicationContext webApplicationContext;

    @Before
    public void setUp() throws Exception {
        mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
    }
    
    @Test
    public void export()throws Exception {
        String rsp= mockMvc.perform(post("/export/list")
                .contentType(MediaType.APPLICATION_JSON_UTF8)
                .characterEncoding("UTF-8")
             .content("")).andExpect(status().isOk()).andDo(print()).andReturn().getResponse().getContentAsString();
        log.info("result:{} ", rsp);
    }
}

最后运行的结果

结果

关于本次的一些细节

比如Springboot配置Gradle加MongoDB这个网上一大堆,可以百度一波。

下面附上mongoDB的配置信息:
仅供参考- - -这是没有密码的连接
连接地址/数据库名字
port为端口号

spring:
  data:
    mongodb:
            uri: mongodb://localhost/llb
server:
  port: 8088

备注

照着这样写可以把MongoBD的数据导出为Excel,如果是多表联合查询的话就只需要更改查询为聚合查询
领附上聚合查询链接:

https://blog.csdn.net/qq_31868149/article/details/82912139
Aggregation-聚合查询

https://www.cnblogs.com/powerwu/articles/9192465.html
还有一些简单的模糊 ,条件查询

MongoDB的初学者可以看一下这个基本的查询语法

https://blog.csdn.net/freeking101/article/details/80795412
MongoDB Shell的语法,还有跟MySQL语法的对比

小结

本人也是第一次写这种文件导出,记录一下方便以后回顾,如果对你们有启发,能帮助到你们那最好啦!!!
最后,有什么问题可以留言,私信我。

  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: Spring Boot是一个快速开发框架,可以帮助开发人员快速构建基于Spring的应用程序。而MongoDB是一个流行的NoSQL数据库,具有高性能和可扩展性。使用Spring Boot和MongoDB可以轻松构建高效的Web应用程序,同时还可以利用Spring Boot的自动配置和MongoDB的灵活性来简化开发过程。 ### 回答2: Spring Boot是一个开源的Java开发框架,它简化了基于Java的应用程序的开发和配置。它提供了一个快速的开发环境,将开发人员从复杂的配置任务中解放出来,使开发更加高效。Spring Boot通过自动配置来简化应用程序的配置,允许开发人员专注于业务逻辑的实现。 MongoDB是一个流行的开源文档数据库,它使用JSON样式的文档来存储数据MongoDB具有高度可扩展性和灵活性,并且能够在大型的分布式系统中处理大量的数据。它也可以很好地支持面向对象的数据模型,提供了强大的查询和分析工具。 使用Spring Boot与MongoDB结合,可以更轻松地开发和管理基于MongoDB的应用程序。Spring Boot提供了与MongoDB集成所需的自动配置,包括连接MongoDB服务器、创建和管理数据库、执行CRUD操作等。开发人员只需要通过几行简单的配置和注解,就能够快速地构建出一个可用的基于MongoDB的应用程序。 此外,Spring Boot还提供了一些方便的功能和工具,使得与MongoDB的交互更加方便。例如,它提供了Spring Data MongoDB模块,该模块为开发人员提供了更高级的数据库访问抽象,使得使用MongoDB更加简单和灵活。同时,Spring Boot还支持使用MongoTemplate和MongoRepository等工具来进行数据库操作,使开发人员可以更轻松地进行数据操作和查询。 综上所述,Spring Boot与MongoDB结合使用,能够大大简化基于MongoDB的应用程序的开发和管理工作,提高开发效率。它提供了简单而强大的工具和自动配置,使开发人员可以更加专注于业务逻辑的实现,而无需花费过多时间和精力在繁琐的配置工作上。 ### 回答3: Spring Boot是一个用于创建基于Java的独立、生产级别的Spring应用程序的框架。它简化了Spring应用程序的配置和部署过程,并提供了一种快速开发和构建可伸缩应用程序的方式。 MongoDB是一个开源的文档数据库,它以JSON样式的文档存储数据,而不是传统的关系型数据库表结构。它具有高度可伸缩性、高性能和灵活的数据建模能力。 Spring Boot集成了对MongoDB的支持,使得开发人员可以简单快速地将MongoDB集成到Spring应用程序中。它提供了MongoDB驱动程序的自动配置,并为我们处理了与数据库的连接、集合操作、事务等方面的繁琐工作。 使用Spring Boot和MongoDB可以实现以下几个方面的好处: 1. 快速开发:Spring Boot提供了自动配置功能,减少了配置和部署的复杂性,使得开发人员可以更加专注于业务逻辑的实现。 2. 高度可伸缩性:MongoDB的分布式架构使得它可以轻松地扩展,适应不同规模和复杂度的应用需求。 3. 灵活的数据建模:MongoDB的文档存储方式使得数据建模更加灵活,可以根据应用程序的需求自由设计文档结构。 4. 高性能:MongoDB采用了内存映射存储引擎,使得数据的读写速度更快,并且支持水平扩展,保证了高并发下的稳定性和性能。 总之,Spring Boot和MongoDB的结合使得开发人员能够快速构建可伸缩和高性能的应用程序,并且通过灵活的数据建模能力满足不同的业务需求。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值