基于java的POI
java在很多的方面都有很多引用,尤其是最近一俩年,java的运用无处不在。很多情况下,我们需要导出一些表格或者其他文档,而程序环境是在java语言下的,那么,Apache提供了解决途径——POI。
文章目录
前言
Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。
提示:以下是本篇文章正文内容,下面案例可供参考
一、POI结构
模块 | 功能 |
---|---|
HSSF | 提供读写Microsoft Excel XLS格式档案的功能 (Excel 2003) |
XSSF | 提供读写Microsoft Excel OOXML XLSX格式档案的功能(Excel 2007+) |
HWPF | 提供读写Microsoft Word DOC格式档案的功能 |
HSLF | 提供读写Microsoft PowerPoint格式档案的功能 |
HDGF | 提供读Microsoft Visio格式档案的功能 |
HPBF | 提供读Microsoft Publisher格式档案的功能 |
HSMF | 提供读Microsoft Outlook格式档案的功能 |
二、官方网址
Apache
官网首页示意图:
三、常用类说明
类名 | 说明 |
---|---|
HSSFWorkbook | Excel的文档对象 |
HSSFSheet | sheet页 |
HSSFRow | Excel的行 |
HSSFCell | Excel的格子单元 |
HSSFFont | Excel字体 |
HSSFDataFormat | 格子单元的日期格式 |
HSSFCellStyle | 格子单元样式 |
Excel依赖关系
Excel的创建过程:
- 创建文档对象
- 创建Sheet页
- 在该Sheet也上创建Row
- 在该Row上创建Cell
- 对该Cell进行CellStyle样式渲染
四、使用说明
生成Excle的基础示例:
//创建文档对象
Workbook wb = new HSSFWorkbook();
//创建一个名叫 demo1 的sheet页
Sheet st=wb.createSheet("demo1");
//在当前页创建一行参数为行的下标从0开始
Row row=st.createRow(0);
//在当前行中插入列参数为列的下标从0开始
Cell cell=row.createCell(0);
cell.setCellValue("张三");
row.createCell(1).setCellValue(12);
row.createCell(2).setCellValue(56.5);
row.createCell(3).setCellValue(newDate());
//调用文档对象的write方法将内容通过输出流输出到指定文件最后关闭流
wb.write(new FileOutputStream("D:/测试.xls"));
wb.close();
五、合并单元格
POI提供了转门用于合并单元格的类CellRangeAddress
使用示例:
//需求:现在要合并 2-4行 1-5列的单元格
//先将合并单元格中的的首行首列创建出来
Row row=st.createRow(1);//创建第二行
Cell cell=row.createCell(0);//创建第一列
cell.setCellValue("合并单元格");//设置单元格内容
/*
开始合并单元格
使用 CellRangeAddress(firstRow, lastRow, fristCell, lastCell)
四个参数表示要合并单元格的 起始行 结束行 起始列 结束列
*/
CellRangeAddress cra=new CellRangeAddress(1, 3, 0, 4);
//将合并后单元格加入当前sheet页
st.addMergedRegion(cra);
普通单元格和合并后的单元格在Excel中并不是同一个管理对象
对其进行样式设置等方式需要区别对待
六、设置单元格格式
使用CellStyle对象来进行单元格样式设置
获取方式:
CellStylecs=wb.createCellStyle();
常用样式
//设置样式 -- 获取样式对象
HSSFCellStyle style=workbook.createCellStyle();
//设置背景色
cs.setFillForegroundColor(HSSFColorPredefined.YELLOW.getIndex());
//设置填充样式此项必选否则有时无法显示背景色
cs.setFillPattern(FillPatternType.SOLID_FOREGROUND);
//设置底边框; 通过BorderStyle枚举 设置边框类型
style.setBorderBottom(BorderStyle.THIN);
//设置底边框颜色; 通过HSSFColorPredefined枚举类获取内置颜色
style.setBottomBorderColor(HSSFColorPredefined.BLACK.getIndex());
//设置左边框;
style.setBorderLeft(BorderStyle.THIN);
//设置左边框颜色; 也可以通过IndexedColors枚举类获取内置颜色
style.setLeftBorderColor(IndexedColors.BLACK.getIndex());
//设置右边框;
style.setBorderRight(BorderStyle.THIN);
//设置右边框颜色;
style.setRightBorderColor(IndexedColors.BLACK.getIndex());
//设置顶边框;
style.setBorderTop(BorderStyle.THIN);
//设置顶边框颜色;
style.setTopBorderColor(IndexedColors.BLACK.getIndex());
//设置自动换行;
style.setWrapText(true);
//设置水平对齐的样式为居中对齐; 参数通过HorizontalAlignment枚举获取
style.setAlignment((short) horAlignment);
//设置垂直对齐的样式为居中对齐; 参数通过VerticalAlignment枚举获取
style.setVerticalAlignment((short) verAlignment);
// 设置字体 -- 字体需要单独设置使用HSSFFont对象
HSSFFont font=workbook.createFont();
//设置字体大小
font.setFontHeightInPoints((short)fontSize);
//字体加粗
font.setBoldweight((short) fontWeight);
//设置字体名字
font.setFontName(fontName);
//在样式用应用设置的字体;
style.setFont(font);
常用枚举类
枚举类型 | 说明 |
---|---|
HSSFColorPredefined | 获取内置颜色 excel2003 |
IndexedColors | 获取内置颜色excel2007+ |
BorderStyle | 设置边框类型 |
HorizontalAlignment | 设置水平对齐方式 |
VerticalAlignment | 设置垂直对其方式 |
FillPatternType | 背景填充方式常用FillPatternType.SOLID_FOREGROUND |
设置时间格式化
通过CreationHelper对象来设置格式化模式串
//设置一列
Cell cell=row.createCell(0);
//设置该列的值为 Date类型
cell.setCellValue(newDate());
//开启样式对象
CellStyle css=wb.createCellStyle();
//通过 WorkBook 获取 CreationHelper 对象
CreationHelper ch=wb.getCreationHelper();
// 利用CreationHelper对象设置日期格式化模式串并传递给样式对象
css.setDataFormat(ch.createDataFormat().getFormat("yyyy-MM-dd"));
//设置当前单元格的样式
cell.setCellStyle(css);
设置单元格宽和高
1.设置默认宽和高
/**
* 设置单元格默认的宽度;整个 Sheet 中单元格的宽度都将被修改;方法来自 Sheet 接口
* @param width 宽度值;单位是 1/256 个字符宽度,即值建议设置为256的倍数
*/
public void setDefaultColumnWidth(int width);
/**
*设置单元格默认的高度;整个 Sheet 中单元格的高度都将被修改;方法来自 Sheet 接口
* @param height 高度值;单位是 1/20 个点,即值建议设置为20的倍数
*/
public void setDefaultRowHeight(short height);
2.指定某行列/行宽高
/**
*设置指定单元格的宽度;单元格的宽度即列的宽度;方法来自 Sheet 接口
* @param columnIndex 列的索引;值从 0 开始
* @param width 宽度值;单位是 1/256 个字符宽度,即值建议设置为256的倍数
*/
public void setColumnWidth(int columnIndex, int width);
/**
*设置指定单元格的高度;单元格的高度即行的高度;方法来自 Row 接口
* @param height 高度值;单位是 1/20 个点,即值建议设置为20的倍数
*/
public void setHeight(short height);
/**
*设置指定单元格的高度;与 setHeight() 作用一致,但参数单位不同;方法来自 Row 接口
* @param height 高度值;单位是 1 整个点
*/
public void setHeightInPoints(float height);
3.代码示例
// 创建一个Sheet对象
Workbook workbook=new HSSFWorkbook();
Sheet sheet=workbook.createSheet("sheet");
// 设置第一列的宽度 10个字符长度
sheet.setColumnWidth(0, 10*256);
// 设置第一行的高度 30个点
Rowrow=sheet.createRow(0);
row.setHeight((short) (30*20));
row.setHeightInPoints((short) 30);
// 设置默认的宽和高
sheet.setDefaultColumnWidth(100*256);
sheet.setDefaultRowHeight((short) (30*20));
合并单元格样式
在POI中对于合并单元格有特殊处理方式,合并后的单元格和普通单元格的类型是不同的
针对于合并单元格的普通样式设置,只需要对该合并单元格所对应的首行首列单元格进行设置即可
但如果要给合并单元格添加边框则需要调用 RegionUtil 类做特殊处理,如下所示:
//设置上边框样式 cra为单元格对象CellRangeAddress st为当前Sheet对象
RegionUtil.setBorderTop(BorderStyle.THIN,cra,st);
//设置下边框样式
RegionUtil.setBorderBottom(BorderStyle.THIN,cra,st);
//设置左边框样式
RegionUtil.setBorderLeft(BorderStyle.THIN,cra,st);
//设置有边框样式
RegionUtil.setBorderRight(BorderStyle.THIN,cra,st);