一 :简介
开发中经常会设计到excel的处理,如导出Excel,导入Excel到数据库中,操作Excel目前有两个框架,一个是apache 的poi, 另一个是 Java Excel
Apache POI 简介是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office(Excel、WORD、PowerPoint、Visio等)格式档案读和写的功能。POI为“Poor Obfuscation Implementation”的首字母缩写,意为“可怜的模糊实现”。
官方主页: http://poi.apache.org/index.html
API文档: http://poi.apache.org/apidocs/index.html
Java Excel是一开放源码项目,通过它Java开发人员可以读取Excel文件的内容、创建新的Excel文件、更新已经存在的Excel文件。jxl 由于其小巧 易用的特点, 逐渐已经取代了 POI-excel的地位, 成为了越来越多的java开发人员生成excel文件的首选。
本篇博客简单演示一下apache poi 读取excel数据。
1.添加依赖
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.17</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.17</version>
</dependency>
2.编写一个工具类,可以直接复制
package com.test1;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import static org.apache.poi.ss.usermodel.Row.MissingCellPolicy.RETURN_BLANK_AS_NULL;
@Slf4j
public class ExcelUtils {
// private static final Logger log = LoggerFactory.getLogger(ExcelUtils.class);
//文件路径
private String filePath;
//整个excel对象
private XSSFWorkbook excelWBook;
//sheet工作表对象
private XSSFSheet excelWSheet;
//行对象
private XSSFRow Row;
//单元格
private XSSFCell Cell;
//读文件IO
FileInputStream inputStream;
public void openFile(String file){
try {
//读取文件
this.filePath = file;
this.inputStream = new FileInputStream(this.filePath);
this.excelWBook = new XSSFWorkbook(inputStream);
} catch (Exception e) {
e.printStackTrace();
}
}
public void closeFile() throws Exception {
this.excelWBook.close();
this.inputStream.close();
}
public Object[][] getAllData(String sheetName) throws Exception {
//获取工作簿
this.excelWSheet = this.excelWBook.getSheet(sheetName);
// 总行数
int rowCount = this.excelWSheet.getLastRowNum() - this.excelWSheet.getFirstRowNum() + 1;
// 总列数
int colCount = this.excelWSheet.getRow(0).getPhysicalNumberOfCells();
//开始与结束的行号、列号
int startRow = 0;
int endRow = rowCount - 1;
int startCol = 0;
int endCol = colCount - 1;
//读取
List<Object[]> records = new ArrayList<Object[]>();
for (int i = startRow; i <= endRow; i++) {
String[] row = new String[endCol - startCol + 1];
for (int j = startCol; j <= endCol; j++) {
row[j] = getCellData(sheetName, i, j);
}
records.add(row);
}
//将List转换为二维数组
Object[][] results = new Object[records.size()][];
for (int i = 0; i < records.size(); i++) {
results[i] = records.get(i);
}
if (!(results.length > 0)) {
log.error("数据参数文件读取为空,无法执行测试,请检查");
throw new RuntimeException("dataprovider data is empty");
}
return results;
}
/**
*
*
* 读取单元格数据
* @param sheetName 工作簿名称
* @param RowNum 行号
* @param ColNum 列号
*/
public String getCellData(String sheetName, int RowNum, int ColNum) throws Exception {
this.excelWSheet = this.excelWBook.getSheet(sheetName);
try {
Cell = this.excelWSheet.getRow(RowNum).getCell(ColNum);
String CellData = "";
if (Cell.getCellType() == XSSFCell.CELL_TYPE_STRING) {
//字符串
CellData = Cell.getStringCellValue();
} else if (Cell.getCellType() == XSSFCell.CELL_TYPE_NUMERIC) {
//数字
short format = Cell.getCellStyle().getDataFormat();
if (HSSFDateUtil.isCellDateFormatted(Cell)) {
//日期
Date d = Cell.getDateCellValue();
DateFormat formater = new SimpleDateFormat("yyyy-MM-dd");
CellData = formater.format(d);
} else if (format == 14 || format == 31 || format == 57 || format == 58) {
// 日期
DateFormat formater = new SimpleDateFormat("yyyy-MM-dd");
Date date = DateUtil.getJavaDate(Cell.getNumericCellValue());
CellData = formater.format(date);
} else if (format == 20 || format == 32) {
// 时间
DateFormat formater = new SimpleDateFormat("HH:mm");
Date date = DateUtil.getJavaDate(Cell.getNumericCellValue());
CellData = formater.format(date);
} else {
//小数
DecimalFormat df = new DecimalFormat("0");
CellData = df.format(Cell.getNumericCellValue());
}
} else if (Cell.getCellType() == XSSFCell.CELL_TYPE_BLANK) {
//空白
CellData = "";
}else if(Cell.getCellType() == XSSFCell.CELL_TYPE_BOOLEAN){
//布尔
CellData = String.valueOf(Cell.getBooleanCellValue());
}
else {
//未知类型
throw new RuntimeException("no support data type");
}
log.info("读取sheet工作表【" + sheetName + "】的第" + RowNum + "行第" + ColNum + "列的值为:" + CellData);
//返回字符串
return CellData;
} catch (Exception e) {
log.debug("读取sheet工作表【" + sheetName + "】的第" + RowNum + "行第" + ColNum + "列的值时异常:" + e);
throw new RuntimeException("get excel data error-->" + e);
}
}
/**
* 写入单元格数据
* @param sheetName 工作簿名称
* @param RowNum 行号
* @param ColNum 列号
*/
public void setCellData(String sheetName,int RowNum, int ColNum) throws IOException {
this.excelWSheet = this.excelWBook.getSheet(sheetName);
String resultValue = "this is new";
try {
// 获取 excel文件中的行对象
Row = this.excelWSheet.getRow(RowNum) == null ? excelWSheet.createRow(RowNum) : this.excelWSheet.getRow(RowNum);
// 如果单元格为空,则返回 Null
Cell = Row.getCell(ColNum, RETURN_BLANK_AS_NULL);
if (Cell == null) {
// 当单元格对象是 null 的时候,则创建单元格
// 如果单元格为空,无法直接调用单元格对象的 setCellValue 方法设定单元格的值
Cell = Row.createCell(ColNum);
// 创建单元格后可以调用单元格对象的 setCellValue 方法设定单元格的值
Cell.setCellValue(resultValue);
System.out.println("写入成功");
} else {
// 单元格中有内容,则可以直接调用单元格对象的 setCellValue 方法设定单元格的值
Cell.setCellValue(resultValue);
System.out.println("写入成功");
}
} catch (Exception e) {
throw new RuntimeException("set excel data error-->" + e);
}
// 实例化写入 excel 文件的文件输出流对象
FileOutputStream fileOut = new FileOutputStream(this.filePath);
// 将内容写入 excel 文件中
this.excelWBook.write(fileOut);
// 调用flush 方法强制刷新写入文件
fileOut.flush();
// 关闭文件输出流对象
fileOut.close();
}
}
3.测试类
public class PoiDome {
public static void main(String[] args) throws Exception {
String filename = "D:\\workSpace\\talent\\siyangerzan\\dianwei.xlsx";
// Object[][] excelData = ExcelDataUtil.getExcelData(filename, sheetname);
ExcelUtils excelUtils = new ExcelUtils();
excelUtils.openFile(filename);
Object[][] excelData = excelUtils.getAllData("自动化数据");
for (Object[] row : excelData){
Object r1 = row[0];
Object r2 = row[1];
Object r3 = row[2];
Object r4 = row[3];
System.out.println(r1.toString()+"--"+r2.toString()+"--"+r3.toString()+"--"+r4.toString());
}
// excelUtils.setCellData("pin",9,1);
excelUtils.closeFile();
}
}