Java基于POI实现Excel的导入导出功能【utils封装】

news/2024/7/21 4:51:41 标签: poi, excel, java, 导入, 导出

文章优先发表在个人公众号:https://www.xdx97.com/article/747444695356932096

一、代码

1-1、导入依赖

<dependency>
      <groupId>org.apache.poi</groupId>
      <artifactId>poi-ooxml-schemas</artifactId>
      <version>4.0.0</version>
  </dependency>
  <dependency>
      <groupId>org.apache.poi</groupId>
      <artifactId>poi-ooxml</artifactId>
      <version>4.0.0</version>
  </dependency>
  <dependency>
      <groupId>org.apache.poi</groupId>
      <artifactId>poi</artifactId>
      <version>4.0.0</version>
  </dependency>

1-2、ExcelUtils

java">import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


/**
 * Excel导入导出
 *
 * @author 小道仙
 * @date 2020年8月22日
 */
public class ExcelUtils {

    /**
     * Excel 导出
     * @param response  HttpServletResponse
     * @param header 表头
     * @param keys map的key值
     * @param content 内容数据
     * @param title 表格名字
     * @param sheetName sheet名
     */
    public static void exportExcel(HttpServletResponse response, String[] header,String[] keys, List<Map<String, Object>> content,String title,String sheetName) throws Exception{
        title = title + ".xlsx";
        Workbook wb = new SXSSFWorkbook(1000);
        Sheet sheet = wb.createSheet(sheetName);
        Row row = sheet.createRow( 0);
        // 行高
        row.setHeight((short) 700);
        // 列宽
        for (int i = 0; i < header.length; i++) {
            sheet.setColumnWidth(i, 20 * 256);
        }
        for (int i = 0; i < header.length; i++) {
            Cell cell = row.createCell(i);
            cell.setCellValue(header[i]);
            cell.setCellStyle(HeaderStyle(wb));
        }
        for (int i = 0; i < content.size(); i++) {
            Map<String, Object> map = content.get(i);
            row = sheet.createRow((int) i + 1);
            row.setHeight((short) 500);
            for (int j = 0; j < keys.length; j++){
                Cell cell = row.createCell(j);
                cell.setCellValue(map.get(keys[j]) == null ? "" : map.get(keys[j]).toString());
                cell.setCellStyle(contentStyle(wb));
            }
        }
//        if (request.getHeader("User-Agent").toLowerCase().indexOf("firefox") > 0) {
//            title = new String(title.getBytes("UTF-8"), "ISO8859-1"); // firefox浏览器
//        } else if (request.getHeader("User-Agent").toUpperCase().indexOf("MSIE") > 0) {
//            title = URLEncoder.encode(title, "UTF-8");// IE浏览器
//        } else if (request.getHeader("User-Agent").toUpperCase().indexOf("CHROME") > 0) {
//            title = new String(title.getBytes("UTF-8"), "ISO8859-1");// 谷歌
//        }
        title = new String(title.getBytes("UTF-8"), "ISO8859-1");
        response.reset();
        response.setContentType("application/octet-stream; charset=utf-8");
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Content-Disposition", "attachment; filename=" + title);
        wb.write(response.getOutputStream());
        response.getOutputStream().close();
    }

    /**
     * Excel 导入
     * @param file 文件
     * @param keys 数据顺序
     */
    public static  List<Map<String, Object>>  importExcel(MultipartFile file,String[] keys) throws Exception{
        Workbook wb = null;
        String fileName = file.getOriginalFilename();
        if (fileName.endsWith("xls")) {
            POIFSFileSystem pois = new POIFSFileSystem(file.getInputStream());
            wb = new HSSFWorkbook(pois);
        } else if (fileName.endsWith("xlsx")) {
            wb = new XSSFWorkbook(file.getInputStream());
        }
        Sheet sheet = wb.getSheetAt(0);
        int rowCount = sheet.getPhysicalNumberOfRows();
        if (sheet.getRow( 1).getPhysicalNumberOfCells() != keys.length){
            throw new RuntimeException("导入的Excel和模板的列不匹配");
        }
        List<Map<String,Object>> result = new ArrayList<>();
        for (int i = 0; i < rowCount - 1; i++) {
            Row row = sheet.getRow(i + 1);
            Map<String,Object> tmp = new HashMap<>();
            for (int j = 0;j < keys.length; j++){
                Cell cell = row.getCell(j);
                // 把类型转行Spring
//                cell.setCellType(CellType.STRING);
                tmp.put(keys[j], cell.getStringCellValue());
            }
            result.add(tmp);
        }
        return result;
    }

    /**
     * 表头样式
     */
    private static CellStyle HeaderStyle(Workbook wb){
        Font font = wb.createFont();
        font.setFontName("宋体");
        font.setFontHeightInPoints((short) 11);
        CellStyle cellStyle = commonStyle(wb);
        cellStyle.setFont(font);
        return cellStyle;
    }

    /**
     * 内容样式
     */
    private static CellStyle contentStyle(Workbook wb){
        Font font = wb.createFont();
        font.setFontName("宋体");
        font.setFontHeightInPoints((short) 10);
        CellStyle cellStyle = commonStyle(wb);
        cellStyle.setFont(font);
        return cellStyle;
    }

    /**
     * 公共样式
     */
    private static CellStyle commonStyle(Workbook wb){
        CellStyle style = wb.createCellStyle();
        style.setAlignment(HorizontalAlignment.CENTER);
        style.setVerticalAlignment(VerticalAlignment.CENTER);
        style.setBorderBottom(BorderStyle.THIN);
        style.setBorderLeft(BorderStyle.THIN);
        style.setBorderTop(BorderStyle.THIN);
        style.setBorderRight(BorderStyle.THIN);
        style.setWrapText(true);// 自动换行
        return style;
    }
}

二、测试

直接用导出的Excel去测试就好了

java">import com.xdx97.test.utils.ExcelUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@RestController
public class TestController {

    private String[] excelHeader = { "姓名", "年纪" };

    private String[] excelHeaderKey = { "name", "age" };


    @GetMapping("/xdx/excelExport")
    public void excelExport(HttpServletResponse response) throws Exception{

        List<Map<String,Object>> list = new ArrayList<>();
        Map<String,Object> tmp = new HashMap<>();
        tmp.put("name","张三");
        tmp.put("age","18");
        list.add(tmp);

        Map<String,Object> tmp1 = new HashMap<>();
        tmp1.put("name","李四");
        tmp1.put("age","20");
        list.add(tmp1);

        ExcelUtils.exportExcel(response, excelHeader, excelHeaderKey,list,"统计表格","表1");
    }

    @PostMapping("/xdx/import")
    public void excelImport(MultipartFile file)throws Exception{
        List<Map<String, Object>> list = ExcelUtils.importExcel(file,excelHeaderKey);
        for (Map<String, Object> item : list){
            for (String key : item.keySet()){
                System.out.print(item.get(key) + "  ");
            }
            System.out.println();
        }
    }

}

视频讲解地址

https://www.bilibili.com/video/BV1kf4y1i761?p=5


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

相关文章

Maven本地安装jar包

一、首先你得安装了Maven环境&#xff0c;直接cmd输入 mvn -v 查看 二、安装命令 2-1、命令分析 mvn install:install-file -Dfilexxxx jar包地址 -DgroupIdxxxx maven gruopId -DartifactIdxxxx maven artifactId -Dversion2.0 maven version -Dpacka…

SpringBoot开启事务、手动事务

文章优先发布在个人博客上面哦 https://www.xdx97.com/article/754707243290591232 一、Transactional 1-1、使用 我们只需要在类或者方法上面加上 Transactional 注解&#xff0c;即可开启事务。 1-2、Transactional的属性 属性名说明name当在配置文件中有多个 Transaction…

移动MAS发送短信,接受状态和接受回复【HTTP】

移动MAS短信平台就是一个发送短信的平台&#xff0c;可以发送普通短信、模板短信、一对一&#xff0c;一对多等短信 下面主要是基于Java&#xff08;HTTP方式&#xff09;实现短信的下行&#xff08;发送&#xff09;上行&#xff08;接受&#xff09;和接受短信状态 接口全是…

从GitLab拉取代码(不同分支拉取)

一、安装git https://blog.csdn.net/Tomwildboar/article/details/82312646 二、配置SSH https://blog.csdn.net/Tomwildboar/article/details/82313476 三、拉取代码 1、创建一个空文件夹&#xff0c;然后进去右键选择git bash输入下面的代码 git clone xxxxxxxxxx 来自下…

SpringBoot定时任务,@Async多线程异步执行

一、使用SpringBoot实现定时任务 这个不是重点&#xff0c;就简单的实现一下&#xff0c;至于cron表达式怎么写也不是重点&#xff0c;自行百度即可。 1-1、基于 Scheduled 注解的方式 import org.springframework.scheduling.annotation.EnableScheduling; import org.spring…

Sql一对多关联最新的一条数据

我们有如下表结构&#xff0c;一个是用户表&#xff0c;一个是记录表&#xff0c;一个用户会有多条记录&#xff0c;现在我们需要去查询出来每个用户的信息和最新的操作记录&#xff08;这里以id值最大为最新的&#xff09; CREATE TABLE record (id int(11) NOT NULL,u_id int…

SpringBoot搭建文件服务器

1、代码实现 FileUtils package com.xdx97.frame.common.utils;import org.springframework.web.multipart.MultipartFile;import javax.servlet.http.HttpServletResponse; import java.io.*; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLC…

SpringBoot日志框架之使用logback作为日志框架

一、前言 1-1、slf4j log4j logback 的区别 可以理解成slf4j相当于List&#xff0c;而log4j相当于arrayList&#xff0c;logback相当于linkedList。也就是slf4j是一个日志接口&#xff0c;具体日志实现交给其它的框架。 1-2、为什么要使用logback来实现日志呢 log4j和logbac…