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文件_并自定义日期格式