透過Java解析Excel檔案

也是一個工作中遇到的情境,很多單位想讓內部人員利用Excel維護資料(因為維護上比較簡單方便),且想讓這份資料透過網頁呈現給一般網友閱讀,所以整體後端的流程應該是:

  1. 將維護的Excel透過網頁介面上傳
  2. 將上傳的Excel轉換成XML
  3. 網頁去讀取這份XML來呈現

透過以上的三個步驟,就可以完成客戶想要效果。

本範例展示的是讀取Excel的XLS格式(新版Excel為XLSX格式),並轉換成陣列的方法(寫入XML在前面的範例就有了),我們選用讀取Excel的Library是Apache POI,而檔內已經有以下的資料,其中Total是公式欄位,計算Price x Quantity:

IDNamePriceQuantityTotal
100001產品名稱110550
100002產品名稱22010200
100003產品名稱33015450

以下是讀取的程式範例:

package CDIT.stanley;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Iterator;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;


public class excelToXMLFullSample {
	
	static ArrayList<ArrayList<String>> excelData = new ArrayList<ArrayList<String>>();
	
	public static void main (String[] args) throws FileNotFoundException{
		
		excelData.clear();
	    
	    String xlsPath = "C:\\Projects\\Javas\\sample.xls";
	    InputStream inputStream = null;
	    inputStream = new FileInputStream (xlsPath);
		POIFSFileSystem fileSystem = null;
	    try {
	        fileSystem = new POIFSFileSystem (inputStream);
			@SuppressWarnings("resource")
			HSSFWorkbook workBook = new HSSFWorkbook (fileSystem);
	        HSSFSheet sheet = workBook.getSheetAt (0);
	        Iterator<?> rows = sheet.rowIterator ();
	        
	        while (rows.hasNext ()){
	            HSSFRow row = (HSSFRow) rows.next();
	            Iterator<?> cells = row.cellIterator ();

	            ArrayList<String> rowData = new ArrayList<String>();
	            
	            while (cells.hasNext ()){
	                HSSFCell cell = (HSSFCell) cells.next();
	                
	                switch (cell.getCellTypeEnum()){
		                case STRING :{
		                    rowData.add(cell.getStringCellValue());
		                    break;
		                }
		                case NUMERIC : {
		                    rowData.add((int)cell.getNumericCellValue() + "");
			                break;
		                }
		                case FORMULA :{
		                	switch(cell.getCachedFormulaResultTypeEnum()) {
			                    case STRING:
			                    	rowData.add(cell.getStringCellValue ());
			                        break;
			                    case NUMERIC:
			                    	rowData.add((int)cell.getNumericCellValue() + "");
			                        break;
					default:
						rowData.add("");
						break;
		                	}
		                }		                
			default:
				rowData.add("");
				break;
	                }
	            }
	            excelData.add(rowData);
	        }
	    } catch(IOException e){
	        System.out.println("IOException " + e.getMessage());
	        System.out.println("轉換失敗,請檢查Excel檔案與格式是否正確");
	    }
	    for(int i=0 ; i<excelData.size(); i++){
	    	System.out.println("Excel Row "+ i +" Data : " + excelData.get(i));
	    }
	    
	}
}

程式會把Excel內的資料轉換為ArrayList,輸出內容如下:

Excel Row 0 Data : [Product ID, Product Name, Product Price, Quantity, Total]
Excel Row 1 Data : [100001, 產品名稱1, 10, 5, 50, ]
Excel Row 2 Data : [100002, 產品名稱2, 20, 10, 200, ]
Excel Row 3 Data : [100003, 產品名稱3, 30, 15, 450, ]

You may also like...

17,804 Responses

  1. вывод из запоя нижний новгород стационар вывод из запоя нижний новгород стационар .

  2. Though the Heed squandered one other lead, Crosby admitted that there have been some positives that came from the draw.

  3. RobertAcele表示:

    http://amoxilpharm.store/# AmoxilPharm

  4. FrankMar表示:

    buy minocycline 100mg: Ivermectin Pharm Store – Ivermectin Pharm

  5. After transferring to Houston, he united with Blue Ridge Baptist Church.

  6. A wake service can be held at 7:00 p.m.

  7. RobertAcele表示:

    https://gabapentinpharm.com/# neurontin 800 mg tablets best price

  8. The line isn’t a forcing draw if White does not play en passant, although White has little to no advantage and it is generally considered that there are better ways to play for advantage in the Berlin.

  9. The losses at Fort Lee positioned a heavy toll on Washington and the Continental Army.

  10. Clintonneurf表示:

    http://ivermectinpharm.store/# Ivermectin Pharm Store
    Paxlovid.ink [url=https://paxlovid.ink/#]buy paxlovid online[/url] Paxlovid.ink

  11. Отличный сайт! Всем рекомендую!маршрутизаторы

  12. Edwardwhogy表示:

    Buy semaglutide pills [url=https://semaglutidepharm.com/#]semaglutide pharm[/url] Buy compounded semaglutide online

  13. FrankMar表示:

    AmoxilPharm: AmoxilPharm – buy amoxicillin from canada

  14. hon 株価表示:

    Calif., who died there Tuesday.

  15. Wilbur Lutheran Church. Pastor Daniel Lee, Boline, and Pastor William Bash officiating.

  16. SEO TELEGRAM表示:

    I?m impressed, I must say. Really hardly ever do I encounter a blog that?s both educative and entertaining, and let me let you know, you have got hit the nail on the head. Your thought is excellent; the issue is one thing that not enough people are talking intelligently about. I am very completely happy that I stumbled throughout this in my search for something regarding this.

  17. I will immediately grab your rss as I can not find your email subscription link or e-newsletter service. Do you have any? Kindly let me know in order that I could subscribe. Thanks.

  18. After Momin’s spirit killed some of his personnel, Vader examined the mask and realized of Momin’s past, earlier than letting him possess the body of a Mustafarian and build a fortress for him.

  19. The second phase of the reopening course of was the yellow section, which called for aggressive mitigation and allowed some businesses to reopen while others should stay closed.

  20. FrankMar表示:

    Ivermectin Pharm: Ivermectin Pharm Store – minocycline 100 mg pills

  21. RobertAcele表示:

    https://gabapentinpharm.com/# Gabapentin Pharm

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。