工作中很多情况下我们需要使用Excel来配置部分数据,以此来减少数据库的查询(游戏相关行业使用相对频繁)。以前写过一篇Java使用POI导出数据到excel的文章,现在记录下我使用POI读取Excel的方法。
其实这个操作并不难,总结起来一个流程大致如下:
打开excel文件 --> 找到需要读取的表格 --> 找到数据存在的单元格 --> 读取数据 --> 关闭文件。现在一步一步来看。
我们如何取获取这个单元格中的数据9999呢?
1.打开文件
OPCPackage pkgData = OPCPackage.open(RESOURCE_PATH);
//打开Excel文件并获取读写权限,并创建一个OPCPackage ,这个OPCPackage官网介绍是“一个能存储大量数据对象的容器”,并且是实现了Closeable接口,后面关闭释放资源就是通过它。
2.获取需要读取的表格
XSSFWorkbook workbook = new XSSFWorkbook(pkgData);
XSSFSheet sheet = workbook.getSheet(SHEET_NAME);
//XSSFWorkbook 工作簿,通过OPCPackage 来创建。XSSFSheet 就是我们需要的工作表,可以根据表名来获取,也可以根据表索引来获取
3.找到数据存在的单元格,我这里写了个方法。这里的单元格是命名了的,可能和网上一些做法不一样。
public static Cell findCell(XSSFWorkbook workbook, XSSFSheet sheet, String name) {
int namedCellIdx = workbook.getNameIndex(name);
Name aNamedCell = workbook.getNameAt(namedCellIdx);
AreaReference aref = new AreaReference(aNamedCell.getRefersToFormula());
CellReference[] crefs = aref.getAllReferencedCells();
for (int i=0; i<crefs.length; i++) {
Row r = sheet.getRow(crefs[i].getRow());
Cell c = r.getCell(crefs[i].getCol());
return c;
}
return null;
}
//根据单元格名称获取单元格,每个excel表中的单元格名称都是唯一的
4.读取单元格内容并关闭文件。
//如果单元格中的数据是int类型的
Integer data = new Integer((int) cell.getNumericCellValue());
//String
String data = cell.getStringCellValue();
//double
cell.getNumericCellValue();
//数据读取完成后在finally代码块中关闭文件
pkgData.close();
好了,简单的单个单元格数据读取就是这样了。
表中的数据并不是一个单元格,而是具有某种结构的数据,并有多条记录。这种表要怎么读呢?每个单元格设置一个名称?我相信没人会这么做的。我这里只是给最开始的cell中定义了一个名称,可以看图中的选中的单元格,命名为data。获取了第一个单元格,然后循环获取后面的单元格,就可以获得其它所有的单元格了。
1.首先获取被命名的单元格,然后获取这个单元格的行索引和列索引
这里假设已经获取到了那个单元格cell。
int columIndex = cell.getColumnIndex();
int rowIndex = cell.getRowIndex();
2.循环遍历行
for (int i = 0; i < 5; i++) {
XSSFRow row = sheet.getRow(rowIndex + i);
Cell c = row.getCell(columIndex);//data单元格
Cell c1 = row.getCell(columIndex+1);//描述1单元格
Cell c2 = row.getCell(columIndex+3);//状态1单元格
//注意c2单元格,它的列索引是在第一个单元格基础上加3,因为描述单元格是两个单元格合并的,所以是加3而不是加2。
}
这样就可以将所需要的数据全部获取到。
POI读取Excel就到这了,很基础,很简单。如果各位有什么疑问欢迎讨论。