excel操作之poi-ooxml


目前市場上流行的對於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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM