1. 程式人生 > >excel操作之poi-ooxml

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。好了,下面就貼上程式碼吧,註釋較多,就不多做囉嗦了。,前提是引入包:
   以下程式碼完全可以作為一個excel工具類遷移到自己的專案中:
  1. /** 
  2.  * 處理excel讀入的工具類 
  3.  * Created by Liujishuai on 2015/8/5. 
  4.  */
  5. publicclass ExcelUtils {  
  6.     /** 
  7.      * 要求excel版本在2007以上 
  8.      * 
  9.      * @param file 檔案資訊 
  10.      * @return 
  11.      * @throws Exception 
  12.      */
  13.     publicstatic List<List<Object>> readExcel(File file) 
    throws Exception {  
  14.         if(!file.exists()){  
  15.             thrownew Exception("找不到檔案");  
  16.         }  
  17.         List<List<Object>> list = new LinkedList<List<Object>>();  
  18.         XSSFWorkbook xwb = new XSSFWorkbook(new FileInputStream(file));  
  19.         // 讀取第一張表格內容
  20.         XSSFSheet sheet = xwb.getSheetAt(0
    );  
  21.         XSSFRow row = null;  
  22.         XSSFCell cell = null;  
  23.         for (int i = (sheet.getFirstRowNum() + 1); i <= (sheet.getPhysicalNumberOfRows() - 1); i++) {  
  24.             row = sheet.getRow(i);  
  25.             if (row == null) {  
  26.                 continue;  
  27.             }  
  28.             List<Object> linked = new LinkedList<Object>();  
  29.             for (int j = row.getFirstCellNum(); j <= row.getLastCellNum(); j++) {  
  30.                 Object value = null;  
  31.                 cell = row.getCell(j);  
  32.                 if (cell == null) {  
  33.                     continue;  
  34.                 }  
  35.                 switch (cell.getCellType()) {  
  36.                     case XSSFCell.CELL_TYPE_STRING:  
  37.                         //String型別返回String資料
  38.                         value = cell.getStringCellValue();  
  39.                         break;  
  40.                     case XSSFCell.CELL_TYPE_NUMERIC:  
  41.                         //日期資料返回LONG型別的時間戳
  42.                         if ("yyyy\"年\"m\"月\"d\"日\";@".equals(cell.getCellStyle().getDataFormatString())) {  
  43.                             //System.out.println(cell.getNumericCellValue()+":日期格式:"+cell.getCellStyle().getDataFormatString());
  44.                             value = DateUtils.getMillis(HSSFDateUtil.getJavaDate(cell.getNumericCellValue())) / 1000;  
  45.                         } else {  
  46.                             //數值型別返回double型別的數字
  47.                             //System.out.println(cell.getNumericCellValue()+":格式:"+cell.getCellStyle().getDataFormatString());
  48.                             value = cell.getNumericCellValue();  
  49.                         }  
  50.                         break;  
  51.                     case XSSFCell.CELL_TYPE_BOOLEAN:  
  52.                         //布林型別
  53.                         value = cell.getBooleanCellValue();  
  54.                         break;  
  55.                     case XSSFCell.CELL_TYPE_BLANK:  
  56.                         //空單元格
  57.                         break;  
  58.                     default:  
  59.                         value = cell.toString();  
  60.                 }  
  61.                 if (value != null && !value.equals("")) {  
  62.                     //單元格不為空,則加入列表
  63.                     linked.add(value);  
  64.                 }  
  65.             }  
  66.             if (linked.size()!= 0) {  
  67.                 list.add(linked);  
  68.             }  
  69.         }  
  70.         return list;  
  71.     }  
  72.     /** 
  73.      * 要求excel版本在2007以上 
  74.      * 
  75.      * @param fileInputStream 檔案資訊 
  76.      * @return 
  77.      * @throws Exception 
  78.      */
  79.     publicstatic List<List<Object>> readExcel(FileInputStream fileInputStream) throws Exception {  
  80.         List<List<Object>> list = new LinkedList<List<Object>>();  
  81.         XSSFWorkbook xwb = new XSSFWorkbook(fileInputStream);  
  82.         // 讀取第一張表格內容
  83.         XSSFSheet sheet = xwb.getSheetAt(1);  
  84.         XSSFRow row = null;  
  85.         XSSFCell cell = null;  
  86.         for (int i = (sheet.getFirstRowNum() + 1); i <= (sheet.getPhysicalNumberOfRows() - 1); i++) {  
  87.             row = sheet.getRow(i);  
  88.             if (row == null) {  
  89.                 continue;  
  90.             }  
  91.             List<Object> linked = new LinkedList<Object>();  
  92.             for (int j = row.getFirstCellNum(); j <= row.getLastCellNum(); j++) {  
  93.                 Object value = null;  
  94.                 cell = row.getCell(j);  
  95.                 if (cell == null) {  
  96.                     continue;  
  97.                 }  
  98.                 switch (cell.getCellType()) {  
  99.                     case XSSFCell.CELL_TYPE_STRING:  
  100.                         value = cell.getStringCellValue();  
  101.                         break;  
  102.                     case XSSFCell.CELL_TYPE_NUMERIC:  
  103.                         if ("yyyy\"年\"m\"月\"d\"日\";@".equals(cell.getCellStyle().getDataFormatString())) {  
  104.                             //System.out.println(cell.getNumericCellValue()+":日期格式:"+cell.getCellStyle().getDataFormatString());
  105.                             value = DateUtils.getMillis(HSSFDateUtil.getJavaDate(cell.getNumericCellValue())) / 1000;  
  106.                         } else {  
  107.                             //System.out.println(cell.getNumericCellValue()+":格式:"+cell.getCellStyle().getDataFormatString());
  108.                             value = cell.getNumericCellValue();  
  109.                         }  
  110.                         break;  
  111.                     case XSSFCell.CELL_TYPE_BOOLEAN:  
  112.                         value = cell.getBooleanCellValue();  
  113.                         break;  
  114.                     case XSSFCell.CELL_TYPE_BLANK:  
  115.                         break;  
  116.                     default:  
  117.                         value = cell.toString();  
  118.                 }  
  119.                 if (value != null && !value.equals("")) {  
  120.                     //單元格不為空,則加入列表
  121.                     linked.add(value);  
  122.                 }  
  123.             }  
  124.             if (linked.size()!= 0) {  
  125.                 list.add(linked);  
  126.             }  
  127.         }  
  128.         return list;  
  129.     }  
  130.     /** 
  131.      * 匯出excel 
  132.      * @param excel_name 匯出的excel路徑(需要帶.xlsx) 
  133.      * @param headList  excel的標題備註名稱 
  134.      * @param fieldList excel的標題欄位(與資料中map中鍵值對應) 
  135.      * @param dataList  excel資料 
  136.      * @throws Exception 
  137.      */
  138.     publicstaticvoid createExcel(String excel_name, String[] headList,  
  139. 相關推薦

    excel操作poi-ooxml

      目前市場上流行的對於excel處理的框架大致有兩種:poi和jxl。對於這兩種框架,我們可以做一個簡單的對比:    1 開發團隊:poi是Apache旗下的一個開源專案,由Apache官方維護,jxl好像是一個個人維護的開源專案。    2 各自優點:poi對公式

    Excel操作VLOOKUP函式

    1、作用   VLOOKUP函式是Excel中的一個縱向查詢函式,它與LOOKUP函式和HLOOKUP函式屬於一類函式,在工作中都有廣泛應用,例如可以用來核對資料,多個表格之間快速匯入資料等函式功能。功能是按列查詢,最終返回該列所需查詢列序所對應的值;與之對應的HLOOKUP是按行查詢的。 2、語法規則

    Excel操作VLOOKUP函數

    返回 col 模糊 表格 數據表 level lse 整數 .com 1、作用   VLOOKUP函數是Excel中的一個縱向查找函數,它與LOOKUP函數和HLOOKUP函數屬於一類函數,在工作中都有廣泛應用,例如可以用來核對數據,多個表格之間快速導入數據等函數功能。功能

    python學習,excel操作xlsxwriter常用操作

    xlsx mat 學習 常用操作 bsp one ota foo number from datetime import datetime import xlsxwriter #打開文件 workbook = xlsxwriter.Workbook(‘Expenses0

    Java操作ExcelPOI簡單例子

    comm last pre cto ada tabs cnblogs encrypted hssf 21 /** 22 * 利用POI操作Excel表單 23 * 24 * 需要jar包: 25 * HSSF針對03及以前版本,即.xls後綴

    javapoi操作excel-批量匯入匯出

        上一篇博文介紹了poi操作excel的基本讀寫操作後,接下來,介紹一下在專案中的實際用途:批量匯入、批量匯出功能。因為重點知識介紹批量匯入匯出excel功能,故而專案整體的搭建後臺用jdbc與struts2,前端頁面用jquery-easyui實現(其實也可以整合到s

    JavaWEB--POIEXCEL操作、優化、封裝詳解系列(一)--概述與原理

    鑑於現在部落格混雜臃腫,對POI技術講解得十分不不充分,讓本博主在開發優化時遭遇諸多大坑,為了讓後人更好製作企業級報表,我將在這一系列詳細解說這個以及羅列我所遇到的諸多問題。並且基於強大的POI技術寫一個輔助工具庫給大家。 本系列的所有程式碼均可以直接執行,請

    JavaWEB--POIEXCEL操作、優化、封裝詳解系列(三)--萬能POIEXCEL匯出工具--PoiExportUtil入門篇

    前面講完概述、原理以及helloworld,現在就講下怎樣的POI的EXCEL匯出工具可以適用於各種情況吧。後面再做個優化分頁的萬能POI之EXCEL匯出工具,本篇章先做個簡單的萬能POI之EXCEL匯出工具(博主已經抽象成庫,請於文末前去使用)。 文章結

    Python學習筆記-數據報表Excel操作模塊

    工作表 excel 字符串 python 利用Python操作Excel的模塊XlsxWriter,可以操作多個工作表的文字、數字、公式、圖表等。XlsxWriter模塊具有以下功能:100%兼容的Excel XLSX文件,支持Excel 2003、Excel 2007等版本;支持所有Ex

    Java讀寫ExcelPOI超入門(轉)

    num mov war copy rbo workbook mon move dropdown   Apache POI 是用Java編寫的免費開源的跨平臺的 Java API,Apache POI提供API給Java程式對Microsoft Office格式檔案讀和寫的功

    java poi excel操作 下拉菜單 及數據有效性

    合同 pda ear pre log mean color 名稱 ons 1 private InputStream updateTemplateStyleHSSF(InputStream inputStream,CsCustCon csCustCon) throws

    pythonexcel操作

    () 其中 import 基礎 excel 一個 效率 utils 操作 xlrd,xlwt和xlutils是用Python處理Excel文檔(*.xls)的高效率工具。其中,xlrd只能讀取xls,xlwt只能新建xls(不可以修改),xlutils能將xlrd.Book

    數據報表Excel操作模塊

    writer height num ring test 2.3 xls rst 屬性 目錄 數據報表之Excel操作模塊 一、介紹 二、安裝 三、模塊常用方法說明 四、簡單案例 數據報表之Excel操作模塊 一、介紹 利用Python操作Excel的模塊XlsxWr

    openpyxlexcel操作

    一、讀取excel中內容 1.匯入模組 : from openpyxl import load_workbook 2.開啟excel : workbook = load_workbook("python12.xlsx") 3.定位表單:  sheet = work

    Python Excel操作模組XlsxWriter插入圖片worksheet.insert_image

    worksheet.insert_image() insert_image(row, col, image[, options]) 在工作表單元格中插入一張圖片。 引數: row(int) - 單元格所在的行(索引從0開始計數) col(int) - 單元格所在的列(

    Apache的POI工具類讀寫Excel操作

    package com.shtel.cpc.data.poi.example; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.*; import

    Web使用Apache poiEXCEL操作(匯入)

    第一次嘗試Web專案上傳Excel資料進行匯入 如果有哪裡做的不對不好或者有更好的方法請聯絡我,謝謝 pom.xml中新增         <!-- https://mvnrepository.com/artifact/org.apache.poi/poi --&

    python操作Excel檔案openpyxl

    安裝和配置 安裝openpyxl模組: pip install openpyxl 若想使用插入圖片的功能: pip install pillow 知識點講解 workbook 工作薄:一個Excel 檔案是一個工作薄 worksheet 工作表:一個工作薄

    jxl 操作Excel表格Sheet

          這篇文章主要是講工作表相關的操作,包括得到單元格、工作表的相關屬性等。 import java.io.*; import java.util.regex.Pattern; import jxl.*; import jxl.read.biff.BiffExcep

    Java讀寫ExcelPOI超入門

    Apache POI 是建立和維護操作各種符合Office Open XML(OOXML)標準和微軟的OLE 2複合文件格式(OLE2)的Java API。用它可以使用Java讀取和建立,修改MS Excel檔案.而且,還可以使用Java讀取和建立MS Word和MSPowerPoint檔案。Apac