将数据赋值到Excel里并下载

        <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>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值