手把手教你用java读写excel表格文件(POI,EasyExcel)
視頻鏈接-我是學習之星我為狂神打call~
【狂神說Java】POI及EasyExcel一小時搞定通俗易懂
想給項目添加一個表格導入導出功能嗎?
“xxx管理系統(tǒng)”沒有導入導出功能逼格不夠了?
想簡單入手下 how to 用java 生成excel又找不到合適的教程?
come on !這篇文章簡單介紹下如何用java操作excel,主要涉及到POI和easyExcel這兩個
文章目錄
- 1.POI和easyExcel介紹
- 是什么?
- 有什么用?
- 2.POI-excel-寫
- excel 基本寫入操作
- 03版本xls
- 07版本xlsx
- 大量數(shù)據(jù)寫入
- 大文件寫HSSF
- 大文件寫XSSF
- 大文件寫SXSSF
- 3.POI-excel-讀
- 03/07版本
- 03版本代碼示例
- 07版本代碼示例
- 讀取不同類型的數(shù)據(jù)(難點★)
- 計算公式(了解即可)
- 4.EasyExcel相關(guān)的操作
- 導入依賴
- 寫入測試
- 1.DemoData.java
- 2.測試寫入數(shù)據(jù)
- 最終的結(jié)果
1.POI和easyExcel介紹
是什么?
我們經(jīng)常需要將項目中的表格數(shù)據(jù)或者文檔數(shù)據(jù)進行導入或者導出操作,這個如果自己從零開始做還比較麻煩。比如我之前就職的公司都是自己做的組件,但是很不好用,BUG 太多。關(guān)于表格導入導出,市面上比較知名的開源就是 Apache 的POI 和 阿里巴巴的 EasyExcel了。EasyExcel 也是對 POI 的改進和封裝, 更加好用。
有什么用?
1、將用戶的信息導出為 excel 表格。
2、將 Excel 表中的信息錄入到網(wǎng)站數(shù)據(jù)庫。
開發(fā)中經(jīng)常會涉及到 excel 的 處理,如導出 Excel ,導入 Excel 到數(shù)據(jù)庫中。
操作 Excel 目前比較流行的就是 Apache POI 和阿里巴巴的 EasyExcel。
Apache POI
結(jié)構(gòu):
EasyExcel
EasyExcel 是阿里巴巴開源的一個 excel處理框架,以使用簡單、節(jié)省內(nèi)存著稱。
EasyExcel 能大大減少內(nèi)存占用的主要原因是在解析 Excel 時沒有將文件數(shù)據(jù)一次性全部加載到內(nèi)存中,而是從磁盤上一行行讀取數(shù)據(jù),逐個解析。
下面是 EasyExcel 和 POI 在解析Excel 時的對比圖。
2.POI-excel-寫
excel 基本寫入操作
萬物皆對象:工作簿是個對象,其中包含工作表;工作表是個對象,其中包含行,列對象。。
03版本xls
@Testpublic void testWriteTest03() throws Exception {// 1.創(chuàng)建一個工作簿Workbook workbook =new HSSFWorkbook();// 2.創(chuàng)建一個工作表Sheet sheet = workbook.createSheet("學生統(tǒng)計表");// 3.創(chuàng)建一個行(1,1)Row row1 =sheet.createRow(0);// 4.創(chuàng)建一個單元格 (1,2)Cell cell11 =row1.createCell(0);cell11.setCellValue("學生姓名");Cell cell12 =row1.createCell(1);cell12.setCellValue("楊濤");//第二行Row row2 =sheet.createRow(1);Cell cell21 =row2.createCell(0);cell21.setCellValue("入學時間");//( 2,2)Cell cell22 =row2.createCell(1);String time = new DateTime().toString("yyyy-MM-dd");cell22.setCellValue(time);// 生成一張表(IO流) 03 版本使用的就是 xls結(jié)尾!FileOutputStream fileOutputStream = new FileOutputStream(PATH + "學生統(tǒng)計表03.xls");workbook.write(fileOutputStream);// 關(guān)閉流fileOutputStream.close();System.out.println("學生統(tǒng)計表03表格生成完畢");}07版本xlsx
@Testpublic void testWriteTest07() throws Exception {// 1.創(chuàng)建一個工作簿 07Workbook workbook =new XSSFWorkbook();// 2.創(chuàng)建一個工作表Sheet sheet = workbook.createSheet("學生統(tǒng)計表");// 3.創(chuàng)建一個行(1,1)Row row1 =sheet.createRow(0);// 4.創(chuàng)建一個單元格 (1,2)Cell cell11 =row1.createCell(0);cell11.setCellValue("學生姓名");Cell cell12 =row1.createCell(1);cell12.setCellValue("楊濤");//第二行Row row2 =sheet.createRow(1);Cell cell21 =row2.createCell(0);cell21.setCellValue("入學時間");//( 2,2)Cell cell22 =row2.createCell(1);String time = new DateTime().toString("yyyy-MM-dd");cell22.setCellValue(time);// 生成一張表(IO流) 03 版本使用的就是 xlsx結(jié)尾!FileOutputStream fileOutputStream = new FileOutputStream(PATH + "學生統(tǒng)計表07.xlsx");workbook.write(fileOutputStream);// 關(guān)閉流fileOutputStream.close();System.out.println("學生統(tǒng)計表07表格生成完畢");}大量數(shù)據(jù)寫入
PS:xls文件有行數(shù)限制(65536行)。
03版本xls對應(yīng)的是HSSF格式,07版本xlsx對應(yīng)的是XSSF格式
注意:03版本xls寫的行數(shù)超過65536會報錯異常:
大文件寫HSSF
@Testpublic void testWrite03BigData() throws Exception {// 時間long begin = System.currentTimeMillis();// 創(chuàng)建一個簿Workbook workbook = new HSSFWorkbook();//創(chuàng)建表Sheet sheet = workbook.createSheet();//寫入數(shù)據(jù)for (int rowNum = 0; rowNum < 65535; rowNum++) {Row row = sheet.createRow(rowNum);for (int cellNum = 0; cellNum < 10; cellNum++) {Cell cell = row.createCell(cellNum);cell.setCellValue(cellNum);}}System.out.println("over");// 輸出文件FileOutputStream outputStream = new FileOutputStream(PATH + "testWrite03BigData.xls");workbook.write(outputStream);// 關(guān)閉流outputStream.close();long end = System.currentTimeMillis();System.out.println((double)(end-begin)/1000);}大文件寫XSSF
// 耗時較久!!@Testpublic void testWrite07BigData() throws Exception {// 時間long begin = System.currentTimeMillis();// 創(chuàng)建一個簿Workbook workbook = new XSSFWorkbook();//創(chuàng)建表Sheet sheet = workbook.createSheet();//寫入數(shù)據(jù)for (int rowNum = 0; rowNum < 200000; rowNum++) {Row row = sheet.createRow(rowNum);for (int cellNum = 0; cellNum < 10; cellNum++) {Cell cell = row.createCell(cellNum);cell.setCellValue(cellNum);}}System.out.println("over");// 輸出文件FileOutputStream outputStream = new FileOutputStream(PATH + "testWrite07BigData.xlsx");workbook.write(outputStream);// 關(guān)閉流outputStream.close();long end = System.currentTimeMillis();System.out.println((double)(end-begin)/1000);}大文件寫SXSSF
@Testpublic void testWrite07BigDataSecond() throws Exception {// 時間long begin = System.currentTimeMillis();// 創(chuàng)建一個簿Workbook workbook = new SXSSFWorkbook();//創(chuàng)建表Sheet sheet = workbook.createSheet();//寫入數(shù)據(jù)for (int rowNum = 0; rowNum < 200000; rowNum++) {Row row = sheet.createRow(rowNum);for (int cellNum = 0; cellNum < 10; cellNum++) {Cell cell = row.createCell(cellNum);cell.setCellValue(cellNum);}}System.out.println("over");// 輸出文件FileOutputStream outputStream = new FileOutputStream(PATH + "testWrite07BigDataSecond.xlsx");workbook.write(outputStream);// 關(guān)閉流outputStream.close();// 清除臨時文件!((SXSSFWorkbook)workbook).dispose();long end = System.currentTimeMillis();System.out.println((double)(end-begin)/1000);}3.POI-excel-讀
03/07版本
03版本代碼示例
String PATH = "C:\\Users\\Administrator\\Desktop\\poi-easyExcel\\";@Testpublic void testReadTest03() throws Exception {// 獲取文件流FileInputStream inputStream = new FileInputStream(PATH + "poi學生統(tǒng)計表03.xls");// 1.創(chuàng)建一個工作簿, excel 能操作的它都能操作Workbook workbook = new HSSFWorkbook(inputStream);// 2.得到表Sheet sheet = workbook.getSheetAt(0);// 3.得到行Row row = sheet.getRow(0);// 4.得到列Cell cell = row.getCell(1);// 輸出(0,0)// 讀取值的時候一定要注意判斷類型,否則會讀取失敗System.out.println(cell.getStringCellValue());}07版本代碼示例
@Testpublic void testReadTest07() throws Exception {// 獲取文件流FileInputStream inputStream = new FileInputStream(PATH + "poi學生統(tǒng)計表07.xlsx");// 1.創(chuàng)建一個工作簿, excel 能操作的它都能操作Workbook workbook = new XSSFWorkbook(inputStream);// 2.得到表Sheet sheet = workbook.getSheetAt(0);// 3.得到行Row row = sheet.getRow(0);// 4.得到列Cell cell = row.getCell(1);// 輸出(0,0)// 讀取值的時候一定要注意判斷類型,否則會讀取失敗System.out.println(cell.getStringCellValue());}注意獲取值的類型即可
讀取不同類型的數(shù)據(jù)(難點★)
@Testpublic void testCellType() throws Exception {// 獲取文件流FileInputStream inputStream = new FileInputStream(PATH + "明細表.xls");// 1.創(chuàng)建一個工作簿, excel 能操作的它都能操作Workbook workbook = new HSSFWorkbook(inputStream);Sheet sheet = workbook.getSheetAt(0);// 獲取標題內(nèi)容Row rowTitle = sheet.getRow(0);if (rowTitle != null) {// 一定要掌握!!int cellCount = rowTitle.getPhysicalNumberOfCells();for (int cellNum = 0; cellNum < cellCount; cellNum++) {Cell cell = rowTitle.getCell(cellNum);if (cell != null) {int cellType = cell.getCellType();String cellValue = cell.getStringCellValue();System.out.print(cellValue + " | ");}}System.out.println();}// 獲取表中的內(nèi)容int rowCount = sheet.getPhysicalNumberOfRows();for (int rowNum = 1; rowNum < rowCount; rowNum++) {Row rowData = sheet.getRow(rowNum);if (rowData != null) {// 讀取列int cellCount = rowTitle.getPhysicalNumberOfCells();for (int cellNum = 0; cellNum < cellCount; cellNum++) {System.out.print("[" + (rowNum + 1) + "-" + (cellNum + 1)+"]");Cell cell = rowData.getCell(cellNum);// 匹配數(shù)據(jù)的類型if (cell!=null){int cellType = cell.getCellType();String cellValue="";switch (cellType){case Cell.CELL_TYPE_STRING: // 字符串System.out.print("[String]");cellValue=cell.getStringCellValue();break;case Cell.CELL_TYPE_NUMERIC: //數(shù)字System.out.print("[numeric]");if (HSSFDateUtil.isCellDateFormatted(cell)){ //日期System.out.print("[日期]");Date date = cell.getDateCellValue();cellValue = new DateTime(date).toString();}else {// 不是日期格式,防止數(shù)字過長System.out.print("[轉(zhuǎn)換為字符串輸出]");cell.setCellType(Cell.CELL_TYPE_STRING);cellValue = cell.toString();}break;default:System.out.print("[數(shù)據(jù)類型錯誤!]");break;}System.out.println(cellValue);}}}}// 關(guān)閉流inputStream.close();}注意類型轉(zhuǎn)換!!
計算公式(了解即可)
@Testpublic void testWrite07BigDataSecond() throws Exception {// 時間long begin = System.currentTimeMillis();// 創(chuàng)建一個簿Workbook workbook = new SXSSFWorkbook();//創(chuàng)建表Sheet sheet = workbook.createSheet();//寫入數(shù)據(jù)for (int rowNum = 0; rowNum < 200000; rowNum++) {Row row = sheet.createRow(rowNum);for (int cellNum = 0; cellNum < 10; cellNum++) {Cell cell = row.createCell(cellNum);cell.setCellValue(cellNum);}}System.out.println("over");// 輸出文件FileOutputStream outputStream = new FileOutputStream(PATH + "testWrite07BigDataSecond.xlsx");workbook.write(outputStream);// 關(guān)閉流outputStream.close();// 清除臨時文件!((SXSSFWorkbook)workbook).dispose();long end = System.currentTimeMillis();System.out.println((double)(end-begin)/1000);}4.EasyExcel相關(guān)的操作
EasyExcel官方示例
導入依賴
<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>1.1.2-beat1</version> </dependency>寫入測試
對象
1.DemoData.java
/*** 最簡單的寫* <p>1. 創(chuàng)建excel對應(yīng)的實體對象 參照{(diào)@link DemoData}* <p>2. 直接寫即可*/ @Test public void simpleWrite() {// 寫法1String fileName = TestFileUtil.getPath() + "simpleWrite" + System.currentTimeMillis() + ".xlsx";// 上面那個fileName不一定非得按人家的格式寫,只要能保證該文件能確定一個文件就可以了// 這里 需要指定寫用哪個class去寫,然后寫到第一個sheet,名字為模板 然后文件流會自動關(guān)閉// 如果這里想使用03 則 傳入excelType參數(shù)即可/*他這個默認是xlsx格式的,第一個參數(shù)是文件名(絕對路徑),第二個參數(shù)是哪個模板,比如上面定義的DemoData對象sheet("模板") 是說生成的工作簿(fileName)中含有一個叫“模板”的表doWrite中的參數(shù) data()返回的就是需要寫入的數(shù)據(jù)!*/EasyExcel.write(fileName, DemoData.class).sheet("模板").doWrite(data()); }PS:我這里的data()是這樣寫的
private List<DemoData> data() {List<DemoData> list = new ArrayList<DemoData>();for (int i = 0; i < 10; i++) {DemoData data = new DemoData();data.setString("字符串" + i);data.setDate(new Date());data.setDoubleData(0.56);list.add(data);}return list;}2.測試寫入數(shù)據(jù)
@Test測試下吧
最終的結(jié)果
如案例圖所示
總結(jié)
以上是生活随笔為你收集整理的手把手教你用java读写excel表格文件(POI,EasyExcel)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sql server 模糊查询
- 下一篇: ASP面向对象编程探讨及比较