<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.3</version>
</dependency>
package com.dream.controller.file;
import com.deepoove.poi.XWPFTemplate;
import com.dream.common.BussinessException;
import com.dream.common.Result;
import com.dream.domain.vo.AnwserVo;
import com.dream.domain.vo.PageVo;
import com.dream.domain.vo.QuestionVo;
import com.dream.domain.vo.Student;
import com.dream.service.admin.QuestionnaireAdminService;
import com.dream.service.admin.UserMangeAdminService;
import com.dream.utils.Utils;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import freemarker.template.Configuration;
import freemarker.template.Template;
import org.apache.commons.io.FilenameUtils;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.xssf.streaming.SXSSFSheet;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.*;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
@RestController
@RequestMapping("file")
public class FileUploadController {
@Autowired
private UserMangeAdminService userMangeAdminService;
/**
* 导出所有账号数据
* @return
*/
@GetMapping("/exportLargeData")
public void exportLargeData(HttpServletResponse response) throws IOException {
// 设置响应头(新增编码处理)
String fileName = URLEncoder.encode("所有账号数据.xlsx", StandardCharsets.UTF_8.toString());
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setHeader("Content-Disposition",
"attachment; filename=\"" + fileName + "\"; filename*=UTF-8''" + fileName);
try (SXSSFWorkbook workbook = new SXSSFWorkbook(100);
OutputStream out = response.getOutputStream()) {
Sheet sheet = workbook.createSheet("用户数据");
// 创建表头
Row headerRow = sheet.createRow(0);
String[] headers = {"ID", "账号", "openid", "创建时间", "上次登录时间", "登录方式"};
for (int i = 0; i < headers.length; i++) {
headerRow.createCell(i).setCellValue(headers[i]);
}
int pageSize = 5000;
int rowNum = 1; // 数据从第二行开始
for (int page = 1; ; page++) {
List<Map> pageData = userMangeAdminService.queryUserInfoPage(page, pageSize);
if (pageData.isEmpty()) break;
for (Map rowData : pageData) {
Row row = sheet.createRow(rowNum++);
// 按表字段顺序填充数据
setCellValue(row, 0, rowData.get("id"));
setCellValue(row, 1, rowData.get("account"));
Object object = rowData.get("openid");
if(object == null){
setCellValue(row, 2, rowData.get(""));
}else {
setCellValue(row, 2, rowData.get("openid"));
}
setCellValue(row, 3, rowData.get("createTime"));
setCellValue(row, 4, rowData.get("lastTime"));
// 性别转换(1男/0女)
Integer loginType = (Integer) rowData.getOrDefault("loginType", 1);
setCellValue(row, 5, loginType == 1 ? "账号" : "微信");
}
// 每处理5页清理一次内存
if (page % 5 == 0) {
((SXSSFSheet) sheet).flushRows(pageSize);
}
}
workbook.write(out);
}
}
// 通用单元格赋值方法
private void setCellValue(Row row, int columnIndex, Object value) {
Cell cell = row.createCell(columnIndex);
if (value == null) {
cell.setCellValue("");
} else if (value instanceof Number) {
cell.setCellValue(((Number) value).doubleValue());
} else {
cell.setCellValue(value.toString());
}
}
}
/**
* 分页查询所有账号信息 service
* @param
* @param pageSize
* @return
*/
@Override
public List<Map> queryUserInfoPage(int pageNum, int pageSize) {
// 创建分页对象(第1页,每页10条)
Page<Map> page = new Page<>(pageNum, pageSize);
// 执行分页查询(自动注入分页参数)
IPage<Map> resultPage = userMangeAdminMapper.queryUserInfoPage(page);
// 获取结果
List<Map> records = resultPage.getRecords();// 当前页数据
return records;
}
/**
* 分页查询所有账号信息 mapper
* @param
* @param
* @return
*/
IPage<Map> queryUserInfoPage(Page<Map> page);
<?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.dream.mapper.admin.UserMangeAdminMapper">
<select id="queryUserInfoPage" resultType="java.util.Map">
select id,
account,
openid,
DATE_FORMAT(create_time, '%Y-%m-%d %H:%i:%s') AS createTime,
DATE_FORMAT(last_time, '%Y-%m-%d %H:%i:%s') AS lastTime,
login_type as loginType
from module_user_total
</select>
</mapper>