您的位置:首页 > 数据库 > Mongodb

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

2019-06-14 15:01 851 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/qq_40913912/article/details/91961021

MongoDB数据导出为Excel文件

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

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

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

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

    Key Value
    “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语法的对比

    小结

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

    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: 
    相关文章推荐