Java apache POI
2018-06-14 本文已影响0人
这不挺好
一、简介
开发中经常会设计到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();
}