Java POI 以Xlsx Excel 為實務範例,包含讀取、寫入及合併欄位舉例

four bots

Java POI 以Xlsx Excel 為實務範例,包含讀取、寫入及合併欄位舉例


四筒老師本篇文章是經驗之談,因為沒有學校教學上會以基本功夫以外來實際開發專案來作範例,所以說明此舉是大多數現在開發系統的成員都必需會讀取或寫入檔案的經驗之談,四筒老師也不例外,但是,老師用發布這篇文章的最新POI 的jar 檔案來範例是屬於Java 主語言。假如,是用C# 請利用關鍵詞如下:c# npoi dll download。

POI-4.1.2 所需使用參考檔案清單項目

建立寫入Excel 程式範例

package com.bots.four.excel;

import java.io.FileOutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.ss.util.RegionUtil;
import org.apache.poi.xssf.usermodel.*;

/**
 * 寫入Excel
 * */
public class WriterExample01 {

	/**
	 *  時間序號
	 * */
	private static String getTimeNumber() {
		String pattern = "yyyyMMddHHmmssSSS";
		SimpleDateFormat d = new SimpleDateFormat(pattern);
		return d.format(new Date());
	}
	
	public static void main(String[] args) {
				
		@SuppressWarnings("resource")
		// 新建工作簿
		XSSFWorkbook book = new XSSFWorkbook();
		// 建立工作表
		XSSFSheet sheet = book.createSheet("Books");

		Object[][] buffer = { 
				{ "Head First Java", "Kathy Serria", 79 }, 
				{ "Effective Java", "Joshua Bloch", 36 },
				{ "Clean Code", "Robert martin", 42 }, 
				{ "Thinking in Java", "Bruce Eckel", 35 }, 
				};

		int rowIdx = -1;
		int colIdx = -1;
		
		CellRangeAddress cellAddr;
		int firstRow, lastRow, firstCol, lastCol;
		
		XSSFRow row;
		XSSFCell cell;
		for (Object[] arrs : buffer) {
			// 建立行
			row = sheet.createRow(++rowIdx);
			firstRow = lastRow = rowIdx;

			colIdx = -1;
			firstCol = (colIdx + 1);
			for (Object field : arrs) {
				// 建立單元格
				cell = row.createCell(++colIdx);
				
				// 單元格寫入內容
				if (field instanceof String) {
					cell.setCellValue((String) field);
				} else if (field instanceof Integer) {
					cell.setCellValue((Integer) field);
				}
			}
			lastCol = colIdx;
			
			// BorderStyle.THICK 粗邊框
			cellAddr = new CellRangeAddress(firstRow, lastRow, firstCol, lastCol);
			RegionUtil.setBorderBottom(BorderStyle.THICK, cellAddr, sheet);
		}

		// 指定檔案名稱
		String fileName = "JavaBooks_%1$s.xlsx";
	    fileName = String.format(fileName, getTimeNumber());
		
	    /*
		 * 尚未指定檔案路徑,檔案建立在本執行專案內
		 * 儲存工作簿
		 * */
	    try (FileOutputStream os = new FileOutputStream(fileName)) {
			book.write(os);
			System.out.println(fileName + " excel export finish.");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

產生檔案結果內容:


讀取Excel 檔案程式範例

讀取測試檔案內容:

package com.bots.four.excel;

import java.io.FileInputStream;

import org.apache.poi.ss.usermodel.CellType;
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 ReadExample02 {

	public static void main(String[] args) {
		
		FileInputStream input = null;		
		String fileName = "TestRead.xlsx";
		
		try {
			input = new FileInputStream(fileName);
			
			@SuppressWarnings("resource")
			XSSFWorkbook book = new XSSFWorkbook(input);
			
			XSSFSheet sheet = book.getSheetAt(0);
			XSSFRow row = sheet.getRow(0);
			
			XSSFCell cell = null;
			String title = "讀取單元格內容: ";
			for(int i = 0; i< 3; i++) {
				cell = row.getCell(i);
				
				if (cell.getCellType() == CellType.STRING) {
                    System.out.println(title + cell.getStringCellValue());
                } else if (cell.getCellType() == CellType.NUMERIC) {
                    System.out.println(title + cell.getNumericCellValue());
                }
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

結果顯示內容:


建立寫入Excel 程式範例,含字型、顏色、框線、自動換行、內容置中及合併儲存格

package com.bots.four.excel;

import java.io.FileOutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.*;

public class WriterExample03 {

	/**
	 * 時間序號
	 */
	private static String getTimeNumber() {
		String pattern = "yyyyMMddHHmmssSSS";
		SimpleDateFormat d = new SimpleDateFormat(pattern);
		return d.format(new Date());
	}

	public static void main(String[] args) {

		@SuppressWarnings("resource")
		XSSFWorkbook book = new XSSFWorkbook();

		Font titlefont = book.createFont();
		titlefont.setColor(IndexedColors.BLACK.getIndex());// 顏色
		titlefont.setBold(true); // 粗體

		CellStyle style01 = book.createCellStyle();
		style01.setFillForegroundColor(IndexedColors.LIGHT_GREEN.getIndex());// 填滿顏色
		style01.setFillPattern(FillPatternType.SOLID_FOREGROUND);
		style01.setFont(titlefont);// 設定字體
		style01.setAlignment(HorizontalAlignment.CENTER);// 水平置中
		style01.setVerticalAlignment(VerticalAlignment.CENTER);// 垂直置中

		// 設定框線
		style01.setBorderBottom(BorderStyle.THIN);
		style01.setBorderTop(BorderStyle.THIN);
		style01.setBorderLeft(BorderStyle.THIN);
		style01.setBorderRight(BorderStyle.THIN);
		style01.setWrapText(true);// 自動換行

		CellStyle style02 = book.createCellStyle();
		style02.setAlignment(HorizontalAlignment.CENTER);// 水平置中
		style02.setVerticalAlignment(VerticalAlignment.CENTER);// 垂直置中
		style02.setBorderBottom(BorderStyle.THICK);
		style02.setBorderTop(BorderStyle.THICK);
		style02.setBorderLeft(BorderStyle.THICK);
		style02.setBorderRight(BorderStyle.THICK);
		style02.setWrapText(true);// 自動換行

		XSSFSheet sheet1 = book.createSheet("工作表1");

		XSSFRow titlerow = sheet1.createRow(0);
		for (int i = 0; i < 6; i++) {
			XSSFCell cell = titlerow.createCell(i);
			cell.setCellStyle(style01);
			cell.setCellValue("標題 Cell 0 " + i);
			// sheet1.autoSizeColumn(i); // 自動調整欄位寬度
		}

		for (int x = 1; x < 10; x++) {
			XSSFRow row = sheet1.createRow(x);

			for (int y = 0; y < 6; y++) {
				XSSFCell cell = row.createCell(y);
				cell.setCellStyle(style02);

				cell.setCellValue("中文 Cell " + x + " " + y);
				// sheet1.autoSizeColumn(y); // 自動調整欄位寬度
			}

			XSSFCell cell = row.createCell(5);
			cell.setCellValue(100);
			cell.setCellStyle(style02);
			// sheet1.autoSizeColumn(5);
		}

		XSSFSheet sheet2 = book.createSheet("工作表2");
		for (int x = 0; x < 5; x++) {
			XSSFRow row = sheet2.createRow(x);

			for (int y = 0; y < 5; y++) {
				XSSFCell cell = row.createCell(y);

				if (x == 0) {
					cell.setCellStyle(style01);
				} else {
					cell.setCellStyle(style02);
				}

				cell.setCellValue("中文 title " + x + " " + y);

				// sheet2.autoSizeColumn(y); // 自動調整欄位寬度
			}
		}

		// 指定檔案名稱
		String fileName = "Test_%1$s.xlsx";
		fileName = String.format(fileName, getTimeNumber());

		/*
		 * 尚未指定檔案路徑,檔案建立在本執行專案內 儲存工作簿
		 */
		try (FileOutputStream os = new FileOutputStream(fileName)) {
			book.write(os);
			System.out.println(fileName + " excel export finish.");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

產生檔案結果:工作表1

產生檔案結果:工作表2


本篇文章介紹Apache POI的API,其中有關重要的工作,使用Java程序操作Excel文件有下面幾個類別及方法。

活頁簿

這是建立或維護Excel活頁簿的所有類別的對接。它屬於org.apache.poi.ss.usermodel組件。是實現此對接的兩個類別,如下所示:

  • HSSFWorkbook : 這個類別有讀取和.xls 格式和寫入Microsoft Excel文件的方法。﹝MS-Office97-2003版本兼容﹞
  • XSSFWorkbook : 這個類別有讀寫Microsoft Excel和OpenOffice的XML文件的格式.xls或.xlsx的方法。﹝MS-Office版本2007以上版本兼容﹞四筒老師推薦用此類別兩者都可使用

HSSFWorkbook

它是在org.apache.poi.hssf.usermodel組件的高層次的類別。它實現了Workbook 對接,用於Excel文件中的.xls格式。下面列出的是一些本類別下的方法和構造函數。

類別的構造函數

No. 構造函數和說明
1 HSSFWorkbook() 從頭開始建立一個新的HSSFWorkbook對象時。
2 HSSFWorkbook(DirectoryNode directory, boolean preserveNodes) 建立一個特定的目錄中一個新的HSSFWworkbook對象。
3 HSSFWorkbook(DirectoryNode directory, POIFSFileSystem fs, boolean preserveNodes) 給定一個POIFSFileSystem對象和特定的目錄中,它建立了一個SSFWorkbook對象讀取指定的活頁簿。
4 HSSFWorkbook(java.io.InputStream s) 建立使用輸入流中的新HSSFWorkbook對象時。
5 HSSFWorkbook(java.io.InputStream s, boolean preserveNodes) 構建在輸入流的POI文件系統。
6 HSSFWorkbook(POIFSFileSystem fs) 使用POIFSFileSystem對象構造的新HSSFWorkbook對象時。
7 HSSFWorkbook(POIFSFileSystem fs, boolean preserveNodes) 給定一個POIFSFileSystem對象時,它會建立一個新的HSSFWorkbook對象時讀取指定的活頁簿。

這些構造內的常用參數:

  • directory:這是從POI文件系統處理的目錄。
  • fs :它是組件含活頁簿流該POI的文件系統。
  • preservenodes : 這是決定是否保留其他節點像宏的可選參數。它消耗大量的內存,因爲它存儲在內存中的所有POIFileSystem(如果設置)。

注意:HSSFWorkbook類別組件含了許多方法;然而,它們僅與XLS格式兼容。在本章教學中,重點是在Excel文件格式的最新版本。因此,HSSFWorkbook類別的方法,這裡沒有列出。

如果需要這些類別的方法,那麼請參照POI-HSSFWorkbook類別API在 https://poi.apache.org/apidocs/org/apache/poi/hssf/usermodel/HSSFWorkbook.html.

XSSFWorkbook

它是用於表示高和低層次Excel文件格式的類別。它屬於org.apache.xssf.usemodel組件,並實現Workbook對接。下面列出的是這個類別的方法和構造函數。

類別的構造函數

No. 構造函數和說明
1 XSSFWorkbook() 從頭開始建立一個新的XSSFworkbook對象。
2 XSSFWorkbook(java.io.File file) 構造從給定文件中的XSSFWorkbook對象。
3 XSSFWorkbook(java.io.InputStream is) 構造一個XSSFWorkbook對象,通過緩衝整個輸入流到內存中,然後爲它打開一個OPCPackage對象。
4 XSSFWorkbook(java.lang.String path) 構建一個給定文件的完整路徑的XSSFWorkbook對象。

類別方法

No. 方法及描述
1 createSheet() 建立一個XSSFSheet本活頁簿,將其加入到表,並返回高層表示。
2 createSheet(java.lang.String sheetname) 建立此活頁簿的新表,並返回高層表示。
3 createFont() 建立一個新的字體,並將其加入到活頁簿的字體表。
4 createCellStyle() 建立一個新的XSSFCellStyle並將其加入到活頁簿的樣式表。
5 createFont() 建立一個新的字體,並將其加入到活頁簿的字體表。
6 setPrintArea(int sheetIndex, int startColumn, int endColumn, int startRow,int endRow) 設置一個給定的表按照指定參數的打印區域。

Sheet

Sheet是在org.apache.poi.ss.usermodel組件的對接,它是建立具有特定名稱的高或低級別的電子表格的所有類別的對接。電子表格的最常見的類別型是工作表,它被表示爲單元的網格。

HSSFSheet

這是在org.apache.poi.hssf.usermodel組件的類別。它可以建立Excel電子表格,它允許在sheet 方式和表數據格式。

類別的構造函數

No. 構造函數及描述
1 HSSFSheet(HSSFWorkbook workbook) 建立新HSSFSheet通過調用HSSFWorkbook從頭開始建立一個表。
2 HSSFSheet(HSSFWorkbook workbook, InternalSheet sheet) 建立HSSFSheet表示給定表對象。

XSSFSheet

這是代表了Excel電子表格的高級類別代表之一類別。這在org.apache.poi.hssf.usermodel組件下。

類別的構造函數

No. 構造函數及描述
1 XSSFSheet() 創造了新的XSSFSheet- 調用XSSFWorkbook從頭開始建立一個表。
2 XSSFSheet(PackagePart part, PackageRelationship rel) 建立XSSFSheet表示給定組件的一部分和關係。

類別方法

No. 方法和描述
1 addMergedRegion(CellRangeAddress region) 加入單元的合併區域(因此這些單元格合併形成一個)。
2 autoSizeColumn(int column) 調整列寬,以適應的內容。
3 iterator() 此方法是用於rowIterator()的別名,以允許foreach循環
4 addHyperlink(XSSFHyperlink hyperlink) 註冊超鏈接的集合中的超鏈接此工作表格上

這是在org.apache.poi.ss.usermodel組件的對接。它是用於一排的電子表格的高層表示。它是代表了POI庫的行所有類別的對接。

XSSFRow

這是在org.apache.poi.xssf.usermodel組件的類別。它實現了Row對接,因此它可以在電子表格中建立行。下面列出的是這個類別在方法和構造函數。

類別方法

No. 描述
1 createCell(int columnIndex) 建立新單元行並返回。
2 setHeight(short height) 設置短單位的高度。

單元格

這是在org.apache.poi.ss.usermodel組件的對接。它是代表了單元在電子表格中的行中的所有類別的對接。

單元格可以使用各種屬性,例如空白,數字,日期,錯誤等單元格被加入到一個行之前應具有(基於0)自己的編號。

XSSFCell

這是在 org.apache.poi.xssf.usermodel組件的類別。它實現了單元格介面。它是單元在電子表格中的行的一個高層次的表示。

字段摘要

下面列出的是一些XSSFCell類別的字段以及它們的描述。

單元格類別型 描述
CELL_TYPE_BLANK 代表空白單元格
CELL_TYPE_BOOLEAN 代表布爾單元(true或false)
CELL_TYPE_ERROR 表示在單元的誤差值
CELL_TYPE_FORMULA 表示一個單元格公式的結果
CELL_TYPE_NUMERIC 表示對一個單元的數字數據
CELL_TYPE_STRING 表示對一個單元串(文本)

類別方法

No. 描述
1 setCellStyle(CellStyle style) 爲單元格設置樣式。
2 setCellType(int cellType) 設置單元格的類別型(數字,公式或字符串)。
3 setCellValue(boolean value) 設置單元格一個布爾值
4 setCellValue(java.util.Calendar value) 設置一個日期值的單元格。
5 setCellValue(double value) 設置爲單元格的數值。
6 setCellValue(java.lang.String str) 設置爲單元格的字符串值。
7 setHyperlink(Hyperlink hyperlink) 分配超鏈接到該單元格。

XSSFCellStyle

這是在org.apache.poi.xssf.usermodel組件的類別。它將提供關於在電子表格的單元格中的內容的格式可能的信息。它也提供了用於修正該格式的選項。它實現了CellStyle對接。

字段摘要

下表列出了從CellStyle對接繼承一些字段。

字段名稱 字段描述
ALIGN_CENTER 中心對齊單元格內容
ALIGN_CENTER_SELECTION 中心選擇水平對齊方式
ALIGN_FILL 單元格適應於內容的大小
ALIGN_JUSTIFY 適應單元格內容的寬度
ALIGN_LEFT 左對齊單元格內容
ALIGN_RIGHT 右對齊單元格內容
BORDER_DASH_DOT 使用破折號和點單元格樣式
BORDER_DOTTED 用虛線邊框的單元格樣式
BORDER_DASHED 用虛線邊框的單元格樣式
BORDER_THICK 厚厚的邊框單元格樣式
BORDER_THIN 薄邊框的單元格樣式
VERTICAL_BOTTOM 對齊單元格內容的垂直下方
VERTICAL_CENTER 對齊單元格內容垂直居中
VERTICAL_JUSTIFY 對齊和垂直對齊的單元格內容
VERTICAL_TOP 頂部對齊爲垂直對齊

類別的構造函數

No. 構造函數及描述
1 XSSFCellStyle(int cellXfId, int cellStyleXfId, StylesTable stylesSource, ThemesTable theme) 建立一個單元格樣式,從所提供的部分
2 XSSFCellStyle(StylesTable stylesSource) 建立一個空的單元樣式

類別方法

設置邊框的類別型爲單元格的底部邊界

S.No 方法及描述
1 setAlignment(short align) 設置單元格爲水平對齊的類別型
2 setBorderBottom(short border)
3 setBorderColor(XSSFCellBorder.BorderSide side, XSSFColor color) 選定的邊框顏色
4 setBorderLeft(Short border) 設置邊界的類別型單元格的左邊框
5 setBorderRight(short border) 設置邊框的類別型爲單元格的右邊界
6 setBorderTop(short border) 設置邊界的類別型的單元上邊框
7 setFillBackgroundColor(XSSFColor color) 設置表示爲XSSFColor值背景填充顏色。
8 setFillForegroundColor(XSSFColor color) 設置表示爲XSSFColor的值前景填充顏色。
9 setFillPattern(short fp) 指定單元格的填充信息模式和純色填充單元。
10 setFont(Font font) 設置此樣式的字體。
11 setRotation(short rotation) 設置的旋轉爲在單元格中文本的程度。
12 setVerticalAlignment(short align) 設置單元類別型爲垂直取向。

HSSFColor

這是在org.apache.poi.hssf.util組件的類別。它提供了不同的顏色作爲嵌套類別。通常這些嵌套類別是使用自己的索引來表示。它實現了Color對接。

嵌套類別

所有嵌套類別這個類別是靜態的,每個類別都有其索引。這些嵌套色類別用於單元格格式,如單元格內容,邊框,前景和背景。下面列出了一些的嵌套類別。

No. 類別名(顏色)
1 HSSFColor.AQUA
2 HSSFColor.AUTOMATIC
3 HSSFColor.BLACK
4 HSSFColor.BLUE
5 HSSFColor.BRIGHT_GREEN
6 HSSFColor.BRIGHT_GRAY
7 HSSFColor.CORAL
8 HSSFColor.DARK_BLUE
9 HSSFColor.DARK_GREEN
10 HSSFColor.SKY_BLUE
11 HSSFColor.WHITE
12 HSSFColor.YELLOW

類別方法

這個類別的只有一個方法是很重要的,並且用於獲取索引值。

No. 方法和描述
1 getIndex() 這種方法被用來獲得一個嵌套類別的索引值

XSSFColor

這是在org.apache.poi.xssf.usermodel組件的類別。它是用來表示在電子表格中的顏色。它實現了顏色的對接。下面列出的是它的一些方法和構造函數。

類別的構造函數

No. Constructor and 描述
1 XSSFColor() 建立XSSFColor的新實例。
2 XSSFColor(byte[] rgb) 建立XSSFColor使用RGB的新實例。
3 XSSFColor(java.awt.Color clr) 建立XSSFColor使用Color類別從AWT組件的新實例。

類別方法

No. 方法和描述
1 setAuto(boolean auto) 設置一個布爾值,表示ctColor是自動的,系統ctColor依賴。
2 setIndexed(int indexed) 設置索引ctColor值系統ctColor。

XSSFFont

這是在org.apache.poi.xssf.usermodel組件的類別。它實現了Font對接,因此它可以處理活頁簿中不同的字體。

類別的構造函數

No. 構造函數和描述
1 XSSFFont() 建立一個新的XSSFont實例。

類別方法

No. 方法和描述
1 setBold(boolean bold) 設置「bold」屬性的布爾值。
2 setColor(short color) 設置索引顏色的字體。
3 setColor(XSSFColor color) 設置爲標準Alpha RGB顏色值的字體顏色。
4 setFontHeight(short height) 設置在點的字體高度。
5 setFontName(java.lang.String name) 設置字體的名稱。
6 setItalic(boolean italic) 設置「italic」屬性一個布爾值。

XSSFHyperlink

這是在org.apache.poi.xssf.usermodel組件的類別。它實現了Hyperlink對接。它是用來連結設置爲電子表格的單元格內容。

字段

屬於此類別的字段如下。這裏,字段意味着使用超鏈接的類別型。

字段 描述
LINK_DOCUMENT 用於連接任何其他文件
LINK_EMAIL 用於鏈接的電子郵件
LINK_FILE 用於以任何格式鏈接任何其他文件
LINK_URL 用來連接一個網頁URL

類別方法

No. 方法及描述
1 setAddress(java.lang.String address) 超鏈接地址。

XSSFCreationHelper

這是在org.apache.poi.xssf.usermodel組件的類別。它實現了CreationHelper對接。它被用作公式求值和設置超文本鏈接支持類別。

類別方法

No. 方法和描述
1 createFormulaEvaluator() 建立一個XSSFFormulaEvaluator例如,結果計算公式的單元格的對象。
2 createHyperlink(int type) Creates a new XSSFHyperlink.

文獻參考網址: