0
点赞
收藏
分享

微信扫一扫

[简易实现]Java+Maven实现数据导出为Excel表格(弹窗下载)

small_Sun 2022-04-13 阅读 66
javaexcel

在这里插入图片描述

第一步:Maven导入Excel poi依赖
没有maven可以自行下载poi包导入

       <!--导入excel依赖包poi-->
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi-ooxml</artifactId>
			<version>3.10-FINAL</version>
		</dependency>

第二步:创建ExcelExport工具类
关于Excel表格的格式可以自己搜索HSSFSheet等格式参数,自行设置

import org.apache.poi.hssf.usermodel.*;
import sun.misc.BASE64Encoder;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.net.URLEncoder;
import java.util.List;
import java.util.Map;

/**
 * 工具类:将数据导出为excel表
 */
public class ExcelUtil {

    /**
     * @param sheetName 工作表的名字
     * @param column  列名
     * @param data  需要导出的数据    ( map的键定义为列的名字 一定要和column中的列明保持一致  )
     * @param response
     */

    public static void exportExcel(String sheetName, List<String> column, List<Map<String,Object>> data, HttpServletRequest request, HttpServletResponse response){
        //创建工作薄
        HSSFWorkbook hssfWorkbook = new HSSFWorkbook();
        //创建sheet
        HSSFSheet sheet = hssfWorkbook.createSheet(sheetName);
        //创建一个居中格式
        HSSFCellStyle style = hssfWorkbook.createCellStyle();
        style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        //创建表头,设置表头居中,单元格宽度自适应,在此基础上把宽度调至1.5倍
        HSSFRow headRow = sheet.createRow(0);
        HSSFCell cell = null;
        for (int i = 0; i < column.size(); i++){
            cell = headRow.createCell(i);
            cell.setCellValue(column.get(i));
            cell.setCellStyle(style);
            sheet.autoSizeColumn(i, true);
            //调整列的宽度
            sheet.setColumnWidth(i, sheet.getColumnWidth(i) * 30 / 10);
        }
        //添加单元格数据
        for (int i = 0; i < data.size(); i++) {
            HSSFRow dataRow = sheet.createRow(sheet.getLastRowNum() + 1);
            for (int x = 0; x < column.size(); x++) {
                dataRow.createCell(x).setCellValue(data.get(i).get(column.get(x))==null?"":data.get(i).get(column.get(x)).toString());
            }
        }

        response.setContentType("application/vnd.ms-excel");

        try {
            //获取浏览器名称
            String agent=request.getHeader("user-agent");
            String filename=sheetName+".xls";
            //不同浏览器需要对文件名做特殊处理
            if (agent.contains("Firefox")) { // 火狐浏览器
                filename = "=?UTF-8?B?"
                        + new BASE64Encoder().encode(filename.getBytes("utf-8"))
                        + "?=";
                filename = filename.replaceAll("\r\n", "");
            } else { // IE及其他浏览器
                filename = URLEncoder.encode(filename, "utf-8");
                filename = filename.replace("+"," ");
            }
            //推送浏览器,弹出下载提示
            response.setHeader("Content-Disposition","attachment;filename="+filename);
            hssfWorkbook.write(response.getOutputStream());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

第三步:测试
使用的是SpringBoot,通过@ResponseBody传到前端,弹出下载界面

@Controller
public class ExcelController {
    @Autowired
    private UserMapper userMapper;

    @RequestMapping("/user/download")
    @ResponseBody
    public void export(HttpServletRequest request, HttpServletResponse response) {

        //查询数据库中需要导出的数据
        List<User> userList = userMapper.selectList(null);

        //创建excel表头
        List<String> column = new ArrayList<>();
        column.add("序号");
        column.add("姓名");
        column.add("年龄");
        column.add("邮箱");

        //表头对应的数据
        List<Map<String, Object>> data = new ArrayList<>();

        //遍历获取到的需要导出的数据,k要和表头一样
        for (int i = 0; i < userList.size(); i++) {
            Map<String, Object> dataMap = new HashMap<>();
            User user = userList.get(i);
            dataMap.put("序号", user.getId());
            dataMap.put("姓名", user.getName());
            dataMap.put("年龄", user.getAge());
            dataMap.put("邮箱", user.getEmail());

            data.add(dataMap);
        }

        //调用导出工具类
        ExcelUtil.exportExcel("工作人员表", column, data, request, response);
    }

}

发送 localhost:8080/user/download请求后,自动就会弹出下方的下载窗口
(不会使用SpringBoot的会可以自行创建函数来测试使用)
在这里插入图片描述

举报

相关推荐

0 条评论