一、簡介
開發中經常會設計到Excel的處理,如導出Excel到數據庫中,操作Excel目前有兩個框架,一個是Apache 的 POI,另一個是 Java Excel
Exce中的工作簿、工作表、行、單元格中的關系:
- 一個Excel文件對應于一個 workboot(HSSFWorkbook)
- 一個 workboot 可以有多個 sheet(HSSFSheet)組成
- 一個 sheet 是由多個 row(HSSFRow)組成
- 一個 row 是由多個 cell(HSSFCell)組成
二:Apache POI常用的類
- HSSF - 提供讀寫Microsoft Excel XLS 格式檔案的功能。
- XSSF - 提供讀寫Microsoft Excel OOXML XLSX格式檔案的功能
- HWPF - 提供讀寫Microsoft Word DOC97格式檔案的功能。
- XWPF - 提供讀寫Microsoft Word DOC2003格式檔案的功能
- HSLF - 提供讀寫Microsoft PowerPoint格式檔案的功能
- HDGF - 提供讀寫Microsoft Visio 格式檔案的功能
- HSMF - 提供讀寫Microsoft Outlook格式檔案的功能
HSSF是Horrible SpreadSheet Format的縮寫,通過HSSF,你可以用純Java代碼來讀取、寫入、修改Excel文件。HSSF為讀取操作提供了兩類API:usermodel和eventusermodel,即“用戶模型”和“事件 - 用戶模型”
三、常用的類和方法
-
HSSFWorkbook:工作簿,代表一個Excel的整個文檔
- HSSFWorkbook(InputStream inputStream); // 創建一個關聯輸入流的工作簿,可以將一個Excel文件封裝成工作簿
- write()
- write(File newFile);
- write(OutputStream stream) ;
-
HSSFSheet:工作表
- HSSFSheet createSheet(String sheetname); 創建一個新的Sheet
- HSSFSheet getSheet(String sheetName) 通過名稱獲取Sheet
- HSSFSheet getSheetAt(int index) 通過索引獲取Sheet,索引從0開始
- HSSFCellStyle createCellStyle();創建單元格樣式
- int getNumberOfSheets();獲取Sheet的個數
- setActiveSheet(int index)設置默認選中的工作表
-
HSSFRow : 行
- HSSFRow createRow(int rownum)創建新行,需要指定行號,行號從0開始
- HSSFRow getRow(int index);根據索引獲取指定的行
- int addMergedRegion(CellRangeAddress region);合并單元格
CellRangeAddress(int firstRow,int lastRow,int firstCol,int lastCol);單元格范圍,用戶合并單元格,需要指定要合并的首行、最后一行、首列、最后一列 - autoSizeColumn(int column)自動調整列的寬度來自適應內容
- getLastRowNum();獲取最后的行的索引,沒有行或者只有一行的時候返回0
- setColumnWidth(int columnIndex , int width);設置某一列的寬度,width = 字符個數 * 256 , 列入20個字符的寬度就是20 * 256
-
HSSFCell:列
- HSSFCell createCell(int column);創建新的單元格
- HSSFCell setCell(shot index);
- HSSFCell getCell(shot index);
- setRowStyle(HSSFCellStyle style);設置行樣式
- short getLastCellNum();獲取最后的單元格號,如果單元格有第一個開始算,lastCellNum就是列的個數
- setHeightInPoints(float height)設置行的高度
-
HSSFCell : 單元格
- setCellValue(String value);設置單元格的值
- setCellType();設置單元格類型,如:字符串、數字、布爾等
- setCellStyle();設置單元格樣式
- String getStringCellValue();獲取單元格中的字符串值
- setCellStyle(HSSFCellStyle style);設置單元格樣式,例如字體,加粗,格式化
- setCellFormula(String formula);設置計算公式,計算的結果作為單元格的值,也提供了異常常用的函數,如求和“sum(A1,C1)”、日期函數、字符串相關函數、countif和sumif函數、隨機數函數等
-
HSSFCellStyle : 單元格樣式
- setFont(Font font);為單元格設置字體樣式
- setAlignment(HorizontalAlignment align);設置水平對齊方式
- setVerticalAlignment(VerticalAlignment align);設置崔志對齊方式
- setFillPattern(FillPatternType fp)
- setFillForegroundColor(short bg);設置前景色
- setFillBackGroundColor(short bg);設置背景顏色
-
HSSFFont : 字體
- setColor(short color);設置字體顏色
- setBold(boolean bold);設置是否粗體
- setItalic(boolean italic);設置傾斜
- setUnderLine(byte underline);設置下劃線
HSSFName : 名稱
HSSFDataFormat:日期格式化
HSSFHeader:sheet的頭部
HSSFFooter:sheet的尾部
HSSFDataUtil:日期工具
HSSFPrintSetup:打印設置
HSSFErrorConstants:錯誤信息表
四:基礎示例
首先引入 Apache poi 依賴
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.8</version>
</dependency>
示例一:生成一個Excel文件
@Test
public static void createExcel() throws Exception {
// 獲取桌面路徑
FileSystemView fsv = FileSystemView.getFileSystemView();
String desktop = fsv.getHomeDirectory().getPath();
String filePath = desktop + "\\Excel.xls";
System.out.println(filePath);
File file = new File(filePath);
FileOutputStream outputStream = new FileOutputStream(file);
HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet sheet = workbook.createSheet("測試用例 - 001頁");
HSSFRow row = sheet.createRow(0);
String[] message = {
"用例編號",
"模塊",
"測試目的",
"前置條件",
"測試步驟",
"預期結果",
"實際結果",
"測試日期",
"執行人"
};
for (int i = 0; i < message.length; i++) {
row.createCell(i).setCellValue(message[i]);
}
// 設置行高 30
row.setHeightInPoints(30);
HSSFRow row1 = sheet.createRow(1);
row1.createCell(0).setCellValue("NO00001");
// 日期格式化
HSSFCellStyle cellStyle = workbook.createCellStyle();
HSSFCreationHelper creationHelper = workbook.getCreationHelper();
cellStyle.setDataFormat(creationHelper.createDataFormat()
.getFormat("yyyy-MM-dd HH:mm:ss"));
// 設置列寬:
sheet.setColumnWidth(7,20*256);
HSSFCell cell = row1.createCell(7);
cell.setCellStyle(cellStyle);
cell.setCellValue(new Date());
workbook.setActiveSheet(0);
workbook.write(outputStream);
outputStream.close();
}
示例二:讀取 Excel ,解析數據
/** 讀取一個 Excel 文件 */
@Test
public void readExcel() throws Exception {
// 獲取文件路徑
FileSystemView fsv = FileSystemView.getFileSystemView();
String desktop = fsv.getHomeDirectory().getPath();
String filePath = desktop + "/Excel.xls";
// 讀取 Excel 文件
FileInputStream inputStream = new FileInputStream(filePath);
BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
POIFSFileSystem poifsFileSystem = new POIFSFileSystem(bufferedInputStream);
HSSFWorkbook workbook = new HSSFWorkbook(poifsFileSystem);
HSSFSheet sheet = workbook.getSheetAt(0);
int lastRowNum = sheet.getLastRowNum();
System.out.println(lastRowNum);
for (int i = 0; i < lastRowNum; i++) {
HSSFRow row = sheet.getRow(i);
if (row == null) break;
short lastCellNum = row.getLastCellNum();
for (int j = 0; j < lastCellNum; j++) {
HSSFCell cell = row.getCell(j);
System.out.println("cell.getCellType():" + cell.getCellType());
String stringCellValue = row.getCell(j).getStringCellValue();
System.out.print(stringCellValue + " ");
}
}
bufferedInputStream.close();
}