Java讀取Excel數據,解析文本並格式化輸出
Java讀取Excel數據,解析文本並格式化輸出
Java讀取Excel數據,解析文本並格式化輸出
下圖是excel文件的路徑和文件名
下圖是excel文件里面的內容
下面是Java讀取Excel數據的代碼
package excel_driver; import java.util.List; import java.io.FileInputStream; import java.io.InputStream; import java.util.ArrayList; 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 excel_driver { private static 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>>(); //循環每一頁,並處理當前循環頁 //for(XSSFSheet xssfSheet : xssfWorkbook){ for(int numSheet=0; numSheet < xssfWorkbook.getNumberOfSheets(); numSheet++){ XSSFSheet xssfSheet = xssfWorkbook.getSheetAt(numSheet); if (xssfSheet==null) continue; //處理當前頁,循環讀取每一行 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>(); // System.out.println("\t"); //遍歷該行獲取處理每個cell元素 for(int colIx=minColIx;colIx<maxColIx; colIx++){ XSSFCell cell= xssfRow.getCell(colIx); // System.out.println("\t"); if (cell==null){ // System.out.println("\t"); continue; } rowList.add(getString.getStringVal(cell)); // System.out.println("\t"); } result.add(rowList); } } return result; } public static void main(String[] args) throws Exception { List<List<String>> a = readXlsx("C:\\Users\\chenjia\\Desktop\\excel_driver.xlsx"); // for (int i = 0; i < a.size(); i++) { // System.out.println(a.[i]); // } for(List list:a) { System.out.println(list); } System.out.println(a); System.out.println(a.size()); // System.out.println(a.[1]); } }
package excel_driver; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.xssf.usermodel.XSSFCell; public class getString { public static String getStringVal (XSSFCell 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 "????"; } } }
運行結果是:
[張三, 111111, 會計1班, 20150505, 13113131313, 4111] [李四, 222222, 文法2班, 20160606, 15215215212, 4222] [王五, 3333333, 英語3班, 20170707, 13313313333, 4333] [[張三, 111111, 會計1班, 20150505, 13113131313, 4111], [李四, 222222, 文法2班, 20160606, 15215215212, 4222], [王五, 3333333, 英語3班, 20170707, 13313313333, 4333]] 3
下面是原文章:
相關技術
使用的POI解析Excel需要使用的jar包
![]()
注(使用的maven.我就添加了右邊的兩個依賴就可以了)
分析
解析Excel首先就要解析Excel的結構.然后用面向對象的思想分析一下
![]()
這是一個excel文件.下面我們就來分析一下如果讓你寫這個poi框架,那么你會怎么設計.
1. 首先要有一個對象表示這整個Excel文件.
2. 可是這個excel文件中有好多頁.Sheet1, Sheet2等等,所以我們還需要一個對象表示頁.
3. 在頁中,有行,所以還需要一個對象表示行.
4. 在行中,最后細分到格cell.
5. 格cell中數據還有好多類型.有字符串,數字,時間等等.
POI中的對象與excel對象的對應
excel文件就有多種類型了.后綴有 xls 與 xlsx
![]()
所以對於不同類型的文件,就需要使用不同的poi中的對象了.
1. 如果你要解析的是xls文件![]()
從代碼不難發現,這里的處理邏輯是
1>. 先用inputstream獲取excel文件的io流
2>. 然后創建一個內存中的excel文件HSSFWorkbook類型對象.這個對象表示了整個excel文件.
3>. 對這個excel文件的每頁做循環處理
4>. 對每頁中的每行做循環處理.
5>. 對每行中的每個單元格做做處理,獲取這個單元格的值.
6>. 把這行的結果添加到一個List數組中.
7>. 把每行的結果添加到最后的總結果中.
8>. 解析完以后就獲取了一個List< List < String > > 類型的對象了.
2. 如果你要處理xlsx類型的文件則![]()
和上面一樣,我就不說了.
存在的問題
其實有時候我們希望得到的數據就是excel中的數據,可是最后發現結果不理想
如果你的excel中的數據是數字,你會發現Java中對應的變成了科學計數法的.
所以在獲取值的時候就要做一些特殊處理.
這樣就能保證獲取的值是我想要的值.
網上的做法是對於數值類型的數據格式化,獲取自己想要的結果.
其實也沒有那么麻煩.我在做的時候突然想到了一種處理解決方案.供參考
我們看一下poi中對於的toString()方法![]()
該方法是poi的方法,從源碼中我們可以發現,該處理流程是
1. 獲取單元格的類型
2. 根據類型格式化數據並輸出.這不一下子就造成了很多不是我們想要的.
所以我們就要改造一下這個方法例如這樣![]()
我的做法是這樣的
1. 對於不熟悉的類型,或者為空則返回”” 控制串.
2.如果是數字,則修改單元格類型為String,然后返回String.這樣就保證數字不被格式化了.
3. 雖然不知道這么做有什么后果,可是成功了.