1. 程式人生 > >POI 操作EXCEL(一)解析EXCEL 自動識別xls和xlsx

POI 操作EXCEL(一)解析EXCEL 自動識別xls和xlsx

這裡引用的jar包,一些jar是內部引用文科,有個是業務需求加入的的,引入的時候你們可以選擇性引入jar,在此不做剔除,我會在程式碼中附上引用。
對於大資料量的話excel來進行上傳操作視乎不如cvs效率高
初步測試excel八列簡單資料,在虛擬機器1.5G記憶體分配的情況下可以達到六萬條資料,再大的記憶體分配沒有嘗試
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.poi.POIXMLDocument;
import org.apache.poi.ss.usermodel.DataFormatter;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class Excel {
public static void main(String[] args) throws IOException {
		log("開始時間:" + new SimpleDateFormat("HH:mm:ss:SSS").format(new Date()));
		String filePath = "C:\\Users\\Administrator\\Desktop\\IBC\\貨幣流.xlsx";
		//驗證
		boolean boo = validateExcel(filePath);
		if (boo) {
			List<Map> list = readExcel2007(filePath);
		}else {
			List<Map> list = readExcelXls(filePath);
		}
		log("結束時間:" + new SimpleDateFormat("HH:mm:ss:SSS").format(new Date()));
	}
 * 驗證EXCEL檔案是否合法
	 */
	public static boolean validateExcel(String filePath) {


		/** 判斷檔名是否為空或者檔案是否存在 */
		if (!fileExist(filePath)) {
			err("檔案不存在");
			return false;
		}


		/** 檢查檔案是否是Excel格式的檔案 */
		if (!isExcel(filePath)) {
			err("檔名不是excel格式");
			return false;
		}
		 
		return isExcel2007(filePath);
	}
	/** 
     * 檢查檔案是否存在 
     */  
    public static boolean fileExist(String filePath){
    if(filePath == null || filePath.trim().equals("")) return false;
        File file = new File(filePath);  
        if (file == null || !file.exists()){  
            return false;  
        } 
    return true;
    }
	/**
	 * 依據字尾名判斷讀取的是否為Excel檔案
	 * 
	 * @param filePath
	 * @return
	 */
	public static  boolean isExcel(String filePath) {
		if (filePath.matches("^.+\\.(?i)(xls)$")
				|| filePath.matches("^.+\\.(?i)(xlsx)$")) {
			return true;
		}
		return false;
	}
	/***
	 * 讀取2007-2013格式   
	 * @param filePath 檔案路徑
	 * @return
	 * @throws IOException
	 * @DataTime 2016年10月13日18:01:02 
	 */
    @SuppressWarnings("rawtypes")  
    public static List<Map> readExcel2007(String filePath) throws IOException{  
        List<Map> valueList=new ArrayList<Map>();  
        FileInputStream fis =null;  
        try {  
            fis =new FileInputStream(filePath);  
            XSSFWorkbook xwb = new XSSFWorkbook(fis);   // 構造 XSSFWorkbook 物件,strPath 傳入檔案路徑  
            XSSFSheet sheet = xwb.getSheetAt(0);            // 讀取第一章表格內容  
            // 定義 row、cell  
            XSSFRow row;  
            // 迴圈輸出表格中的第一行內容   表頭  
            Map<Integer, String> keys=new HashMap<Integer, String>();  
            row = sheet.getRow(0);  
            if(row !=null){  
                //System.out.println("j = row.getFirstCellNum()::"+row.getFirstCellNum());  
                //System.out.println("row.getPhysicalNumberOfCells()::"+row.getPhysicalNumberOfCells());  
                for (int j = row.getFirstCellNum(); j <=row.getPhysicalNumberOfCells(); j++) {  
                    // 通過 row.getCell(j).toString() 獲取單元格內容,  
                    if(row.getCell(j)!=null){  
                        if(!row.getCell(j).toString().isEmpty()){  
                            keys.put(j, row.getCell(j).toString());  
                        }  
                    }else{  
                        keys.put(j, "K-R1C"+j+"E");  
                    }  
                }  
            }  
            // 迴圈輸出表格中的從第二行開始內容  
            for (int i = sheet.getFirstRowNum() + 1; i <= sheet.getPhysicalNumberOfRows(); i++) {  
                row = sheet.getRow(i);  
                if (row != null) {  
                    boolean isValidRow = false;  
                    Map<String, Object> val = new HashMap<String, Object>();  
                    for (int j = row.getFirstCellNum(); j <= row.getPhysicalNumberOfCells(); j++) {  
                        XSSFCell cell = row.getCell(j);  
                        if (cell != null) {  
                            String cellValue = null;  
                            if(cell.getCellType()==XSSFCell.CELL_TYPE_NUMERIC){  
                                if(DateUtil.isCellDateFormatted(cell)){  
                                    cellValue = new DataFormatter().formatRawCellContents(cell.getNumericCellValue(), 0, "yyyy-MM-dd HH:mm:ss");  
                                }  
                                else{  
                                    cellValue = String.valueOf(cell.getNumericCellValue());  
                                }  
                            }  
                            else{  
                                cellValue = cell.toString();  
                            }  
                            if(cellValue!=null&&cellValue.trim().length()<=0){  
                                cellValue=null;  
                            }  
                            val.put(keys.get(j), cellValue);  
                            if(!isValidRow && cellValue!= null && cellValue.trim().length()>0){  
                                isValidRow = true;  
                            }  
                        }  
                    }  
  
                    // 第I行所有的列資料讀取完畢,放入valuelist  
                    if (isValidRow) {  
                        valueList.add(val);  
                    }  
                }  
            }  
        } catch (IOException e) {  
            e.printStackTrace();  
        } catch (Exception e) {
        	e.printStackTrace();
        }finally {  
            fis.close();  
        }  
        return valueList;  
    }  
    /**讀取老版本格式*/
    public static List<Map> readExcelXls(String filePath){
    	
    	return null;
    };
    /**
   	 * 依據內容判斷是否為excel2007及以上
   	 */
   	public static  boolean isExcel2007(String filePath) {
   		try {
   			BufferedInputStream bis = new BufferedInputStream(
   					new FileInputStream(filePath));
   			if (POIXMLDocument.hasOOXMLHeader(bis)) {
   				System.out.println("Excel版本為excel2007及以上");
   				return true;
   			}
   		} catch (IOException e) {
   			e.printStackTrace();
   			return false;
   		}
   		return false;
   	}
   	
   	private static void log(String value){
   		System.out.println(value);
   	}
   	private static void err(String value){
   		System.err.println(value);
   	}
}


相關推薦

POI 操作EXCEL解析EXCEL 自動識別xlsxlsx

這裡引用的jar包,一些jar是內部引用文科,有個是業務需求加入的的,引入的時候你們可以選擇性引入jar,在此不做剔除,我會在程式碼中附上引用。 對於大資料量的話excel來進行上傳操作視乎不如cvs效率高 初步測試excel八列簡單資料,在虛擬機器1.5G記憶體分配的情況

Python利用openpyxl來操作Excel

最近一直在做專案裡的自動化的工作,為了是從繁瑣重複的勞動中掙脫出來,把精力用在資料分析上。自動化方面python是在好不過了,不過既然要提交報表, 就不免要美觀什麼的。pandas雖然很強大,但是無法對Excel完全操作,現學vba有點來不及。於是就找到這個openpyxl包,用python

Java POI 匯出Excel

序言上篇序言已經說明了我為什麼要寫這個教程了,如果想知道請戳這個連結:序言。那麼廢話就不多說開始吧。POI Maven 依賴 <dependencies> <dependency> <groupId>org.apache.poi&

POI匯出Excel

匯出樣式如下: ======================================================================================== 工具類: package com.util; import java.io

JAVA POI 應用系列1--生成Excel

需要 void system 版本 stream 邊框 模式 格式 字體 POI簡介(官網:http://poi.apache.org/) Apache POI是Apache軟件基金會的開放源碼函式庫,POI提供API給Java程序對Microsoft Office

C#導入導出Excel

bject gpo tel collect lean type close 表格 excel導入 C#操作Excel導入導出方法一,根據項目要求,對Excel操作有多重方法,有的是類庫自己編程設計格式,有的是JS根據表格的格式樣式直接導出。 現在介紹的是直接下載型: 根據

步地教你實現OLE讀取EXCEL

#include "stdafx.h" #include "CExcelFileRead.h" COleVariant covTrue((short)TRUE), covFalse((short)FALSE), covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERRO

用Python讀取Word文件並寫入Excel

工作中經常要處理大量的word文件,大部分內容都很簡單,比如說做一個彙總表,從發來的word文件裡提取名字、聯絡方式、地址等資訊,提取完之後還需要用Excel做彙總,對於十幾份的文件尚好,但對於成百份,

C# 讀寫文字檔案並匯入Excel

一、本程式的主要思想    利用ReadAllText和WriteAllText方法讀寫文字檔案,並且把他們以逗號分隔,形成能被Excel直接匯入並且分列的資料。 二、程式的執行結果    執行前,必須在相應目錄建立文字檔案,方便程式的讀寫。程式執行前的資料如圖:   程

C#中操作Excel4—— 向Excel中插入兩種圖表以及設定圖表格式

一、引言         本文主要討論下向Excel中插入圖表的兩種方式。在Excel中圖表是有兩種級別的,一種是和sheet同級別的圖表,也就是說整個excel的標籤頁就是一個圖表;還有一種就是我們最常使用的在一個sheet中插入的圖表,我們姑且叫它sheet子圖表。這

30天自制操作系統從計算機結構到匯編程序入門

ios 是什麽 program 信號 解釋 根目錄 自己 保存 音樂 學習這本書不代表我要親自動手把這本書中的代碼敲一遍哦,只是借機來學習一下操作系統。之前有段時間也在看操作系統的知識,怎麽說呢之前的看的書都是偏講理論多一些,對於我這個非科班出身的來說,由於之前的計算機知識

python記錄—入門到實踐—字符串操作

span java、 浮點 大寫 數位 tab cnblogs 保留小數 字符串操作 我就跟著書學,總結執行要記錄的,不要覺得簡單就不去試一試,敲一敲代碼。執行力是成為好的程序員的寶劍。如果你是新手在掌握其他的語言情況下比如java、c或者php等等任意一種基本語法,程序都

Android系統啟動流程解析init進程啟動過程

option 寫入 android change failed miss 通知 target sna 前言 作為“Android框架層”這個大系列中的第一個系列,我們首先要了解的是Android系統啟動流程,在這個流程中會涉及到很多重要的知識點,這個系列我們就來一一講解它們

原子操作原子操作類詳細介紹

expected 文章 span del 也有 pair 上一個 ride 操作類 引言 ??Java從JDK1.5開始提供了java.util.concurrent.atomic包,方便程序員在多線程環境下,無鎖的進行原子操作。原子變量的底層使用了處理器提供的原子指令,但

Python操作MySQL PyMysql篇

pymysql mysqldb python mysql pymsql是Python中操作MySQL的模塊,其使用方法和MySQLdb幾乎相同,但是mysqldb不支持Python3 下載安裝 pip3 install pymysql 使用操作 1. 執行sql #!/usr/bin/env p

python之操作mysql

mod 它的 utf8 連接數 mode char PE class 是個 使用python操作mysql的思路: 1. 連接數據庫:ip,端口號,密碼,賬號,數據庫 2. 建立遊標 3.執行sql語句 4.獲取執行結果 5.關閉遊標,關閉連接 conn = pymysql

python操作json

數字 其他 是不是 print employee ict 語法規則 浮點 3.0 Python 操作jsonJson語法規則:數據在名稱/值對中數據由逗號分隔花括號保存對象方括號保存數組Json字符串本質上是一個字符串,用單引號表示 Json數據的書寫格式名稱--值對,包括

DOM操作總結

UNC 標簽 頁面加載 當前 urn 對象 自己的 var ole (一)innerText 凡是成對的標簽,中間的文本內容,設置的時候,都是用innerText這個屬性方法 (二)在某個元素的事件中,自己的事件中的this就是當前的這個元素對象 var btn=ducou

Python 二級模擬操作

中國 正方 range 進制數 存儲 字符 light 包含 pri 1.計算下列式子,結果保留小數點後保留3位 代碼: >>> x = pow((3**4 + 5*(6**7))/8, 0.5) >>> print("%.

node總結之檔案操作系列

Node.js 提供一組類似 UNIX(POSIX)標準的檔案操作API,我們來看下Node 匯入檔案系統模組(fs)語法,如下: var fs = require("fs") Node.js 檔案系統(fs 模組)模組中的方法均有非同步和同步版本,例如讀取檔案內容的函式有非同步的 fs