一、簡(jiǎn)介
開(kāi)發(fā)中經(jīng)常會(huì)設(shè)計(jì)到Excel的處理,如導(dǎo)出Excel到數(shù)據(jù)庫(kù)中匙握,操作Excel目前有兩個(gè)框架囚枪,一個(gè)是Apache 的 POI派诬,另一個(gè)是 Java Excel
Exce中的工作簿、工作表眶拉、行千埃、單元格中的關(guān)系:
- 一個(gè)Excel文件對(duì)應(yīng)于一個(gè) workboot(HSSFWorkbook)
- 一個(gè) workboot 可以有多個(gè) sheet(HSSFSheet)組成
- 一個(gè) sheet 是由多個(gè) row(HSSFRow)組成
- 一個(gè) row 是由多個(gè) cell(HSSFCell)組成
二:Apache POI常用的類(lèi)
- HSSF - 提供讀寫(xiě)Microsoft Excel XLS 格式檔案的功能。
- XSSF - 提供讀寫(xiě)Microsoft Excel OOXML XLSX格式檔案的功能
- HWPF - 提供讀寫(xiě)Microsoft Word DOC97格式檔案的功能忆植。
- XWPF - 提供讀寫(xiě)Microsoft Word DOC2003格式檔案的功能
- HSLF - 提供讀寫(xiě)Microsoft PowerPoint格式檔案的功能
- HDGF - 提供讀寫(xiě)Microsoft Visio 格式檔案的功能
- HSMF - 提供讀寫(xiě)Microsoft Outlook格式檔案的功能
HSSF是Horrible SpreadSheet Format的縮寫(xiě)放可,通過(guò)HSSF,你可以用純Java代碼來(lái)讀取朝刊、寫(xiě)入耀里、修改Excel文件。HSSF為讀取操作提供了兩類(lèi)API:usermodel和eventusermodel拾氓,即“用戶(hù)模型”和“事件 - 用戶(hù)模型”
三冯挎、常用的類(lèi)和方法
-
HSSFWorkbook:工作簿,代表一個(gè)Excel的整個(gè)文檔
- HSSFWorkbook(InputStream inputStream); // 創(chuàng)建一個(gè)關(guān)聯(lián)輸入流的工作簿咙鞍,可以將一個(gè)Excel文件封裝成工作簿
- write()
- write(File newFile)房官;
- write(OutputStream stream) 趾徽;
-
HSSFSheet:工作表
- HSSFSheet createSheet(String sheetname); 創(chuàng)建一個(gè)新的Sheet
- HSSFSheet getSheet(String sheetName) 通過(guò)名稱(chēng)獲取Sheet
- HSSFSheet getSheetAt(int index) 通過(guò)索引獲取Sheet翰守,索引從0開(kāi)始
- HSSFCellStyle createCellStyle()孵奶;創(chuàng)建單元格樣式
- int getNumberOfSheets();獲取Sheet的個(gè)數(shù)
- setActiveSheet(int index)設(shè)置默認(rèn)選中的工作表
-
HSSFRow : 行
- HSSFRow createRow(int rownum)創(chuàng)建新行蜡峰,需要指定行號(hào)了袁,行號(hào)從0開(kāi)始
- HSSFRow getRow(int index);根據(jù)索引獲取指定的行
- int addMergedRegion(CellRangeAddress region)湿颅;合并單元格
CellRangeAddress(int firstRow载绿,int lastRow,int firstCol油航,int lastCol)崭庸;單元格范圍,用戶(hù)合并單元格劝堪,需要指定要合并的首行冀自、最后一行、首列秒啦、最后一列 - autoSizeColumn(int column)自動(dòng)調(diào)整列的寬度來(lái)自適應(yīng)內(nèi)容
- getLastRowNum()熬粗;獲取最后的行的索引,沒(méi)有行或者只有一行的時(shí)候返回0
- setColumnWidth(int columnIndex , int width);設(shè)置某一列的寬度余境,width = 字符個(gè)數(shù) * 256 驻呐, 列入20個(gè)字符的寬度就是20 * 256
-
HSSFCell:列
- HSSFCell createCell(int column);創(chuàng)建新的單元格
- HSSFCell setCell(shot index)芳来;
- HSSFCell getCell(shot index)含末;
- setRowStyle(HSSFCellStyle style);設(shè)置行樣式
- short getLastCellNum()即舌;獲取最后的單元格號(hào)佣盒,如果單元格有第一個(gè)開(kāi)始算,lastCellNum就是列的個(gè)數(shù)
- setHeightInPoints(float height)設(shè)置行的高度
-
HSSFCell : 單元格
- setCellValue(String value)顽聂;設(shè)置單元格的值
- setCellType()肥惭;設(shè)置單元格類(lèi)型,如:字符串紊搪、數(shù)字蜜葱、布爾等
- setCellStyle();設(shè)置單元格樣式
- String getStringCellValue()耀石;獲取單元格中的字符串值
- setCellStyle(HSSFCellStyle style)牵囤;設(shè)置單元格樣式,例如字體,加粗揭鳞,格式化
- setCellFormula(String formula)炕贵;設(shè)置計(jì)算公式,計(jì)算的結(jié)果作為單元格的值汹桦,也提供了異常常用的函數(shù)鲁驶,如求和“sum(A1,C1)”舞骆、日期函數(shù)、字符串相關(guān)函數(shù)径荔、countif和sumif函數(shù)督禽、隨機(jī)數(shù)函數(shù)等
-
HSSFCellStyle : 單元格樣式
- setFont(Font font);為單元格設(shè)置字體樣式
- setAlignment(HorizontalAlignment align)总处;設(shè)置水平對(duì)齊方式
- setVerticalAlignment(VerticalAlignment align)狈惫;設(shè)置崔志對(duì)齊方式
- setFillPattern(FillPatternType fp)
- setFillForegroundColor(short bg);設(shè)置前景色
- setFillBackGroundColor(short bg)鹦马;設(shè)置背景顏色
-
HSSFFont : 字體
- setColor(short color)胧谈;設(shè)置字體顏色
- setBold(boolean bold);設(shè)置是否粗體
- setItalic(boolean italic)荸频;設(shè)置傾斜
- setUnderLine(byte underline)菱肖;設(shè)置下劃線(xiàn)
HSSFName : 名稱(chēng)
HSSFDataFormat:日期格式化
HSSFHeader:sheet的頭部
HSSFFooter:sheet的尾部
HSSFDataUtil:日期工具
HSSFPrintSetup:打印設(shè)置
HSSFErrorConstants:錯(cuò)誤信息表
四:基礎(chǔ)示例
首先引入 Apache poi 依賴(lài)
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.8</version>
</dependency>
示例一:生成一個(gè)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("測(cè)試用例 - 001頁(yè)");
HSSFRow row = sheet.createRow(0);
String[] message = {
"用例編號(hào)",
"模塊",
"測(cè)試目的",
"前置條件",
"測(cè)試步驟",
"預(yù)期結(jié)果",
"實(shí)際結(jié)果",
"測(cè)試日期",
"執(zhí)行人"
};
for (int i = 0; i < message.length; i++) {
row.createCell(i).setCellValue(message[i]);
}
// 設(shè)置行高 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"));
// 設(shè)置列寬:
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 ,解析數(shù)據(jù)
/** 讀取一個(gè) 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();
}