日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

手把手教你用java读写excel表格文件(POI,EasyExcel)

發(fā)布時間:2024/7/19 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 手把手教你用java读写excel表格文件(POI,EasyExcel) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

視頻鏈接-我是學習之星我為狂神打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會報錯異常:

java.lang.IllegalArgumentException: Invalid row number (65536) outside allowable range (0..65535)

大文件寫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>

寫入測試


對象

@Data public class DemoData {@ExcelProperty("字符串標題")private String string;@ExcelProperty("日期標題")private Date date;@ExcelProperty("數(shù)字標題")private Double doubleData;/*** 忽略這個字段*/@ExcelIgnoreprivate String ignore; }

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。