1. 程式人生 > 實用技巧 >Apache POI讀寫Excel

Apache POI讀寫Excel

Apache POI是Apache軟體基金會的開放原始碼函式庫,POIAPI給Java程式對Microsoft Office格式檔案讀和寫的功能。

官方文件

[https://poi.apache.org/]

相關類

類名 對應檔案型別
HSSF 讀寫Microsoft Excel XLS
XSSF 讀寫Microsoft Excel OOXML XLSX
HWPF 讀寫Microsoft Word DOC97
XWPF 讀寫Microsoft Word DOC2003
XSLF 讀寫Microsoft PowerPoint
XDGF 讀Microsoft Visio
XPBF 讀Microsoft Publisher
XSMF 讀Microsoft Outlook

XLSX相關類及方法

常用類

類名 對應關係
XSSFWorkbook 工作薄(可以理解為.xlsx的檔案)
XSSFSheet Excel表(就是建立Excel檔案時預設建立的Sheet1那種表格)
XSSFRow 表格中的一行資料
XSSFCell 表格一行中的一個單元格
XSSFCellStyle 單元格樣式
XSSFFont 字型
XSSFHeader Sheet的頁首
XSSFFooter Sheet的頁尾
DocumentSummaryInformation 檔案摘要資訊
CellRangeAddress 單元格範圍地址,通常合併單元格時使用

常用方法

構造方法

方法名 說明
XSSFWorkbook()
XSSFWorkbook(InputStream is) (is為要讀的檔案的輸入流)
XSSFWorkbook(File file) 按檔案物件讀取
XSSFWorkbook(String path) 按檔案路徑讀取

XSSFWorkbook常用方法

方法名 返回型別 說明
getNumberOfSheets() int 獲取工作薄中表的個數
getSheet(String name) XSSFSheet 按表名獲取表
getSheetAt(int index) XSSFSheet 按表序號獲取表
getSheetIndex(String name) int 獲取指定表名的表序號
getSheetIndex(Sheet sheet) int 按表獲取它的序號
removeSheetAt(int index) void 刪除指定序號的表
write(OutputStream var1) void 將記憶體中的Excel寫入到檔案
createCellStyle() XSSFCellStyle 建立一個單元格格式

XSSFSheet常用方法

方法名 返回型別 說明
createRow(int rownum) HSSFRow 在指定行建立一個新行
getRow(int index) HSSFRow 獲取一行資料
getFirstRowNum() int 獲取從上到下第一行有資料的行所在行號
getLastRowNum() int 獲取從下到上第一行有資料的行所在行號
addMergedRegion(CellRangeAddress region) int 合併單元格
autoSizeColumn(int column) void 自動調整指定列的寬度
setColumnWidth(int columnIndex, int width) void 設定某一列的寬度,width=字元個數 * 256,例如20個字元的寬度就是20 * 256

XSSFRow常用方法

方法名 返回型別 說明
createCell(int column) XSSFCell 建立一個單元格
createCell(int columnIndex, CellType type) XSSFCell 建立指定單元格格式的單元格
getCell(int cellnum) XSSFCell 獲取指定行中指定索引的單元格
setHeight(short height) void 設定行高

XSSFCell常用方法

方法名 返回型別 說明
setCellValue(String value) void 設定單元格內容
setCellValue(double value) void 同上
setCellValue(Date value) void 同上
setCellValue(LocalDateTime value) void 同上
setCellValue(Calendar value) void 同上
toString() String 將單元格中的內容轉換為String返回
setCellFormula(String formula) void 設定單元格計算公式
setCellStyle(CellStyle style) void 設定單元格格式

XSSFFont常用方法

方法名 返回型別 說明
setColor(short color) void 設定字型顏色
setBold(boolean bold) void 設定是否粗體
setItalic(boolean italic) void 設定傾斜
setUnderline(byte underline) void 設定下劃線

XSSFCellStyle常用方法

方法名 返回型別 說明
setFont(Font font) void 為單元格設定字型樣式
setAlignment(HorizontalAlignment align) void 設定水平對齊方式
setVerticalAlignment(VerticalAlignment align) void 設定垂直對齊方式
setFillForegroundColor(short bg) void 設定前景色
setFillBackgroundColor(short bg) void 設定背景顏色

示例

導包

將下載下來的包中所有的docs資料夾同目錄下的所有jar包、lib資料夾、ooxml-lib資料夾匯入到工程中

讀入

樣例表

使用者編號 使用者名稱 密碼 姓名 性別 年齡
1 zs 123 張三 18
2 ls ls 李四 18
3 rsb rsb rsb 16
5 rbj rbj rbj 15
7 ssq ssq ssq 14
8 iow iow iow 7
9 auf auf auf 9
10 atv atv atv 12
11 soc soc soc 5
12 wqo wqo wqo 12
import org.apache.poi.xssf.usermodel.*;

import java.io.IOException;
import java.io.InputStream;

public class Main {
    public static void main(String[] args) throws IOException {
        InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("test.xlsx");
        XSSFWorkbook workbook = new XSSFWorkbook(is);

        //獲取索引為0的sheet表格
        XSSFSheet sheet = workbook.getSheetAt(0);
        //獲取表格中有內容的首行行號
        int first = sheet.getFirstRowNum();
        //獲取表格中有內容的尾行行號
        int last = sheet.getLastRowNum();

        //從首行開始獲取,首行為表頭
        XSSFRow row = sheet.getRow(0);
        XSSFCell cell = row.getCell(0);
        System.out.print(cell.toString() + "\t");
        cell = row.getCell(1);
        System.out.print(cell.toString() + "\t");
        cell = row.getCell(2);
        System.out.print(cell.toString() + "\t");
        cell = row.getCell(3);
        System.out.print(cell.toString() + "\t");
        cell = row.getCell(4);
        System.out.print(cell.toString() + "\t");
        cell = row.getCell(5);
        System.out.println(cell.toString() + "\t");
        for (int i = first + 1|i <= last|++i) {
            row = sheet.getRow(i);
            cell = row.getCell(0);
            int uid = Integer.valueOf(cell.toString().replace(".0", ""));
            cell = row.getCell(1);
            String uname = cell.toString();
            cell = row.getCell(2);
            String upass = cell.toString();
            cell = row.getCell(3);
            String truename = cell.toString();
            cell = row.getCell(4);
            String sex = cell.toString();
            cell = row.getCell(5);
            int age = Integer.valueOf(cell.toString().replace(".0", ""));
            System.out.println(new User(uid, uname, upass, truename, sex, age));
        }
    }
}

使用者編號	使用者名稱	密碼	姓名	性別	年齡	
1	zs	123.0	張三	男	18
2	ls	ls	李四	男	18
3	rsb	rsb	rsb	男	16
5	rbj	rbj	rbj	男	15
7	ssq	ssq	ssq	女	14
8	iow	iow	iow	男	7
9	auf	auf	auf	男	9
10	atv	atv	atv	男	12
11	soc	soc	soc	女	5
12	wqo	wqo	wqo	男	12

寫出

import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.*;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Random;

public class Write {
    public static void main(String[] args) throws IOException {
        //新建一個工作薄
        XSSFWorkbook workbook = new XSSFWorkbook();
        //在工作薄中新建一個名為寫入的sheet表
        XSSFSheet sheet = workbook.createSheet("寫入");
        //建立一行作為表頭
        XSSFRow row = sheet.createRow(0);
        //向表頭寫入內容
        XSSFCell cell = row.createCell(0);
        cell.setCellValue("使用者編號");
        cell = row.createCell(1);
        cell.setCellValue("使用者名稱");
        cell = row.createCell(2);
        cell.setCellValue("密碼");
        cell = row.createCell(3);
        cell.setCellValue("姓名");
        cell = row.createCell(4);
        cell.setCellValue("性別");
        cell = row.createCell(5);
        cell.setCellValue("年齡");

        //寫入其他內容同理

        //測試合併單元格
        row = sheet.createRow(1);
        cell = row.createCell(0);
        cell.setCellValue(1);
        cell = row.createCell(1);
        cell.setCellValue(2);
        cell = row.createCell(2);
        cell.setCellValue(3);

        sheet.addMergedRegion(new CellRangeAddress(1,1,0,3));
        cell = row.getCell(0);
        //讓工作薄建立一個單元格格式
        XSSFCellStyle style = workbook.createCellStyle();
        //設定水平對齊方式
        style.setAlignment(HorizontalAlignment.CENTER);
        //設定垂直對齊方式
        style.setVerticalAlignment(VerticalAlignment.CENTER);
        cell.setCellStyle(style);

        workbook.write(new FileOutputStream("write.xlsx"));
    }
}