Java使用Apache POI 讀取Excel表格數(shù)據(jù)

工作中很多情況下我們需要使用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)在一步一步來看。

假設(shè)有一個(gè)excel文件config.xlsx理盆。里面的數(shù)據(jù)如下
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ù)讀取就是這樣了。

但是在實(shí)際生產(chǎn)過程中經(jīng)常會(huì)碰到很復(fù)雜的配置表褐耳,比如下面這樣的诈闺。
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)單。如果各位有什么疑問歡迎討論乎完。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末画切,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子囱怕,更是在濱河造成了極大的恐慌霍弹,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,576評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件娃弓,死亡現(xiàn)場(chǎng)離奇詭異典格,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)台丛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門耍缴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來砾肺,“玉大人,你說我怎么就攤上這事防嗡”渫簦” “怎么了?”我有些...
    開封第一講書人閱讀 168,017評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵蚁趁,是天一觀的道長(zhǎng)裙盾。 經(jīng)常有香客問我,道長(zhǎng)他嫡,這世上最難降的妖魔是什么番官? 我笑而不...
    開封第一講書人閱讀 59,626評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮钢属,結(jié)果婚禮上徘熔,老公的妹妹穿的比我還像新娘。我一直安慰自己淆党,他們只是感情好酷师,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著染乌,像睡著了一般山孔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上慕匠,一...
    開封第一講書人閱讀 52,255評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音域醇,去河邊找鬼台谊。 笑死,一個(gè)胖子當(dāng)著我的面吹牛譬挚,可吹牛的內(nèi)容都是我干的锅铅。 我是一名探鬼主播,決...
    沈念sama閱讀 40,825評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼减宣,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼盐须!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起漆腌,我...
    開封第一講書人閱讀 39,729評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤贼邓,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后闷尿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體塑径,經(jīng)...
    沈念sama閱讀 46,271評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評(píng)論 3 340
  • 正文 我和宋清朗相戀三年填具,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了统舀。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,498評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖誉简,靈堂內(nèi)的尸體忽然破棺而出碉就,到底是詐尸還是另有隱情,我是刑警寧澤闷串,帶...
    沈念sama閱讀 36,183評(píng)論 5 350
  • 正文 年R本政府宣布瓮钥,位于F島的核電站,受9級(jí)特大地震影響窿克,放射性物質(zhì)發(fā)生泄漏骏庸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評(píng)論 3 333
  • 文/蒙蒙 一年叮、第九天 我趴在偏房一處隱蔽的房頂上張望具被。 院中可真熱鬧,春花似錦只损、人聲如沸一姿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽叮叹。三九已至,卻和暖如春爆存,著一層夾襖步出監(jiān)牢的瞬間蛉顽,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工先较, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留携冤,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,906評(píng)論 3 376
  • 正文 我出身青樓闲勺,卻偏偏與公主長(zhǎng)得像曾棕,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子菜循,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容