Java使用POI导入Excel文件

Posted IT-老牛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java使用POI导入Excel文件相关的知识,希望对你有一定的参考价值。

1.前言

巩固下工作中使用的方法,进行记录下,使用 Apache POI导入Excel文件,导入的Excel的工具类以及一些业务代码。

2.依赖

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

3.POI导入工具类

package com.risit.spm.construct.utils;
 
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
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.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 
import java.io.IOException;
import java.io.InputStream;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Iterator;
 
/**
 * @author vitor
 * @ClassName
 * @Dascription TODO
 * @date 2021/9/30 14:12
 */
public class ImportExcelUtils 
 
    /**
     * 导入值校验
     *
     * @param sheet     工作表
     * @param row       行
     * @param colNum    列编号
     * @param errorHint 错误提示
     * @return 校验通过返回空,否则抛出异常
     */
    public static void validCellValue(Sheet sheet, Row row, int colNum, String errorHint) 
        if ("".equals(getCellValue(sheet, row, colNum - 1))) 
            throw new RuntimeException("校验 :第" + (row.getRowNum() + 1) + "行" + colNum + "列" + errorHint + "不能为空");
        
    
 
    /**
     * 从输入流中获取excel工作表
     *
     * @param iStream  输入流
     * @param fileName 带 .xls或.xlsx 后缀的文件名
     * @return 文件名为空返回空;
     * 格式不正确抛出异常;
     * 正常返回excel工作空间对象
     */
    public static Workbook getWorkbookByInputStream(InputStream iStream, String fileName) 
        Workbook workbook = null;
 
        try 
            if (null == fileName) 
                return null;
            
 
            if (fileName.endsWith(".xls")) 
                workbook = new HSSFWorkbook(iStream);
             else if (fileName.endsWith(".xlsx")) 
                workbook = new XSSFWorkbook(iStream);
             else if (fileName.endsWith(".xlsm")) 
                workbook = new XSSFWorkbook(iStream);
             else 
                throw new IOException("The document type don't support");
            
         catch (Exception e) 
            e.printStackTrace();
         finally 
            if (iStream != null) 
                try 
                    iStream.close();
                 catch (IOException e) 
                    e.printStackTrace();
                
            
        
 
        return workbook;
    
 
    /**
     * 从Workbook中获取一个sheet,如果没有就创建一个
     *
     * @param workbook 工作空间
     * @param index    第几个sheet
     * @return 返回sheet
     */
    public static Sheet getSheetByWorkbook(Workbook workbook, int index) 
        Sheet sheet = workbook.getSheetAt(index);
        if (null == sheet) 
            sheet = workbook.createSheet();
        
 
        sheet.setDefaultRowHeightInPoints(20);//行高
        sheet.setDefaultColumnWidth(20);//列宽
 
        return sheet;
    
 
    /**
     * 获取指定sheet指定row中指定column的cell值
     *
     * @param sheet  工作表
     * @param row    行
     * @param column 第几列
     * @return 返回单元格的值或""
     */
    public static String getCellValue(Sheet sheet, Row row, int column) 
        if (sheet == null || row == null) 
            return "";
        
 
        return getCellValue(row.getCell(column));
    
 
    /**
     * 从单元格中获取单元格的值
     *
     * @param cell 单元格
     * @return 返回值或""
     */
    public static String getCellValue(Cell cell) 
        if (cell == null) 
            return "";
        
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
        switch (cell.getCellType()) 
 
            case NUMERIC:
                Number number = cell.getNumericCellValue();
                String numberStr = String.valueOf(number);
                if (HSSFDateUtil.isCellDateFormatted(cell))
                    return sdf.format(cell.getDateCellValue());
                
                if (numberStr.endsWith(".0")) 
                    numberStr = numberStr.replace(".0", "");//取整数
                
                if (numberStr.indexOf("E") >= 0) 
                    numberStr = new DecimalFormat("#").format(number);//取整数
                
                return numberStr;
            case STRING:
                return cell.getStringCellValue().trim();
            case FORMULA://公式
                return "";
            case BLANK:
                return "";
            case BOOLEAN:
                return String.valueOf(cell.getBooleanCellValue());
            default:
                break;
        
 
        return "";
    
 
    /**
     * 判断该行是否为空行
     *
     * @param row 行
     * @return 为空行返回true, 不为空行返回false
     */
    public static boolean isBlankRow(Row row) 
        if (row == null) 
            return true;
        
 
        Iterator<Cell> iter = row.cellIterator();
        while (iter.hasNext()) 
            Cell cell = iter.next();
            if (cell == null) 
                continue;
            
 
            String value = getCellValue(cell);
            if (!isNULLOrBlank(value)) 
                return false;
            
        
 
        return true;
    
 
    /**
     * 判断一个对象是否为空
     *
     * @param obj 对象
     * @return 为空返回true, 不为空返回false
     */
    public static boolean isNULLOrBlank(Object obj) 
        if (obj != null && !"".equals(obj.toString())) 
            return false;
        
        return true;
    

4.具体业务使用

/**
 * 导入Excel文件
 * @param excelFile MultipartFile流文件
 */
public void importExcel(MultipartFile excelFile) 
    int rowNum = 0;//已取值的行数
    int colNum = 0;//列号
    int realRowCount = 0;//真正有数据的行数
    //得到工作空间
    Workbook workbook = null;
    try 
        workbook = ImportExcelUtils.getWorkbookByInputStream(excelFile.getInputStream(), excelFile.getOriginalFilename());
     catch (IOException e) 
        e.printStackTrace();
    
    //得到工作表
    Sheet sheet = ImportExcelUtils.getSheetByWorkbook(workbook, 0);
    //根据需要是否加条数限制
    if (sheet.getRow(1000) != null) 
        throw new RuntimeException("系统已限制单批次导入必须小于或等于1000笔!");
    
    //获取行数
    realRowCount = sheet.getPhysicalNumberOfRows();
    //需要添加的表,Project表实体类
    List<Project> list = new ArrayList<>();
    Project p = new Project();
    //处理表格数据
    for (Row row : sheet) 
        if (realRowCount == rowNum) 
            break;
        
        if (ImportExcelUtils.isBlankRow(row)) //空行跳过
            continue;
        
        if (row.getRowNum() == -1) 
            continue;
         else 
            if (row.getRowNum() == 0) //第一行表头跳过
                continue;
            
        
        rowNum++;
        colNum = 1;
        //验证Excel文件字段,这里根据表格内名称
        ImportExcelUtils.validCellValue(sheet, row, colNum, "名称");
        p.setProjectName(ImportExcelUtils.getCellValue(sheet, row, colNum - 1));
        //列号需要自加获取
        ImportExcelUtils.validCellValue(sheet, row, ++colNum, "地址");
        p.setAddress(ImportExcelUtils.getCellValue(sheet, row, colNum - 1));
 
        //省略重复表格列名数据处理~
 
        list.add(p);
    
    System.out.println("导入的项目数据==========>" + list.get(0));
    //省略添加到数据库表中代码

以上是关于Java使用POI导入Excel文件的主要内容,如果未能解决你的问题,请参考以下文章

java使用POI操作excel文件,实现批量导出,和导入

java使用POI操作excel文件,实现批量导出,和导入

java poi 导入 excel怎么设置单元格格式为 文字

java中使用poi导入导出excel文件_并自定义日期格式

Java 使用poi导入excel,结合xml文件进行数据验证的例子(增加了jar包)

Java中开发POI读取导入Excel文件及验证