Apache POI使用详解

1.POI介绍

Apache POI 是 Apache 软件基金会的开放源码函式库,POI 提供 API 给 Java 程序对Microsoft Office 格式档案读和写的功能,.NET的开发人员则可以利用NPOI (POI for .NET) 来存取 Microsoft Office文档的功能。

Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能。POI为“Poor Obfuscation Implementation”的首字母缩写,意为“可怜的模糊实现”。

Apache POI 是创建和维护操作各种符合Office Open XML(OOXML)标准和微软的OLE 2复合文档格式(OLE2)的Java API。用它可以使用Java读取和创建,修改MS Excel文件.而且,还可以使用Java读取和创建MS Word和MSPowerPoint文件。Apache POI 提供Java操作Excel解决方案(适用于Excel97-2008)。

2.技术特点

对于报表类的,涉及月份数据量,多表数据聚合在一起建议使用 POI

1.效率高

2.支持公式,宏,一些企业应用上会非常实用

3.能够修饰单元格属性

4.支持字体、数字、日期操作

5.API 丰富,支持多种模式的读写

6.支持大数量大文件的读写操作

3.POI结构说明

包名称说明

HSSF提供读写Microsoft Excel XLS格式档案的功能。

XSSF提供读写Microsoft Excel OOXML XLSX格式档案的功能。

HWPF提供读写Microsoft Word DOC格式档案的功能。

HSLF提供读写Microsoft PowerPoint格式档案的功能。

HDGF提供读Microsoft Visio格式档案的功能。

HPBF提供读Microsoft Publisher格式档案的功能。

HSMF提供读Microsoft Outlook格式档案的功能。

4. POI 对 Excel的常用类说明

ExcelPOI
Excel 文档HSSFWorkbook
Excel 的工作表HSSFSheet
Excel 的行HSSFRow
Excel 中的单元格HSSFCell
Excel 字体HSSFFont
Excel 单元格样式HSSFCellStyle
Excel 颜色HSSFColor
Excel单元格的日期格式HSSFDataFormat
合并单元格CellRangeAddress

5.POI 基本操作

5.1.POI导出

5.1.1.使用必须引入依赖

<!--Poijar包-->
<dependency>
      <groupId>org.apache.poi</groupId>
      <artifactId>poi</artifactId>
      <version>3.15</version>
</dependency>

5.1.2.代码测试

//创建 Excel 工作薄对象
HSSFWorkbook workbook = new HSSFWorkbook();

//创建工作表   参数:表名(相当于Excel的sheet1,sheet2...)
HSSFSheet sheet = workbook.createSheet("用户信息1");

//创建行   参数:行下标(从0开始)
HSSFRow row = sheet.createRow(0);

//创建单元格   参数:所在行单元格下标(从0开始)
Cell cell = row.createCell(0);

//设置单元格内容
cell.setCellValue("第一个单元格");

//创建输出流  从内存中写入本地磁盘
workbook.write(new FileOutputStream(new File("E:/TestPoi.xls")));

上面代码主要用到了HSSFCell的setCellValue方法,该方法目前有6种不同参数的调用,下面我们来解析一下:

setCellValue(boolean)设置boolean型,即true|false
setCellValue(Canlendar)设置Canlendar,Java表示时间的一种类
setCellValue(Date)Date 也是一种时间类型
setCellValue(double)双浮点类型数字
setCellValue(RichTextString)POI中HSSFRichTextString接口的实现类,可以使用不同格式格式化一个单元格的内容。
setCellValue(String)设置字符串

后面我们会继续用到以上不同参数的方法,现在只要了解就好。

5.1.3.代码高级

//创建标题行
HSSFRow row = sheet.createRow(0);
String[] title={"ID","名字","年龄","生日"};

//处理单元格对象
HSSFCell cell = null;
for (int i = 0; i < title.length; i++) {
    cell = row.createCell(i);    //单元格下标
    cell.setCellValue(title[i]);   //单元格内容
    
    cell.setCellStyle(cellStyle);  //标题行使用样式
}

//处理数据行
for (int i = 0; i < users.size(); i++) {
    //遍历一次创建一行
    HSSFRow row2 = sheet.createRow(i+1);
   
    //每行对应放的数据
    row2.createCell(0).setCellValue(users.get(i).getId());
    row2.createCell(1).setCellValue(users.get(i).getName());
    row2.createCell(2).setCellValue(users.get(i).getAge());
    row2.createCell(3).setCellValue(users.get(i).getBir());
    
    //设置单元格日期格式
    Cell cell2 = row3.createCell(3);
    cell2.setCellStyle(cellStyle2);    //添加日期样式
    cell2.setCellValue(users.get(i).getBir());   //添加数据
}

5.1.4.设置字体格式

    //构建字体
    HSSFFont font = workbook.createFont();
    font.setBold(true);    //加粗
    font.setColor(Font.COLOR_RED); //颜色
    font.setFontHeightInPoints((short)10);  //字号
    font.setFontName("楷体");  //字体
    font.setItalic(true);    //斜体
    font.setUnderline(FontFormatting.U_SINGLE);  //下划线

    //创建样式对象
    CellStyle cellStyle = workbook.createCellStyle();
    cellStyle.setFont(font);     //将字体样式引入
    cellStyle.setAlignment(HorizontalAlignment.CENTER);  //文字居中

5.1.5.设置日期格式

    //创建样式对象
    CellStyle cellStyle2 = workbook.createCellStyle();
    //创建日期对象
    DataFormat dataFormat = workbook.createDataFormat();
    //设置日期格式
    cellStyle2.setDataFormat(dataFormat.getFormat("yyy年MM月dd日"));

5.1.6.设置行高和列宽

    //设置单元格宽度   参数:列索引,列宽
    sheet.setColumnWidth(3, 15*256);
    
    //设置行高   参数:short类型的值
    row2.setHeight((short) 250);

​ setColumnWidth的第二个参数要乘以256,这是怎么回事呢?其实,这个参数的单位是1/256个字符宽度,也就是说,这里是把第4列的宽度设置为了31个字符,而setHeight的单位是1/20个字符宽度

5.1.7.合并单元格

    //合并列
    Cell cell1 = row1.createCell(0);
    //要合并的列      参数:行开始,行结束,列开时,列结束
    CellRangeAddress region=new CellRangeAddress(0, 0, 0, 3);
    sheet.addMergedRegion(region);
    cell1.setCellValue("用户数据");

    //合并行
    Cell cell=row.createCell(6);
    CellRangeAddress region=new CellRangeAddress(0, 5, 6, 6);
    sheet.addMergedRegion(region)
    cell1.setCellValue("用户数据");

      CellRangeAddress对象其实就是表示一个区域,其构造方法如下:CellRangeAddress(firstRow, lastRow, firstCol, lastCol),参数的说明:

firstRow 区域中第一个单元格的行号

lastRow 区域中最后一个单元格的行号

firstCol 区域中第一个单元格的列号

lastCol 区域中最后一个单元格的列号

       提示: 即使你没有用CreateRow和CreateCell创建过行或单元格,也完全可以直接创建区域然后把这一区域合并,Excel的区域合并信息是单独存储的,和RowRecord、ColumnInfoRecord不存在直接关系。

5.1.8.POI测试Demo

测试环境:spring+springmvc测试类

package com.baizhi.zcn.test;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;

import javax.annotation.Resource;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.DataFormat;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.FontFormatting;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellRangeAddress;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.baizhi.zcn.dao.UserDao;
import com.baizhi.zcn.entity.User;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:spring.xml")
public class TestPoi {

	@Resource
	private UserDao userDao;
	
	@Test
	public void testExport() throws Exception{
		
		List<User> users = userDao.queryAll();
		
		//创建工作薄
		Workbook workbook = new HSSFWorkbook();	
		//创建表    参数表名
		Sheet sheet = workbook.createSheet("用户表1");
		//设置单元格宽度           参数:列索引,列宽
		sheet.setColumnWidth(3, 15*256);	
		
		//构建字体格式
		Font font = workbook.createFont();
        font.setBold(true); //加粗
        font.setColor(Font.COLOR_RED); //颜色
        font.setFontName("楷体");  //字体
        font.setFontHeightInPoints((short)10);  //字号
        font.setItalic(true);  //斜体
        font.setUnderline(FontFormatting.U_SINGLE);  //下划线
        
        //创建样式对象
		CellStyle cellStyle = workbook.createCellStyle();
		cellStyle.setFont(font); //将字体样式引入
		cellStyle.setAlignment(HorizontalAlignment.CENTER);//文字居中
		
		//创建标题行   参数下标
		Row row1 = sheet.createRow(0);
		
		//合并列
		Cell cell1 = row1.createCell(0);
		//要合并的列      参数:行开始,行结束,列开时,列结束
		CellRangeAddress region=new CellRangeAddress(0, 0, 0, 3);
		sheet.addMergedRegion(region);	
		cell1.setCellValue("用户数据");
		
		//创建类别行   参数下标
		Row row2 = sheet.createRow(1);
		//设置行高   参数:short类型的值
		row2.setHeight((short) 250);
		
		//创建标题行
		Cell cell = null;
		String[] title={"ID","名字","年龄","生日"};
		for (int i = 0; i < title.length; i++) {
			cell = row2.createCell(i);
			cell.setCellValue(title[i]);
			//标题行使用样式
			cell.setCellStyle(cellStyle);
		}
		
		//创建样式对象
		CellStyle cellStyle2 = workbook.createCellStyle();
		//创建日期对象
		DataFormat dataFormat = workbook.createDataFormat();
		//设置日期格式
		cellStyle2.setDataFormat(dataFormat.getFormat("yyy年MM月dd日"));
		
		//创建数据行
		for (int i = 0; i < users.size(); i++) {
			//遍历一次创建一行
			Row row3 = sheet.createRow(i+2);
			//每行对应放的数据
			row3.createCell(0).setCellValue(users.get(i).getId());
			row3.createCell(1).setCellValue(users.get(i).getName());
			row3.createCell(2).setCellValue(users.get(i).getAge());
			
			//设置单元格日期格式
			Cell cell2 = row3.createCell(3);
			cell2.setCellStyle(cellStyle2);    //添加日期样式
			cell2.setCellValue(users.get(i).getBir());   //添加数据
		}
				
		//从内存中写入磁盘
		workbook.write(new FileOutputStream(new File("E:/TestPoi.xls")));

	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值