学习目标:
在java掌握poi,操作excel或者是word
一、POI 是什么?
Apache POI 是Apache的开源项目,POI提供API给Java程序对Microsoft Offic 格式文档读和写的功能。
官网地址:POI官网
目前已经更新到5.2版本是java中很好用绘制excel的项目
二、Excel包名称说明
HSSF | XSSF | SXSSF | |
---|---|---|---|
对应Excel版本 | 2003及2003版本以前 | 2007后版本 | 2007后版本 |
扩展名 | .xls | .xlsx | .xlsx |
区别 | 最常用的方式,但是不能超过65535行,超出65536条就会报错,此方式因不足7万行所以一般不会内存溢出(OOM) | 突破HSSF 65535行的局限(1048576行,16384列),不过就伴随着一个问题内存溢出,原因是你创建的是存在内存的并没有持久化 | POI 3.8 开始,提供基于XSSF低内存占用的SXSSF方式。它只会保存最新的excel rows在内存里供查看,在此之前的都会被写入到硬盘里。被写入硬盘的rows是不可见/不可访问的。只有内存里才可以访问到 |
XSSF | SXSSF | |
---|---|---|
访问量 | 访问全部 | 访问一定数量的数据 |
Sheet.clone() | 支持 | 不支持 |
更换表头 | 可以 | 不可,因为已经提前把数据写入硬盘就不能修改 |
公式求值 | 支持 | 不支持 |
二、使用步骤
1.引入库
代码如下(示例):
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-excelant</artifactId>
<version>4.1.2</version>
</dependency>
2.使用方式
基础流程
//1. 创建工作空间Workbook
Workbook workbook=new SXSSFWorkbook();
//2.根据workbook创建sheet
//请注意,工作表名称不能超过31个字符,且不能包含以下字符:
//0x0000、0x0003、冒号(:)、反斜杠(\)、星号(*)、问号(?)、正斜杠(/)、方括号([])
//WorkbookUtil.createSafeSheetName(sheetName) 此方法可以将无效字符转化为空格
//已存在就不能创建,只能 workbook.getSheet("sheet")
Sheet sheet = workbook.createSheet("测试列表");
//3.根据sheet创建row
Row row1 = sheet.createRow(0);
//4.根据row创建cell
Cell cell1 = row1.createCell(0);
//5.向cell里面设置值
cell1.setCellValue("日期");
//写入文件 文件需要存在
FileOutputStream fos=new FileOutputStream("C:\\Users\\admin\\Desktop\\test.xlsx");
workbook.write(fos);
fos.close();
设置单元格(cell)样式
//创建样式
CellStyle style = workbook.createCellStyle();
//启用样式
cell.setCellStyle(cellStyle);
//设置下边框和颜色
style.setBorderBottom(BorderStyle.THIN);
style.setBottomBorderColor(IndexedColors.BLACK.getIndex());
//设置左边框和颜色
style.setBorderLeft(BorderStyle.THIN);
style.setLeftBorderColor(IndexedColors.BLACK.getIndex());
//设置右边框和颜色
style.setBorderRight(BorderStyle.THIN);
style.setRightBorderColor(IndexedColors.BLACK.getIndex());
//设置上边框边框和颜色
style.setBorderTop(BorderStyle.THIN);
style.setTopBorderColor(IndexedColors.BLACK.getIndex());
//水平对齐方式 [GENERAL(常规),LEFT(左对齐),CENTER(水平居中),RIGHT(右对齐),FILL(填充对齐),JUSTIFY(两端对齐),CENTER_SELECTION(跨列居中),DISTRIBUTED(分散对齐)]
style.setAlignment(HorizontalAlignment.CENTER);
//垂直对齐方式 [TOP(顶部对齐),CENTER(垂直居中),BOTTOM(底部对齐),JUSTIFY(两端对齐),DISTRIBUTED(分散对齐)]
style.setVerticalAlignment(VerticalAlignment.CENTER);
//设置文本是否换行
style.setWrapText(true);
//设置单元格时间展示格式
style.setDataFormat(creationHelper.createDataFormat().getFormat("m/d/yy h:mm"));
常用的单元格的样式,更详细的设置单元格方式可以通过官方提供api文档进行查看。
CellStyle(4.1.X版本)
注:有部分方法在4.2版本已经被弃用
设置单元格文本样式
//创建文本Font
Font font = workbook.createFont();
//设置字号
font.setFontHeightInPoints((short)11);
//设置字体
font.setFontName("宋体");
//设置黑体
font.setBold(false);
//设置斜体
font.setItalic(false);
//设置删除线
font.setStrikeout(false);
//设置字体颜色
//IndexedColors类中提供了我们设置excel使用的颜色也可以自己设置颜色GRB
font.setColor(IndexedColors.RED.getIndex());
合并单元格
//合并单元格
//如下合并 坐标 A1:B1的单元格
sheet.addMergedRegion(new CellRangeAddress(
0, // 开始的列坐标 0表示A1 1表示A2
0, // 结束的列坐标 0表示A1 1表示A2 2表示A3
0, // 开始的行坐标 0表示A1 1表示B1
1 // 结束的行坐标 0表示A1 1表示B1
));
如果我们对于单元格有一些样式要求比如表格的边框等等,那么在合并前我们需要为每一个单元格创建对于的表格style,在执行CellRangeAddress()方法,才能保证合并以后的样式是我们所需要的。
我们需要注意的就是,在合并的时候并不是合并后成为一个单元格,旧的单元格还是依旧存在,如A1和B1合并,A1的样式会覆盖于B1上(文本、背景色等),但是边框并不会
List<CellRangeAddress> mergedRegions = sheet.getMergedRegions();
通过sheet.getMergedRegions()我们可以获取到当前需要合并单元格的信息 A1:B1就是合并A1和B1单元格。
单元格自动填充
//参数1 表示对于的列
//参数2 true使用合并后的单元格扩充 false设置的对应行单元格扩充
sheet.autoSizeColumn(0,false);
//如果使用的是SXSSFWorkbook,是不可读取的有一部分,所有需要设置为允许
((SXSSFSheet)sheet).trackColumnsForAutoSizing(Lists.newArrayList(0,1));
//或者
((SXSSFSheet)sheet).trackColumnForAutoSizing(1);
//对应的参数表示对于的某列设置完以后再执行autoSizeColumn即可。
总结
也是今天才认真看poi有记录一下使用上的方法。 有时间的话可以先学习easyPoi在自己封装一些东西。学而时习之不亦说乎!!!!!