Apache POI讀寫Excel

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

官方文檔

[//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"));
    }
}
Tags: