Java之如何讀取Excel獲取真實(shí)行數(shù)
Java讀取Excel獲取真實(shí)行數(shù)
剛進(jìn)入公司開發(fā),熟悉環(huán)境是個(gè)很大的難題,今天就接到了一個(gè)任務(wù),讓我修改批量上傳excel文件的頁(yè)面.
公司采用的是apache提供的包,通過XML文件的映射,把EXCEL表和我們的Model對(duì)應(yīng)起來.本來是校驗(yàn)正確的,結(jié)果莫名其妙到后面就會(huì)報(bào)空指針異常.
問題的原因:在沒有格式的前提下,getLastRowNum方法能夠正確返回最后一行的位置;getPhysicalNumberOfRows方法能夠正確返回物理的行數(shù);
* 在有格式的前提下,這兩個(gè)方法都是不合理的;
* 所以,在做導(dǎo)入excel的時(shí)候,建議想要正確獲取行數(shù),可以做一個(gè)人為的約定,比如約定導(dǎo)入文件第一列不允許為空,行數(shù)就按照第一列的有效行數(shù)來統(tǒng)計(jì);這樣就能正確獲取到實(shí)際想要的行數(shù);
更新版本,因?yàn)榘l(fā)現(xiàn)有時(shí)候 存在了加了樣式的邊框,邊框的屬性默認(rèn)成為了 公式屬性,導(dǎo)致后面空指針,現(xiàn)已修復(fù)
修改版
/**
* 用來得到真實(shí)行數(shù)
* @param sheet
* @param flag 需要寫進(jìn)數(shù)據(jù)庫(kù)的列數(shù)用逗號(hào)隔開 比如 (Sheet sheet,int 2,int 3);隨意個(gè)
* @return
*
*/
public static int findRealRows(Sheet sheet, int... flag) {
int row_real = 0;
int rows = sheet.getPhysicalNumberOfRows();// 此處物理行數(shù)統(tǒng)計(jì)有錯(cuò)誤,
int size = flag.length;
try {
for (int i = 1; i < rows; i++) {
Row row = sheet.getRow(i);
int total = 0;
ArrayList<Integer> blank =new ArrayList<Integer>();
int type=-1;
String s = null;
for(int j:flag){
if(!(row.getCell(j) == null)&&row.getCell(j).getCellType()<2){
type=row.getCell(j).getCellType();
row.getCell(j).setCellType(1);
}
if (row.getCell(j) == null||row.getCell(j).getStringCellValue().matches("^\\s+$")||row.getCell(j).getCellType()>2) {
total++;
if(!(row.getCell(j) == null)&&row.getCell(j).getCellType()<2){
row.getCell(j).setCellType(type);
}
blank.add(j);
}
}
System.out.println(s+"我");
// 如果4列都是空說明就該返回
if (total == flag.length) {
return row_real;
} else if (total == 0) {
row_real++;
} else {
String h="";
for(Integer b:blank){
h=h+"第"+(b+1)+"列"+" ";
}
throw new BusinessException("第" + (i + 1) + "行" + h
+ "不能為空");
}
}
} catch (NullPointerException e) {
throw new BusinessException("excel格式異常,請(qǐng)檢查excel格式有無數(shù)據(jù)缺失,無效數(shù)據(jù)行!");
}
return row_real;
}方法都這樣,通過約定一個(gè)有的ID來進(jìn)行判斷,可以較快的得到真實(shí)的行數(shù) ,以至于后面的集合循環(huán)輸出的話不會(huì)出現(xiàn)空指針異常
Java讀取excel數(shù)據(jù)
導(dǎo)入相關(guān)的MAVEN依賴。
? ? ? ? <!--excel的依賴--> ? ? ? ? <dependency> ? ? ? ? ? ? <groupId>org.apache.poi</groupId> ? ? ? ? ? ? <artifactId>poi</artifactId> ? ? ? ? ? ? <version>4.1.0</version> ? ? ? ? </dependency> ? ? ? ? <dependency> ? ? ? ? ? ? <groupId>org.apache.poi</groupId> ? ? ? ? ? ? <artifactId>poi-ooxml</artifactId> ? ? ? ? ? ? <version>4.1.0</version> ? ? ? ? </dependency>
Java代碼
使用說明:
1、XSSFWorkbook是整個(gè)操作excel文件需要用到的對(duì)象。構(gòu)造時(shí),參數(shù)是一個(gè)FileInputStream對(duì)象,里面寫上文件的地址。
2、getNumberOfSheets()獲取擁有的sheet總頁(yè)數(shù)。
3、getSheetAt(number)操作第幾個(gè)工作簿,參數(shù)是第幾個(gè)sheet表。此處的參數(shù)索引是從0開始。返回值是一個(gè)工作簿對(duì)象XSSFSheet,用于操作這個(gè)工作簿。
4、工作簿對(duì)象.getLastRowNum()。獲取該工作簿一共有多少列。
5、getRow(row_num).getLastCellNum().獲取改行共有多少列。此處行和列的下標(biāo)都是從1開始的。
6、getRow(row).getCell(rol)。獲取改行該列的元素。
? ?public static void excelFind() {
? ? ? ? try {
? ? ? ? ? ? XSSFWorkbook xssfWorkbook = new XSSFWorkbook(new FileInputStream("src/test/java/postSQL/database/test.xlsx"));
? ? ? ? ? ? //獲取工作簿下sheet的個(gè)數(shù)
? ? ? ? ? ? int sheetNum = xssfWorkbook.getNumberOfSheets();
? ? ? ? ? ? System.out.println("總數(shù)頁(yè)碼:"+sheetNum);
? ? ? ? ? ? //遍歷頁(yè)碼:
? ? ? ? ? ? for(int i = 0;i<sheetNum;i++) {
? ? ? ? ? ? ? ? System.out.println("讀取第"+(i+1)+"個(gè)sheet");
? ? ? ? ? ? ? ? //sheet的索引下標(biāo)是從0開始的,得到該頁(yè)碼的對(duì)象
? ? ? ? ? ? ? ? XSSFSheet sheet = xssfWorkbook.getSheetAt(i);
? ? ? ? ? ? ? ? //獲取總共的行數(shù)
? ? ? ? ? ? ? ? int maxRow = sheet.getLastRowNum();
? ? ? ? ? ? ? ? //對(duì)每一行進(jìn)行遍歷
? ? ? ? ? ? ? ? for (int row = 0; row <= maxRow; row++) {
? ? ? ? ? ? ? ? ? ? //getRow(row_num)獲取改行的對(duì)象,再.getLastCellNum()獲取該行共有幾列
? ? ? ? ? ? ? ? ? ? //此處與sheet不同的是,該索引下標(biāo)是從1開始的
? ? ? ? ? ? ? ? ? ? int maxRol = sheet.getRow(row).getLastCellNum();
? ? ? ? ? ? ? ? ? ? System.out.println("--------第" + row + "行的數(shù)據(jù)如下--------");
? ? ? ? ? ? ? ? ? ? //遍歷列數(shù)
? ? ? ? ? ? ? ? ? ? for (int rol = 0; rol < maxRol; rol++){
? ? ? ? ? ? ? ? ? ? ? ? //sheets.getRow(1).getCell(1);獲取元素值
? ? ? ? ? ? ? ? ? ? ? ? System.out.print(sheet.getRow(row).getCell(rol) + " ?");
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? System.out.println();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? } catch (IOException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }
? ? }總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java實(shí)戰(zhàn)項(xiàng)目 健身管理系統(tǒng)
本文是一個(gè)Java語(yǔ)言編寫的實(shí)戰(zhàn)項(xiàng)目,是一個(gè)健身管理系統(tǒng),主要用到了ssm+springboot等技術(shù),技術(shù)含量筆記高,感興趣的童鞋跟著小編往下看吧2021-09-09
RestTemplate請(qǐng)求失敗自動(dòng)重啟機(jī)制精講
這篇文章主要為大家介紹了RestTemplate請(qǐng)求失敗自定義處理的方法,自動(dòng)重試的機(jī)制精講,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多所進(jìn)步,早日升職加薪2022-03-03
半小時(shí)實(shí)現(xiàn)Java手?jǐn)]網(wǎng)絡(luò)爬蟲框架(附完整源碼)
最近在做一個(gè)搜索相關(guān)的項(xiàng)目,需要爬取網(wǎng)絡(luò)上的一些鏈接存儲(chǔ)到索引庫(kù)中,自己寫了一個(gè)簡(jiǎn)單的網(wǎng)絡(luò)爬蟲,感興趣的可以了解一下2021-06-06
SpringMVC MVC架構(gòu)與Servlet使用詳解
MVC設(shè)計(jì)模式一般指 MVC 框架,M(Model)指數(shù)據(jù)模型層,V(View)指視圖層,C(Controller)指控制層。使用 MVC 的目的是將 M 和 V 的實(shí)現(xiàn)代碼分離,使同一個(gè)程序可以有不同的表現(xiàn)形式。其中,View 的定義比較清晰,就是用戶界面2022-10-10
Mybatis Criteria使用and和or進(jìn)行聯(lián)合條件查詢的操作方法
這篇文章主要介紹了Mybatis Criteria的and和or進(jìn)行聯(lián)合條件查詢的方法,本文通過例子給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-10-10
JAVA為什么要使用封裝及如何封裝經(jīng)典實(shí)例
這篇文章主要給大家介紹了關(guān)于JAVA為什么要使用封裝及如何封裝的相關(guān)資料,封裝就是將屬性私有化,提供公有的方法訪問私有屬性,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-10-10
Java創(chuàng)建,編輯與刪除Excel迷你圖表的實(shí)現(xiàn)方法
迷你圖是Excel工作表單元格中表示數(shù)據(jù)的微型圖表。本文將通過Java代碼示例介紹如何在Excel中創(chuàng)建迷你圖表,以及編輯和刪除表格中的迷你圖表,需要的可以參考一下2022-05-05

