------------官网api地址
http://poi.apache.org/apidocs/index.html
------------官方下载地址
http://poi.apache.org/download.html
------------一些说明
HSSF(用于操作Excel的组件)提供给用户使用的对象在org.apache.poi.hssf.usermodel包中,主要部分包括Excel对象,样式和格式,还有辅助操作。有以下几种对象:
常用组件:
HSSFWorkbook excel的文档对象
HSSFSheet excel的表单
HSSFRow excel的行
HSSFCell excel的格子单元
HSSFFont excel字体
HSSFDataFormat 日期格式
HSSFHeader sheet头
HSSFFooter sheet尾(只有打印的时候才能看到效果)
样式:
HSSFCellStyle cell样式
辅助操作包括:
HSSFDateUtil 日期
HSSFPrintSetup 打印
HSSFErrorConstants 错误信息表
------------基本操作步骤理解
一个Excel文件对应于一个workbook(HSSFWorkbook),
一个workbook可以有多个sheet(HSSFSheet)组成,
一个sheet是由多个row(HSSFRow)组成,
一个row是由多个cell(HSSFCell)组成。
1、用HSSFWorkbook打开或者创建“Excel文件对象”
2、用HSSFWorkbook对象返回或者创建Sheet对象
3、用Sheet对象返回行对象,用行对象得到Cell对象
4、对Cell对象读写。
------------简单例子:
//创建HSSFWorkbook对象
HSSFWorkbook wb = new HSSFWorkbook();
//创建HSSFSheet对象
HSSFSheet sheet = wb.createSheet("sheet0");
//创建HSSFRow对象
HSSFRow row = sheet.createRow(0);
//创建HSSFCell对象
HSSFCell cell=row.createCell(0);
//设置单元格的值
cell.setCellValue("单元格中的中文");
------------合并 单元格
方法 :public int addMergedRegion(CellRangeAddress region)
//参数说明:1:开始行 2:结束行 3:开始列 4:结束列
//比如我要合并 第二行到第四行的 第六列到第八列
sheet.addMergedRegion(new CellRangeAddress(1,3,5,7));
------------设置单元格的行高、列宽
//设置缺省列高
sheet.setDefaultRowHeightInPoints(10);
//设置缺省列宽
sheet.setDefaultColumnWidth(20);
//设置指定列的列宽,256 * 50这种写法是因为width参数单位是单个字符的256分之一
sheet.setColumnWidth(cell.getColumnIndex(), 256 * 50);
------------设置样式
// 单元格的横向和纵向对齐方式
cellStyle.setAlignment(HSSFCellStyle.ALIGN_JUSTIFY);
cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
/* 设置单元格的填充方式,以及前景颜色和背景颜色
三点注意:
1.如果需要前景颜色或背景颜色,一定要指定填充方式,两者顺序无所谓;
2.如果同时存在前景颜色和背景颜色,前景颜色的设置要写在前面;
3.前景颜色不是字体颜色。
*/
//设置填充方式(填充图案)
cellStyle.setFillPattern(HSSFCellStyle.DIAMONDS);
//设置前景色
cellStyle.setFillForegroundColor(HSSFColor.RED.index);
//设置背景颜色
cellStyle.setFillBackgroundColor(HSSFColor.LIGHT_YELLOW.index);
// 设置单元格底部的边框及其样式和颜色
// 这里仅设置了底边边框,左边框、右边框和顶边框同理可设
cellStyle.setBorderBottom(HSSFCellStyle.BORDER_SLANTED_DASH_DOT);
cellStyle.setBottomBorderColor(HSSFColor.DARK_RED.index);
//设置日期型数据的显示样式
cellStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy h:mm"));
将样式应用于单元格
cell.setCellStyle(cellStyle);
//将样式应用到行,但有些样式只对单元格起作用
row.setRowStyle(cellStyle);
------------设置字体样式
1、创建HSSFFont对象(调用HSSFWorkbook 的createFont方法)
HSSFWorkbook wb=new HSSFWorkbook();
HSSFFont fontStyle=wb.createFont();
2、设置字体各种样式
//设置字体样式
fontStyle.setFontName("宋体");
//设置字体高度
fontStyle.setFontHeightInPoints((short)20);
//设置字体颜色
font.setColor(HSSFColor.BLUE.index);
//设置粗体
fontStyle.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
//设置斜体
font.setItalic(true);
//设置下划线
font.setUnderline(HSSFFont.U_SINGLE);
3、将字体设置到单元格样式
//字体也是单元格格式的一部分,所以从属于HSSFCellStyle
// 将字体对象赋值给单元格样式对象
cellStyle.setFont(font);
// 将单元格样式应用于单元格
cell.setCellStyle(cellStyle);
---------------获取指定行,列 以及行列总数
/获取指定行
hssfRow=hssfSheet.getRow(1);
//获取指定列
hssfCell=hssfRow.getCell((short)1);
//获取总行数
int rowNum=hssfSheet.getLastRowNum();
//获取一个excel表格中的总记录数
int rowNum=storagesList.size();
//获取总列数
int columnNum=hssfRow.getPhysicalNumberOfCells();
---------------设置整个sheet每个单元格宽度自适应
public void setAutoWith(HSSFSheet sheet) throws Exception {
int maxColumn = sheet.getPhysicalNumberOfRows();
// 列宽自适应,只对英文和数字有效
for (int i = 0; i <= maxColumn; i++) {
sheet.autoSizeColumn(i);
}
// 获取当前列的宽度,然后对比本列的长度,取最大值
for (int columnNum = 0; columnNum <= maxColumn; columnNum++) {
int columnWidth = sheet.getColumnWidth(columnNum) / 256;
for (int rowNum = 0; rowNum <= sheet.getLastRowNum(); rowNum++) {
Row currentRow;
// 当前行未被使用过
if (sheet.getRow(rowNum) == null) {
currentRow = sheet.createRow(rowNum);
} else {
currentRow = sheet.getRow(rowNum);
}
if (currentRow.getCell(columnNum) != null) {
Cell currentCell = currentRow.getCell(columnNum);
int length = currentCell.toString().getBytes("GBK").length;
if (columnWidth < length + 1) {
columnWidth = length + 1;
}
}
}
sheet.setColumnWidth(columnNum, columnWidth * 256);
}
}
---------------不管格子的数据是何类型,自动返回相应的值
/**
* 获取单元格的值
* @param cell
* @return
*/
public String getCellValue(Cell cell){
if(cell == null) return "";
if(cell.getCellType() == Cell.CELL_TYPE_STRING){
return cell.getStringCellValue();
}else if(cell.getCellType() == Cell.CELL_TYPE_BOOLEAN){
return String.valueOf(cell.getBooleanCellValue());
}else if(cell.getCellType() == Cell.CELL_TYPE_FORMULA){
return cell.getCellFormula() ;
}else if(cell.getCellType() == Cell.CELL_TYPE_NUMERIC){
return String.valueOf(cell.getNumericCellValue());
}
return "";
}
---------------颜色索引对照表
设置字体时,后面要加上.index 比如HSSFColor.GREY_80_PERCENT.index取得short值
. |
HSSFColor.GREY_80_PERCENT |
. |
HSSFColor.INDIGO |
. |
HSSFColor.PLUM |
HSSFColor.BROWN |
|
. |
HSSFColor.OLIVE_GREEN |
. |
HSSFColor.DARK_GREEN |
. |
HSSFColor.SEA_GREEN |
. |
HSSFColor.DARK_TEAL |
. |
HSSFColor.GREY_40_PERCENT |
. |
HSSFColor.BLUE_GREY |
. |
HSSFColor.ORANGE |
. |
HSSFColor.LIGHT_ORANGE |
. |
HSSFColor.GOLD |
. |
HSSFColor.LIME |
. |
HSSFColor.AQUA |
. |
HSSFColor.LIGHT_BLUE |