目前市場上流行的對於excel處理的框架大致有兩種:poi和jxl。對於這兩種框架,我們可以做一個簡單的對比:
1 開發團隊:poi是Apache旗下的一個開源項目,由Apache官方維護,jxl好像是一個個人維護的開源項目。
2 各自優點:poi對公式支持較好,jxl不算好 。jxl提供對圖片的支持(僅僅PNG格式),poi支持。(就這一條來看財務軟件就該選poi,而媒體類的軟件就該選jxl了)
3 內存消耗:由於jxl在對資源回收利用方面做了相當的功課,在內存消耗上jxl是略勝於poi的。所以對於大數據量的軟件導入來說,選擇jxl是比較合算的,當然數據量小的基本沒有差別。
4 運行速度: 估計是內存消耗多的緣故,poi對於讀寫速度這一功能做的好像比jxl好了不少,並且支持壓縮excel。
對比了這么多,對於自己項目該使用哪個框架,應該也十分明顯了(當然這些也都是從網上搜集來的,不保證有錯誤的地方)。
這里我記錄一下poi的使用吧,都挺簡單的,基本原理都是將excel表格數據提取出來組成一個list。然后對應這個list自己去做循環對應自己數據表的數據就行了。需要說明的一點是如果是數字類型的話,讀出來的數據一般都是以double類型返回給你的,比如你在excel里面寫的是100,讀取出來的數據就是100.0.這點比較煩人,當然自己做一下處理就好了。
還有一點就是poi也有兩個不同的jar包,分別是處理excel2003和excel2007+的,對應的是poi和poi-ooxml。畢竟poi-ooxml是poi的升級版本,處理的單頁數據量也是百萬級別的,所以我們選擇的也是poi-ooxml。好了,下面就貼上代碼吧,注釋較多,就不多做啰嗦了。,前提是引入包:
<!--poi對excel2007以上版本的支持-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.12</version>
</dependency>
以下代碼完全可以作為一個excel工具類遷移到自己的項目中:
/** * 處理excel讀入的工具類 * Created by Liujishuai on 2015/8/5. */ public class ExcelUtils { /** * 要求excel版本在2007以上 * * @param file 文件信息 * @return * @throws Exception */ public static List<List<Object>> readExcel(File file) throws Exception { if(!file.exists()){ throw new Exception("找不到文件"); } List<List<Object>> list = new LinkedList<List<Object>>(); XSSFWorkbook xwb = new XSSFWorkbook(new FileInputStream(file)); // 讀取第一張表格內容 XSSFSheet sheet = xwb.getSheetAt(0); XSSFRow row = null; XSSFCell cell = null; for (int i = (sheet.getFirstRowNum() + 1); i <= (sheet.getPhysicalNumberOfRows() - 1); i++) { row = sheet.getRow(i); if (row == null) { continue; } List<Object> linked = new LinkedList<Object>(); for (int j = row.getFirstCellNum(); j <= row.getLastCellNum(); j++) { Object value = null; cell = row.getCell(j); if (cell == null) { continue; } switch (cell.getCellType()) { case XSSFCell.CELL_TYPE_STRING: //String類型返回String數據 value = cell.getStringCellValue(); break; case XSSFCell.CELL_TYPE_NUMERIC: //日期數據返回LONG類型的時間戳 if ("yyyy\"年\"m\"月\"d\"日\";@".equals(cell.getCellStyle().getDataFormatString())) { //System.out.println(cell.getNumericCellValue()+":日期格式:"+cell.getCellStyle().getDataFormatString()); value = DateUtils.getMillis(HSSFDateUtil.getJavaDate(cell.getNumericCellValue())) / 1000; } else { //數值類型返回double類型的數字 //System.out.println(cell.getNumericCellValue()+":格式:"+cell.getCellStyle().getDataFormatString()); value = cell.getNumericCellValue(); } break; case XSSFCell.CELL_TYPE_BOOLEAN: //布爾類型 value = cell.getBooleanCellValue(); break; case XSSFCell.CELL_TYPE_BLANK: //空單元格 break; default: value = cell.toString(); } if (value != null && !value.equals("")) { //單元格不為空,則加入列表 linked.add(value); } } if (linked.size()!= 0) { list.add(linked); } } return list; } /** * 要求excel版本在2007以上 * * @param fileInputStream 文件信息 * @return * @throws Exception */ public static List<List<Object>> readExcel(FileInputStream fileInputStream) throws Exception { List<List<Object>> list = new LinkedList<List<Object>>(); XSSFWorkbook xwb = new XSSFWorkbook(fileInputStream); // 讀取第一張表格內容 XSSFSheet sheet = xwb.getSheetAt(1); XSSFRow row = null; XSSFCell cell = null; for (int i = (sheet.getFirstRowNum() + 1); i <= (sheet.getPhysicalNumberOfRows() - 1); i++) { row = sheet.getRow(i); if (row == null) { continue; } List<Object> linked = new LinkedList<Object>(); for (int j = row.getFirstCellNum(); j <= row.getLastCellNum(); j++) { Object value = null; cell = row.getCell(j); if (cell == null) { continue; } switch (cell.getCellType()) { case XSSFCell.CELL_TYPE_STRING: value = cell.getStringCellValue(); break; case XSSFCell.CELL_TYPE_NUMERIC: if ("yyyy\"年\"m\"月\"d\"日\";@".equals(cell.getCellStyle().getDataFormatString())) { //System.out.println(cell.getNumericCellValue()+":日期格式:"+cell.getCellStyle().getDataFormatString()); value = DateUtils.getMillis(HSSFDateUtil.getJavaDate(cell.getNumericCellValue())) / 1000; } else { //System.out.println(cell.getNumericCellValue()+":格式:"+cell.getCellStyle().getDataFormatString()); value = cell.getNumericCellValue(); } break; case XSSFCell.CELL_TYPE_BOOLEAN: value = cell.getBooleanCellValue(); break; case XSSFCell.CELL_TYPE_BLANK: break; default: value = cell.toString(); } if (value != null && !value.equals("")) { //單元格不為空,則加入列表 linked.add(value); } } if (linked.size()!= 0) { list.add(linked); } } return list; } /** * 導出excel * @param excel_name 導出的excel路徑(需要帶.xlsx) * @param headList excel的標題備注名稱 * @param fieldList excel的標題字段(與數據中map中鍵值對應) * @param dataList excel數據 * @throws Exception */ public static void createExcel(String excel_name, String[] headList, String[] fieldList, List<Map<String, Object>> dataList) throws Exception { // 創建新的Excel 工作簿 XSSFWorkbook workbook = new XSSFWorkbook(); // 在Excel工作簿中建一工作表,其名為缺省值 XSSFSheet sheet = workbook.createSheet(); // 在索引0的位置創建行(最頂端的行) XSSFRow row = sheet.createRow(0); // 設置excel頭(第一行)的頭名稱 for (int i = 0; i < headList.length; i++) { // 在索引0的位置創建單元格(左上端) XSSFCell cell = row.createCell(i); // 定義單元格為字符串類型 cell.setCellType(XSSFCell.CELL_TYPE_STRING); // 在單元格中輸入一些內容 cell.setCellValue(headList[i]); } // =============================================================== //添加數據 for (int n = 0; n < dataList.size(); n++) { // 在索引1的位置創建行(最頂端的行) XSSFRow row_value = sheet.createRow(n + 1); Map<String, Object> dataMap = dataList.get(n); // =============================================================== for (int i = 0; i < fieldList.length; i++) { // 在索引0的位置創建單元格(左上端) XSSFCell cell = row_value.createCell(i); // 定義單元格為字符串類型 cell.setCellType(XSSFCell.CELL_TYPE_STRING); // 在單元格中輸入一些內容 cell.setCellValue((dataMap.get(fieldList[i])).toString()); } // =============================================================== } // 新建一輸出文件流 FileOutputStream fos = new FileOutputStream(excel_name); // 把相應的Excel 工作簿存盤 workbook.write(fos); fos.flush(); // 操作結束,關閉文件 fos.close(); } }
————————————————
版權聲明:本文為CSDN博主「jeyson」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/js_sky/article/details/47334833
