1.概述
?????????在應(yīng)用程序的開發(fā)過程中,經(jīng)常需要使用Excel 文件來進(jìn)行數(shù)據(jù)的導(dǎo)入或?qū)С觥K?在通過ava語言實(shí)現(xiàn)此類需求的時(shí)候,往往會(huì)面臨著Excel文件的解析(導(dǎo)入)或生成(導(dǎo)出)。
????????在Java技術(shù)生態(tài)圈中,可以進(jìn)行Excel文件處理的主流技術(shù)包括: Apache POI 、JXL 、Alibaba EasyExcel 等。
????????Apache POI 基于DOM方式進(jìn)行解析,將文件直接加載內(nèi)存,所以速度較快,適合Excel 文件數(shù)據(jù)量不大的應(yīng)用場景。JXL只支持Excel 2003以下版本,所以不太常見。
????????Alibaba EasyExcel 采用逐行讀取的解析模式,將每一行的解析結(jié)果以觀察者的模式通知處理
( AnalysisEventListener ) , 所以比較適合數(shù)據(jù)體量較大的Excel 文件解析。
2.Apache POI
????????Apache POI是用Java 編寫的免費(fèi)開源的跨平臺(tái)的Java API,Apache POI提供給Java 程序?qū)icrosoft office 格式檔案進(jìn)行讀寫功能的API 開源類庫:
????????JURCE - 它分別提供對不同格式文件的解析:
????????HSSF - 提供讀寫Microsoft Excel格式檔案的功能。
????????XSSF - 提供讀寫Microsoft Excel OOXML格式檔案的功能。
????????HWPF - 提供讀寫Microsoft Word格式檔案的功能。
????????HSLF - 提供讀寫Microsoft PowerPoint格式檔案的功能。
????????HDGF - 提供讀寫 Microsoft Visio格式檔案的功能。
3.使用XSSF解析Excel文件
????????HSSF用于解析舊版本( *.xIs ) Excel文件,由于舊版本的Excel文件只能存在65535行數(shù)據(jù),所以目前已經(jīng)不常用。所以目前主要采用XSSF進(jìn)行新版本( *.xlsx ) Exce文件的解析。
創(chuàng)建Excel文件?
? ? ? ? ?當(dāng)我們要解析一個(gè)Excel文件時(shí),需要?jiǎng)?chuàng)建一個(gè)Workbook的實(shí)現(xiàn)類XSSFWorkbook,它就代表了一個(gè)Excel文件,
try (Workbook workbook = new XSSFWorkbook();
FileOutputStream fos = new FileOutputStream("D:\\share\\Demo01.xlsx")) {
workbook.write(fos);
} catch (IOException e) {
e.printStackTrace();
}
?加載Excel文件
????????可以創(chuàng)建FileInputStream文件輸入流對象那指定路徑下的Excel文件傳入到XSSFWorkbook中,推薦寫入到try-with-resources中例如:
// 輸入流
FileInputStream fis = new FileInputStream("D:\\share\\Demo01.xlsx");
// Excel文件對象
Workbook workbook = new XSSFWorkbook(fis);
?Sheet(工作簿)
? ? ? ? ?創(chuàng)建工作簿對象
// 按照默認(rèn)名稱創(chuàng)建工作簿
Sheet sheet1 = workbook.createSheet();
// 按照自定義名稱創(chuàng)建工作簿
Sheet sheet2 = workbook.createSheet("自定義工作簿2");
????????獲取工作簿
// 按照名稱獲取工作簿
// org.apache.poi.ss.usermodel.Sheet ss包下的
Sheet sheet0 = workbook.getSheet("Sheet0");
// 按照下標(biāo)獲取工作簿
Sheet sheet1 = workbook.getSheetAt(1);"Sheet0");
????????獲取工作簿的數(shù)量
int n = workbook.getNumberOfSheets();
Row(行數(shù)據(jù))
? ? ? ? 通過sheet來進(jìn)行數(shù)據(jù)行的獲取或創(chuàng)建
獲取當(dāng)前數(shù)據(jù)行
Row row = sheet.createRow(0);
獲取首行下標(biāo)
int first = sheet.getFirstRowNum();
獲取尾行下標(biāo)?
int last = sheet.getLastRowNum();
根據(jù)下標(biāo)獲取指定行?
Row row = sheet.getRow(0);
遍歷所有行
for(Row row : sheet) {
System.out.println(row);
}
?遍歷指定行
for (int i = 1; i <= sheet.getLastRowNum(); i++) {
Row row = sheet.getRow(i);
System.out.println(row);
}
?文章來源地址http://www.zghlxwxcb.cn/news/detail-467229.html
Cell單元格
創(chuàng)建單元格?
Cell cell0 = row.createCell(0);
設(shè)置單元格值
cell0.setCellValue(//對應(yīng)類型數(shù)據(jù)值);
根據(jù)下標(biāo)獲取單元格
Cell cell = row.getCell(1);
遍歷所有單元格
for(Cell cell : row) {
}
獲取單元格的類型
CellType type = cell.getCellType();
設(shè)置單元格樣式
// 創(chuàng)建單元格樣式
DataFormat dataFormat = workbook.createDataFormat();
Short formatCode = dataFormat.getFormat("yyyy-MM-dd HH:mm:ss");
CellStyle cellStyle = workbook.createCellStyle();
cellStyle.setDataFormat(formatCode);
// ...
// 為當(dāng)前行創(chuàng)建單元格
Cell cell1 = row.createCell(1);
cell1.setCellStyle(cellStyle); // 設(shè)置單元格樣式
cell1.setCellValue(new Date()); // 保存當(dāng)前日期時(shí)間至本單元格
設(shè)置單元格對齊方式
// 創(chuàng)建單元格樣式
CellStyle cellStyle = workbook.createCellStyle();
//設(shè)置單元格的水平對齊類型。 此時(shí)水平居中
cellStyle.setAlignment(HorizontalAlignment.CENTER);
// 設(shè)置單元格的垂直對齊類型。 此時(shí)垂直靠底邊
cellStyle.setVerticalAlignment(VerticalAlignment.BOTTOM);
4.超大Excel文件讀寫
????????一般進(jìn)行超大Excel文件的讀寫,一般兩種方式,第一種使用SXSSFWorkbook進(jìn)行寫入,通過設(shè)置SXXFWorkbook 的構(gòu)造參數(shù),可以設(shè)置每次在內(nèi)存中保持的行數(shù),當(dāng)達(dá)到這個(gè)值的時(shí)候,那么會(huì)把這些數(shù)據(jù)flush 到磁盤上,這樣就不會(huì)出現(xiàn)內(nèi)存不夠的情況。第二種使用阿里巴巴提供的EasyExcel工廠類進(jìn)行寫入讀取操作。但是對于不同電腦,不同CPU,不同內(nèi)存讀寫的速度也是不同的。
? ? ? ? 我的電腦比較老CPU是Intel(R) Core(TM) i5-3320M CPU @ 2.60GHz 2.60 GHz,內(nèi)存(RAM)是4.00GB,以下是對應(yīng)的使用EasyExcel寫入100萬條數(shù)據(jù)運(yùn)行后統(tǒng)計(jì)的總耗時(shí):
? ? ? ? ?我的電腦如果使用SXSSFWorkbook來進(jìn)行一般的讀入數(shù)據(jù)直接把IDEA卡到無響應(yīng),作者也是很無奈,所以更推薦與使用EasyExcel來進(jìn)行超大Excel文件的讀寫。文章來源:http://www.zghlxwxcb.cn/news/detail-467229.html
?
到了這里,關(guān)于Excel文件解析以及超大Excel文件讀寫的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!