工作中很多情況下我們需要使用Excel來配置部分?jǐn)?shù)據(jù),以此來減少數(shù)據(jù)庫(kù)的查詢(游戲相關(guān)行業(yè)使用相對(duì)頻繁)。以前寫過一篇Java使用POI導(dǎo)出數(shù)據(jù)到excel的文章恕齐,現(xiàn)在記錄下我使用POI讀取Excel的方法。
其實(shí)這個(gè)操作并不難,總結(jié)起來一個(gè)流程大致如下:
打開excel文件 --> 找到需要讀取的表格 --> 找到數(shù)據(jù)存在的單元格 --> 讀取數(shù)據(jù) --> 關(guān)閉文件∵罕現(xiàn)在一步一步來看。
image.png
我們?nèi)绾稳~@取這個(gè)單元格中的數(shù)據(jù)9999呢痘煤?
1.打開文件
OPCPackage pkgData = OPCPackage.open(RESOURCE_PATH);
//打開Excel文件并獲取讀寫權(quán)限,并創(chuàng)建一個(gè)OPCPackage 猿规,這個(gè)OPCPackage官網(wǎng)介紹是“一個(gè)能存儲(chǔ)大量數(shù)據(jù)對(duì)象的容器”衷快,并且是實(shí)現(xiàn)了Closeable接口,后面關(guān)閉釋放資源就是通過它姨俩。
2.獲取需要讀取的表格
XSSFWorkbook workbook = new XSSFWorkbook(pkgData);
XSSFSheet sheet = workbook.getSheet(SHEET_NAME);
//XSSFWorkbook 工作簿蘸拔,通過OPCPackage 來創(chuàng)建。XSSFSheet 就是我們需要的工作表环葵,可以根據(jù)表名來獲取调窍,也可以根據(jù)表索引來獲取
3.找到數(shù)據(jù)存在的單元格,我這里寫了個(gè)方法张遭。這里的單元格是命名了的邓萨,可能和網(wǎng)上一些做法不一樣。
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;
}
//根據(jù)單元格名稱獲取單元格,每個(gè)excel表中的單元格名稱都是唯一的
4.讀取單元格內(nèi)容并關(guān)閉文件先誉。
//如果單元格中的數(shù)據(jù)是int類型的
Integer data = new Integer((int) cell.getNumericCellValue());
//String
String data = cell.getStringCellValue();
//double
cell.getNumericCellValue();
//數(shù)據(jù)讀取完成后在finally代碼塊中關(guān)閉文件
pkgData.close();
好了湿刽,簡(jiǎn)單的單個(gè)單元格數(shù)據(jù)讀取就是這樣了。
image.png
表中的數(shù)據(jù)并不是一個(gè)單元格,而是具有某種結(jié)構(gòu)的數(shù)據(jù)铃芦,并有多條記錄雅镊。這種表要怎么讀呢?每個(gè)單元格設(shè)置一個(gè)名稱刃滓?我相信沒人會(huì)這么做的仁烹。我這里只是給最開始的cell中定義了一個(gè)名稱,可以看圖中的選中的單元格咧虎,命名為data卓缰。獲取了第一個(gè)單元格,然后循環(huán)獲取后面的單元格砰诵,就可以獲得其它所有的單元格了征唬。
1.首先獲取被命名的單元格,然后獲取這個(gè)單元格的行索引和列索引
這里假設(shè)已經(jīng)獲取到了那個(gè)單元格cell茁彭。
int columIndex = cell.getColumnIndex();
int rowIndex = cell.getRowIndex();
2.循環(huán)遍歷行
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);//狀態(tài)1單元格
//注意c2單元格总寒,它的列索引是在第一個(gè)單元格基礎(chǔ)上加3,因?yàn)槊枋鰡卧袷莾蓚€(gè)單元格合并的理肺,所以是加3而不是加2摄闸。
}
這樣就可以將所需要的數(shù)據(jù)全部獲取到。
POI讀取Excel就到這了妹萨,很基礎(chǔ)年枕,很簡(jiǎn)單。如果各位有什么疑問歡迎討論乎完。