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
- Dao
- 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语法的对比
小结
本人也是第一次写这种文件导出,记录一下方便以后回顾,如果对你们有启发,能帮助到你们那最好啦!!!
最后,有什么问题可以留言,私信我。