浏览器导出excel

news/2024/7/21 3:58:01 标签: java, postman, excel

java web项目时,经常遇到需要在页面上点击导出按钮,然后直浏览器接下载下来一个excel文档。

比如一个List<Person>的集合,需要将每个Person当做一行,输出到excel中去。其中Person实体类如下:

java">import lombok.Data;

/**
 * className Person
 * description
 *
 * @author 
 * @version 1.0
 * @date 
 **/
@Data
public class Person {
    /**
     * 姓名
     */
    private String name;
    /**
     * 年龄
     */
    private Integer age;
    /**
     * 性别
     */
    private Integer sex;
    /**
     * 身份证号
     */
    private String certificateNumber;
    /**
     * 手机号
     */
    private String phoneNumber;
}

可以使用 HttpServletResponse 实现浏览器下载,写一个ExcelUtils,如下:

java">import com.test.cn.entity.dto.ExcelData;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.httpclient.util.DateUtil;
import org.apache.poi.hssf.usermodel.HSSFDataFormat;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.xssf.usermodel.*;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedOutputStream;
import java.io.OutputStream;
import java.lang.reflect.Field;
import java.util.List;


/**
 * @ClassName ExcelUtils
 * @Deacription excel工具类
 * @Author wangcaoxiu
 * @Date 2022/5/9 15:41
 * @Version 1.0
 **/
@Component
@Slf4j
public class ExcelUtils {
    /**
     * 方法名:exportExcel
     * 功能:导出Excel
     * 描述:
     * 创建人:typ
     * 创建时间:2018/10/19 16:00
     * 修改人:
     * 修改描述:
     * 修改时间:
     */
    public static void exportExcel(HttpServletResponse response, ExcelData data) {
        //实例化XSSFWorkbook
        XSSFWorkbook workbook = new XSSFWorkbook();
        //创建一个Excel表单,参数为sheet的名字
        XSSFSheet sheet = workbook.createSheet("sheet");
        //设置表头
        setTitle(workbook, sheet, data.getHead());
        //设置单元格并赋值
        setData(sheet, data.getData());
        //设置浏览器下载
        setBrowser(response,workbook, data.getFileName());
    }

    /**
     * 方法名:setTitle
     * 功能:设置表头
     * 描述:
     * 创建人:typ
     * 创建时间:2018/10/19 10:20
     * 修改人:
     * 修改描述:
     * 修改时间:
     */
    private static void setTitle(XSSFWorkbook workbook, XSSFSheet sheet, String[] str) {
        XSSFRow row = sheet.createRow(0);
        //设置列宽,setColumnWidth的第二个参数要乘以256,这个参数的单位是1/256个字符宽度
        for (int i = 0; i <= str.length; i++) {
            sheet.setColumnWidth(i, 15 * 256);
        }
        //设置为居中加粗,格式化时间格式
        XSSFCellStyle style = workbook.createCellStyle();
        XSSFFont font = workbook.createFont();
        font.setBold(true);
        style.setFont(font);
        style.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy h:mm"));
        //创建表头名称
        XSSFCell cell;
        for (int j = 0; j < str.length; j++) {
            cell = row.createCell(j);
            cell.setCellValue(str[j]);
            cell.setCellStyle(style);
        }
    }

    private static void setData(XSSFSheet sheet, List<String[]> data) {
        int rowNum = 1;
        for (int i = 0; i < data.size(); i++) {
            XSSFRow row = sheet.createRow(rowNum);
            for (int j = 0; j < data.get(i).length; j++) {
                row.createCell(j).setCellValue(data.get(i)[j]);
            }
            rowNum++;
        }
    }

    /**
     * 方法名:setBrowser
     * 功能:使用浏览器下载
     * 描述:
     * 创建人:typ
     * 创建时间:2018/10/19 16:20
     * 修改人:
     * 修改描述:
     * 修改时间:
     */
    private static void setBrowser(HttpServletResponse response,XSSFWorkbook workbook, String fileName) {
        try {
            //清空response
            response.reset();
            response.setContentType("application/octet-stream");
            response.setHeader("Content-Disposition","attachment;filename="+fileName+".xlsx");
            OutputStream os = new BufferedOutputStream(response.getOutputStream());
            response.setContentType("application/x-download");
            response.setCharacterEncoding("utf-8");

            //将excel写入到输出流中
            workbook.write(os);
            os.flush();
            os.close();
        } catch (Exception e) {
            log.error("excel error :{}", e);
        }
    }

}

其中ExcelData的实体类如下:

java">import com.alibaba.fastjson.JSONObject;

import java.util.List;

/**
 * @description excel导出类
 * @className ExcelData
 * @author
 * @date
 **/
public class ExcelData {
    private String fileName;
    private String[] head;
    private List<JSONObject> heads;
    private List<String[]> data;

    public String getFileName() {
        return fileName;
    }

    public void setFileName(String fileName) {
        this.fileName = fileName;
    }

    public String[] getHead() {
        return head;
    }

    public void setHead(String[] head) {
        this.head = head;
    }

    public List<JSONObject> getHeads() {
        return heads;
    }

    public void setHeads(List<JSONObject> heads) {
        this.heads = heads;
    }

    public List<String[]> getData() {
        return data;
    }

    public void setData(List<String[]> data) {
        this.data = data;
    }
}

然后在代码里调用ExcelUtils实现下载:

java">import com.test.cn.entity.dto.ExcelData;
import com.test.cn.entity.dto.Person;
import com.test.cn.util.ExcelUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletResponse;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * className PersonController
 * description
 *
 * @author 
 * @version 1.0
 * @date 
 **/
@Slf4j
@RestController
@RequestMapping("/person")
public class PersonController {

    @PostMapping("/exportExcel")
    public void exportExcel(HttpServletResponse response) {
        try {
            List<String[]> list = new ArrayList<>();
            Person person1 = new Person("张三",23, "男", "111111111111111111","18888888888");
            Person person2 = new Person("李四",34, "男", "111111111111111111","18888888888");
            Person person3 = new Person("王五",28, "男", "111111111111111111","18888888888");

            String[] data1 = new String[]{person1.getName(),person1.getAge().toString(),person1.getSex(),person1.getCertificateNumber(),person1.getPhoneNumber()};
            list.add(data1);

            String[] data2 = new String[]{person2.getName(),person2.getAge().toString(),person2.getSex(),person2.getCertificateNumber(),person2.getPhoneNumber()};
            list.add(data2);

            String[] data3 = new String[]{person3.getName(),person3.getAge().toString(),person3.getSex(),person3.getCertificateNumber(),person3.getPhoneNumber()};
            list.add(data3);

            //构造ExcelData
            ExcelData excelData = new ExcelData();
            excelData.setData(list);
            SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
            String fileName = "人员信息表_" + df.format(new Date());
            excelData.setFileName(URLEncoder.encode(fileName, "UTF-8"));
            String[] head = {"姓名", "年龄", "性别", "身份证号", "手机号"};
            excelData.setHead(head);
            //导出
            ExcelUtils.exportExcel(response, excelData);
            log.info("请求 exportExcel end ......");
        } catch (Exception e) {
            log.error("exportExcel error:", e);
        }
    }
}

postman调用这个接口,即可看下成功下载的excel文件如下:


http://www.niftyadmin.cn/n/5456346.html

相关文章

针对ETC系统的OBE-SAM模块设计方案

ETC系统组成及工作原理 ETC系统由前端系统和后台数据库系统组成&#xff0c;总体的架构如下图所示&#xff1a; 前端系统包含安装在汽车挡风玻璃上的车载单元&#xff08;On Board Unit&#xff0c;简称OBU&#xff09;、路侧单元&#xff08;Roadside Unit&#xff0c;简称RS…

线程安全问题及解决

1.前言 当我们使用多个线程访问同一资源时(可以是同一变量&#xff0c;同一文件&#xff0c;同一条记录)&#xff0c;若多个线程只要只读操作&#xff0c;则不会发生线程安全问题;如果多个线程既有可读又有可写操作时&#xff0c;将可能导致线程安全问题. 2.提出问题 例 : 三个…

波束形成器制导的目标说话人提取

波束形成器制导的目标说话人提取 第二章 目标说话人提取之《BEAMFORMER-GUIDED TARGET SPEAKER EXTRACTION》 文章目录 波束形成器制导的目标说话人提取前言一、任务二、动机三、挑战四、方法1.基于注册语音的SCTSE2.BG-TSE方法3. 后端波束形成4. 损失函数 五、实验评价1.数据…

鸿蒙OS开发实例:【手撸服务卡片】

介绍 服务卡片指导文档位于“开发/应用模型/Stage模型开发指导/Stage模型应用组件”路径下&#xff0c;说明其极其重要。 本篇文章将分享实现服务卡片的过程和代码 准备 请参照[官方指导]&#xff0c;创建一个Demo工程&#xff0c;选择Stage模型 鸿蒙OS开发更多内容↓点击…

WorkPlus AI助理实现私有化AI智能客服,助力企业满足客户需求

私有化AI智能客服的出现&#xff0c;以其卓越的性能和全面的功能&#xff0c;助力企业提升客户服务体验。WorkPlus AI助理作为一款领先的解决方案&#xff0c;可实现企业的私有化AI智能客服&#xff0c;提升客户服务的质量和效率。 私有化AI智能客服的价值和意义不言而喻。通过…

个人常用Java加密算法

对称加密算法&#xff08;Symmetric Encryption&#xff09;&#xff1a; 常用于数据加密 AES&#xff08;Advanced Encryption Standard&#xff09;&#xff1a;是一种对称加密算法&#xff0c;广泛应用于数据加密和保护领域。DES&#xff08;Data Encryption Standard&…

libVLC 捕获鼠标、键盘事件

在实现播放器的时候&#xff0c;我们需要捕获键盘、鼠标事件进行视频快进、快退&#xff0c;或者双击全屏/退出全屏窗口、鼠标右键弹出菜单栏。默认情况下&#xff0c;在使用libVLC库的时候&#xff0c;我们无法捕获这些事件&#xff0c;因为我们将Qt的视频窗口传递给了libVLC。…

2024-03-28 Java8之Stream流常用方法

Stream流对象常用操作 文章目录 Stream流对象常用操作1.Stream对象创建2.中间操作&#xff08;返回值为流对象&#xff09;3.终值操作1.收集&#xff08;collect&#xff09;2.判断元素&#xff08;anyMatch、allMatch、noneMatch&#xff09;3.获取元素&#xff08;findFirst、…