POI学习笔记
文章目录
poi概述:
Apache POI 是 Apache 软件基金会的开放源码函式库,POI 提供 API 给 Java 程序对Microsoft Office 格式
档案读和写的功能。
poi特点:
1. 效率高
2. 支持公式,宏,一些企业应用上会非常实用
3. 能够修饰单元格属性
4. 支持字体、数字、日期操作
5. API 丰富,支持多种模式的读写
6. 支持大数量大文件的读写操作
poi导入导出excle
1. 导入poi依赖jar
<!-- poi依赖jar -->
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.17</version>
</dependency>
2.poi导出
1.poi导出excel文件
public class POIExportTest {
public static void main(String[] args) throws IOException {
//构建excel
Workbook workbook = new HSSFWorkbook();
//构建excel工作表
Sheet sheet = workbook.createSheet("第一张表");
//构建excel工作表的行 下标从 0 开始
Row row = sheet.createRow(0);
//构建excel工作表的行的单元格 下标从 0 开始
Cell cell = row.createCell(0);
//填充单元格的内容
cell.setCellValue("编号");
//使用输出流将构建的excel文件输出到文件夹,创建excel文件
workbook.write(new FileOutputStream(new File("E:\\Java\\3_Framework\\ideaCode\\poi\\src\\main\\webapp\\第一张表.xls")));
}
}
2.poi调整样式导出excel文件
public class POIExportTest {
public static void main(String[] args) throws IOException {
//构建excel工作簿
Workbook workbook = new HSSFWorkbook();
//构建excel工作表
Sheet sheet = workbook.createSheet("第一张表");
//构建excel工作表的行 下标从 0 开始
Row row = sheet.createRow(0);
//构建excel工作表的行的单元格 下标从 0 开始
Cell cell = row.createCell(0);
//填充单元格的内容
cell.setCellValue(new Date());
/**
* 设置单元格列宽 --- 第 1 个参数:第几列 ; 第 2 个参数:单元格列宽,进制为256,即 参数2=列宽*256
*/
sheet.setColumnWidth(0,8000);
/**
* 字体设置
* 创建excel工作簿字体设置对象
*/
Font font = workbook.createFont();
//设置字体颜色
font.setColor(Font.COLOR_RED);
/**
* 时间格式的设置
* 创建时间格式对象
*/
DataFormat dataFormat = workbook.createDataFormat();
//设置时间格式
short format = dataFormat.getFormat("yyyy年MM月dd日");
/**
* 调整excel单元格样式
* 创建单元格样式对象
*/
CellStyle cellStyle = workbook.createCellStyle();
//设置单元格样式 为 --- 居中
cellStyle.setAlignment(HorizontalAlignment.CENTER);
//设置单元格的字体颜色样式
cellStyle.setFont(font);
//将时间格式设置到单元格
cellStyle.setDataFormat(format);
//将样式添加到单元格
cell.setCellStyle(cellStyle);
//使用输出流将构建的excel文件输出到文件夹,创建excel文件
workbook.write(new FileOutputStream(new File("E:\\Java\\3_Framework\\ideaCode\\poi\\src\\main\\webapp\\第一张表.xls")));
}
}
3.poi导入
1.poi导入excel文件
public class POIImportTest {
public static void main(String[] args) throws IOException {
//使用输入流读取文件到工作簿
Workbook workbook = new HSSFWorkbook(new FileInputStream("E:\\Java\\3_Framework\\ideaCode\\poi\\src\\main\\webapp\\第一张表.xls"));
//获取读取到工作簿中的表, 参数:excel文件中表的表名
Sheet sheet = workbook.getSheet("第一张表");
for (int i = 0; i <= sheet.getLastRowNum(); i++) {
//遍历获取到的表,获取行
Row row = sheet.getRow(i);
for (int j = 0; j < row.getLastCellNum(); j++) {
//遍历获取的行,获取单元格
Cell cell = row.getCell(j);
//获取单元格内容
Date dateCellValue = cell.getDateCellValue();
//输出
System.out.println(dateCellValue);
}
}
}
}
poi导出实战
public class CustomExport {
/**
* @author gaozhy
* @2017 年 2 月 15 日下午 9:57:33
* @version 1.0
* @param resp
* @description 自定义导出
*/
@RequestMapping("/customExport")
// 参数一:需要查询的列信息 参数二:标题栏内容
public void customExport(String queryCondition, String title,HttpServletResponse resp) {
try {
// 根据列信息,查用户信息
// select ${queryCondition} select cmfz_user
List<User> list = userService.queryUserByField(queryCondition);
HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet sheet = workbook.createSheet("用户信息");
// 获取所有标题
String[] titles = title.split(",");
// 获取导出字段
String[] fields = queryCondition.split(",");
// 处理标题栏
HSSFRow row = sheet.createRow(0);
for (int i = 0; i < titles.length; i++) {
row.createCell(i).setCellValue(titles[i]);
}
// 处理数据行
for (int i = 1; i <= list.size(); i++) {
// 获得数据行对象
HSSFRow dataRow = sheet.createRow(i);
// 获取 User 对象
User user = list.get(i - 1);
Class<? extends User> c = user.getClass();
// 拿到字段名
for (int j = 0; j < fields.length; j++) {
// user_id 拆分字段
String[] str = fields[j].split("_");
// 处理 get 方法名
String name = "get";
// 属性没有 _ 拼接
if (str.length == 1) {
name += str[0].substring(0, 1).toUpperCase() + str[0].substring(1, str[0].length());
} else {
name += str[0].substring(0, 1).toUpperCase() + str[0].substring(1, str[0].length());
// user id
for (int k = 1; k < str.length; k++) {
name += str[k].substring(0, 1).toUpperCase() + str[k].substring(1, str[k].length());
}
}
System.out.println(name);
//使用反射通过上面获取的get方法名,获取对应的值
Object obj = c.getDeclaredMethod(name, null).invoke(user,null);
// 调用 set 方法给单元格设值
dataRow.createCell(j).setCellValue(obj.toString());
}
}
String fileName = "用户报表(" + new SimpleDateFormat("yyyy-MM-dd").format(new Date()) + ").xls";
// 处理中文下载名乱码
fileName = new String(fileName.getBytes("gbk"),
"iso-8859-1");
// 设置 response
resp.setContentType("application/vnd.ms-excel");
resp.setHeader("content-disposition", "attachment;filename=" + fileName);
workbook.write(resp.getOutputStream());
workbook.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
poi延伸–jxl
除poi外,JXL 是一个开源的 Java Excel API 项目,通过 JXL,Java 可以很方便的操作微软的 Excel 文档。
1.jxl特点
1. Jxl 对中文支持非常好,操作简单,方法看名知意。
2. Jxl 是纯 javaAPI,在跨平台上表现的非常完美,小文件读取效率比较高。
3. 支持字体、数字、日期操作
4. 能够修饰单元格属性
5. 支持图像和图表,但是这套 API对图形和图表的支持很有限,而且仅仅识别 PNG 格式。
2.导入jxl依赖jar
3.jxl导入导出excel
1.jxl导出
/**
* @author gaozhy
* @2017 年 2 月 15 日下午 8:30:13
* @version 1.0
* @description jxl 导出 excel
*/
@Test
public void jxlExport(){
try {
// 创建 Excel 工作薄对象
WritableWorkbook workbook = Workbook.createWorkbook(new
FileOutputStream("e:\\用户 1.xls"));
//创建工作表
//第一个参数:工作表 sheet 名称 第二个参数:工作表 sheet 索引值 0 表示第一个 sheet 页索引
WritableSheet sheet = workbook.createSheet("用户信息", 0);
//设置
sheet.setColumnView(2, 15);
String[] title = {"编号","姓名","出生年月"};
//创建单元格对象
Label label = null;
//处理标题栏
for (int i = 0; i < title.length; i++) {
//第一个参数 列索引 第二个参数 行索引 第三个参数 单元格内容
label = new Label(i,0,title[i]);
//sheet 页添加单元格
sheet.addCell(label);
}
for (int i = 1; i < 10; i++) {
label = new Label(0,i,""+i);
sheet.addCell(label);
label = new Label(1,i,"张三"+i);
sheet.addCell(label);
//日期格式特殊处理
DateFormat format = new DateFormat("yyyy年MM月dd日HH:mm:ss");
WritableCellFormat cellFormat = new
WritableCellFormat(format);
//第一个参数:列索引 第二个参数:行索引 第三个参数:日期内容 第四个参数:日期格式
sheet.addCell(new DateTime(2, i, new Date(),cellFormat));
}
workbook.write();
workbook.close();
} catch (Exception e) {
e.printStackTrace();
}
}
2.jxl导入
/**
* @author gaozhy
* @2017 年 2 月 15 日下午 8:20:31
* @version 1.0
* @description jxl 文件导入
*/
@Test
public void jxlImportExcel(){
try {
FileInputStream inputStream = new FileInputStream("e:\\用户1.xls");
//创建工作薄
Workbook workbook = Workbook.getWorkbook(inputStream);
//获取 sheet 页
Sheet[] sheets = workbook.getSheets();
//获取第一个 sheet
Sheet sheet = sheets[0];
//获取总行数
int rows = sheet.getRows();
for (int i = 1; i < rows; i++) {
//获取指定索引 数据行 返回单元格数组
Cell[] cells = sheet.getRow(i);
for (int j = 0; j < sheet.getColumns(); j++) {
if(cells[j].getType() == CellType.DATE){
DateCell dateCell = (DateCell)cells[j];
// 注意:JXL 读取 Excel 日期时间多出了 8 个小时
// 获取格林时区
TimeZone zone = TimeZone.getTimeZone("GMT");
// 定义日期格式
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
format.setTimeZone(zone);
System.out.println(format.format(dateCell.getDate()));
}else{
System.out.print(cells[j].getContents()+" ");
}
}
System.out.println();
}
} catch (Exception e) {
e.printStackTrace();
}
}
注:poi与jxl的使用
对于简单的单表 Excel 导入导出的需求,建议使用 JXL。数据量稍微小点, 占用内存少,速度快。 对于报表类的,涉及月份数据量,多 表数据聚合在一起建议使用 POI。