Java使用poi包讀取Excel文檔代碼分享
更新時間:2017年12月04日 14:32:04 作者:yan456jie
這篇文章主要介紹了Java使用poi包讀取Excel文檔代碼分享,具有一定借鑒價值,需要的朋友可以參考下。
項目需要解析Excel文檔獲取數據,就在網上找了一些資料,結合自己這次使用,寫下心得:
1、maven項目需加入如下依賴:
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.10-FINAL</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.10-FINAL</version>
</dependency>
直接上測試類,類里有完善的注釋:
package shindo.Java;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
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;
public class ExcelUtil {
public static void main(String[] args) {
String path = "D:\\IDE\\workspace-Neon\\Java\\src\\refund.xls";
try {
List<List<String>> result = new ExcelUtil().readXls(path);
System.out.println(result.size());
for (int i = 0; i < result.size(); i++) {
List<String> model = result.get(i);
System.out.println("orderNum:" + model.get(0) + "--> orderAmount:" + model.get(1));
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
*
* @Title: readXls
* @Description: 處理xls文件
* @param @param path
* @param @return
* @param @throws Exception 設定文件
* @return List<List<String>> 返回類型
* @throws
*
* 從代碼不難發(fā)現其處理邏輯:
* 1.先用InputStream獲取excel文件的io流
* 2.然后穿件一個內存中的excel文件HSSFWorkbook類型對象,這個對象表示了整個excel文件。
* 3.對這個excel文件的每頁做循環(huán)處理
* 4.對每頁中每行做循環(huán)處理
* 5.對每行中的每個單元格做處理,獲取這個單元格的值
* 6.把這行的結果添加到一個List數組中
* 7.把每行的結果添加到最后的總結果中
* 8.解析完以后就獲取了一個List<List<String>>類型的對象了
*
*/
private List<List<String>> readXls(String path) throws Exception {
InputStream is = new FileInputStream(path);
// HSSFWorkbook 標識整個excel
HSSFWorkbook hssfWorkbook = new HSSFWorkbook(is);
List<List<String>> result = new ArrayList<List<String>>();
int size = hssfWorkbook.getNumberOfSheets();
// 循環(huán)每一頁,并處理當前循環(huán)頁
for (int numSheet = 0; numSheet < size; numSheet++) {
// HSSFSheet 標識某一頁
HSSFSheet hssfSheet = hssfWorkbook.getSheetAt(numSheet);
if (hssfSheet == null) {
continue;
}
// 處理當前頁,循環(huán)讀取每一行
for (int rowNum = 1; rowNum <= hssfSheet.getLastRowNum(); rowNum++) {
// HSSFRow表示行
HSSFRow hssfRow = hssfSheet.getRow(rowNum);
int minColIx = hssfRow.getFirstCellNum();
int maxColIx = hssfRow.getLastCellNum();
List<String> rowList = new ArrayList<String>();
// 遍歷改行,獲取處理每個cell元素
for (int colIx = minColIx; colIx < maxColIx; colIx++) {
// HSSFCell 表示單元格
HSSFCell cell = hssfRow.getCell(colIx);
if (cell == null) {
continue;
}
rowList.add(getStringVal(cell));
}
result.add(rowList);
}
}
return result;
}
/**
*
* @Title: readXlsx
* @Description: 處理Xlsx文件
* @param @param path
* @param @return
* @param @throws Exception 設定文件
* @return List<List<String>> 返回類型
* @throws
*/
private List<List<String>> readXlsx(String path) throws Exception {
InputStream is = new FileInputStream(path);
XSSFWorkbook xssfWorkbook = new XSSFWorkbook(is);
List<List<String>> result = new ArrayList<List<String>>();
// 循環(huán)每一頁,并處理當前循環(huán)頁
for (XSSFSheet xssfSheet : xssfWorkbook) {
if (xssfSheet == null) {
continue;
}
// 處理當前頁,循環(huán)讀取每一行
for (int rowNum = 1; rowNum <= xssfSheet.getLastRowNum(); rowNum++) {
XSSFRow xssfRow = xssfSheet.getRow(rowNum);
int minColIx = xssfRow.getFirstCellNum();
int maxColIx = xssfRow.getLastCellNum();
List<String> rowList = new ArrayList<String>();
for (int colIx = minColIx; colIx < maxColIx; colIx++) {
XSSFCell cell = xssfRow.getCell(colIx);
if (cell == null) {
continue;
}
rowList.add(cell.toString());
}
result.add(rowList);
}
}
return result;
}
// 存在的問題
/*
* 其實有時候我們希望得到的數據就是excel中的數據,可是最后發(fā)現結果不理想
* 如果你的excel中的數據是數字,你會發(fā)現Java中對應的變成了科學計數法。
* 所以在獲取值的時候就要做一些特殊處理來保證得到自己想要的結果
* 網上的做法是對于數值型的數據格式化,獲取自己想要的結果。
* 下面提供另外一種方法,在此之前,我們先看一下poi中對于toString()方法:
*
* 該方法是poi的方法,從源碼中我們可以發(fā)現,該處理流程是:
* 1.獲取單元格的類型
* 2.根據類型格式化數據并輸出。這樣就產生了很多不是我們想要的
* 故對這個方法做一個改造。
*/
/*public String toString(){
switch(getCellType()){
case CELL_TYPE_BLANK:
return "";
case CELL_TYPE_BOOLEAN:
return getBooleanCellValue() ? "TRUE" : "FALSE";
case CELL_TYPE_ERROR:
return ErrorEval.getText(getErrorCellValue());
case CELL_TYPE_FORMULA:
return getCellFormula();
case CELL_TYPE_NUMERIC:
if(DateUtil.isCellDateFormatted(this)){
DateFormat sdf = new SimpleDateFormat("dd-MMM-yyyy")
return sdf.format(getDateCellValue());
}
return getNumericCellValue() + "";
case CELL_TYPE_STRING:
return getRichStringCellValue().toString();
default :
return "Unknown Cell Type:" + getCellType();
}
}*/
/**
* 改造poi默認的toString()方法如下
* @Title: getStringVal
* @Description: 1.對于不熟悉的類型,或者為空則返回""控制串
* 2.如果是數字,則修改單元格類型為String,然后返回String,這樣就保證數字不被格式化了
* @param @param cell
* @param @return 設定文件
* @return String 返回類型
* @throws
*/
public static String getStringVal(HSSFCell cell) {
switch (cell.getCellType()) {
case Cell.CELL_TYPE_BOOLEAN:
return cell.getBooleanCellValue() ? "TRUE" : "FALSE";
case Cell.CELL_TYPE_FORMULA:
return cell.getCellFormula();
case Cell.CELL_TYPE_NUMERIC:
cell.setCellType(Cell.CELL_TYPE_STRING);
return cell.getStringCellValue();
case Cell.CELL_TYPE_STRING:
return cell.getStringCellValue();
default:
return "";
}
}
}
總結
以上就是本文關于Java使用poi包讀取Excel文檔代碼分享的全部內容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!
相關文章
springboot執(zhí)行延時任務之DelayQueue的使用詳解
DelayQueue是一個無界阻塞隊列,只有在延遲期滿時,才能從中提取元素。這篇文章主要介紹了springboot執(zhí)行延時任務-DelayQueue的使用,需要的朋友可以參考下2019-12-12

