POI组件:POI操作Excel

1、Excel简介

一个excel文件就是一个工作簿workbook,一个工作簿中可以创建多张工作表sheet,而一个工作表中包含多个单元格Cell,这些单元格都是由列(Column)行(Row)组成,列用大写英文字母表示,从A开始到Z共26列,然后再从AA到AZ又26列,再从BA到BZ再26列以此类推。行则使用数字表示,例如;A3 表示第三行第一列,E5表示第五行第五列。

2、POI工具包

POI全称 Poor Obfuscation Implementation,直译为“可怜的模糊实现”,利用POI接口可以通过JAVA操作Microsoft office 套件工具的读写功能。官网:http://poi.apache.org,POI支持office的所有版本(.xls和.xlsx)。

我下载的是3.14版本

解压下载的poi-bin-3.14.zip文件

将需要的jar包导入到项目当中

版本 jar包
操作2003 及以前版本的excel poi-3.14-20160307.jar
对2007及以后版本进行操作
poi-ooxml-3.14-20160307.jar

poi-ooxml-schemas-3.14-20160307.jar

以及ooxml-lib目录下的jar包

3、POI编程

3.1、POI对象与Excel之间的对象关系

在POI包中有如下几个主要对象和excel的几个对象对应:

HSSFWorkbook Excel 工作簿workbook
HSSFSheet Excel 工作表 sheet
HSSFRow Excel 行
HSSFCell Excel 单元格

HSSFHorrible Spreadsheet Format (Java implementation of Excel)

HSSF 是Horrible SpreadSheet Format的缩写,也即“讨厌的电子表格格式”。 也许HSSF的名字有点滑稽,就本质而言它是一个非常严肃、正规的API。通过HSSF,你可以用纯Java代码来读取、写入、修改Excel文件。

HSSF 为读取操作提供了两类API:usermodel和eventusermodel,即“用户模型”和“事件-用户模型”。前者很好理解,后者比较抽象,但操作效率要高得多。


工作表(属于工作簿)

行(属于工作表)

单元格(属于行;由行和列确定)

-------------操作excel

1、创建/读取工作簿

2、创建/读取工作表

3、创建/读取行

4、创建/读取单元格

3.2、对03版本Excel的写入操作

	@Test
	public void testWrite03Excel() throws Exception{
		//1、创建工作簿
		HSSFWorkbook workbook = new HSSFWorkbook();
		//2、创建工作表
		HSSFSheet sheet = workbook.createSheet("Hello World");//指定工作表名
		//3、创建行:创建第3行(第一行从0开始)
		HSSFRow row = sheet.createRow(2);
		//4、创建单元格:创建第3行第3列(第一列从0开始)
		HSSFCell cell = row.createCell(2);
		cell.setCellValue("Hello World");

		//输出到硬盘
		FileOutputStream outputStream = new FileOutputStream("D:/rk/测试.xls");
		//把Excel输出到具体的地址
		workbook.write(outputStream);
		workbook.close();
		outputStream.close();
	}

3.3、对07版本Excel的写入操作

	@Test
	public void testWrite07Excel() throws Exception{
		//1、创建工作簿
		XSSFWorkbook workbook = new XSSFWorkbook();
		//2、创建工作表
		XSSFSheet sheet = workbook.createSheet("Hello");//指定工作表名
		//3、创建行:创建第3行
		XSSFRow row = sheet.createRow(2);
		//4、创建单元格:创建第3行第3列
		XSSFCell cell = row.createCell(2);
		cell.setCellValue("Hello World");

		//输出到硬盘
		FileOutputStream outputStream = new FileOutputStream("D:/rk/测试.xlsx");
		//把Excel输出到具体的地址
		workbook.write(outputStream);
		workbook.close();
		outputStream.close();
	}

3.4、对03版本Excel的读取操作

	@Test
	public void testRead03Excel() throws Exception{
		FileInputStream inputStream = new FileInputStream("D:/rk/测试.xls");
		//1、读取工作簿:将输入流转化为Workbook对象
		HSSFWorkbook workbook = new HSSFWorkbook(inputStream);
		//2、读取第一个工作表
		HSSFSheet sheet = workbook.getSheetAt(0);
		//3、读取行:读取第3行
		HSSFRow row = sheet.getRow(2);
		//4、读取单元格:读取第3行第3列
		HSSFCell cell = row.getCell(2);
		System.out.println("第3行第3列单元格的内容为:" + cell.getStringCellValue());

		workbook.close();
		inputStream.close();
	}

3.5、对07版本Excel的读取操作

	@Test
	public void testRead07Excel() throws Exception{
		FileInputStream inputStream = new FileInputStream("D:/rk/测试.xlsx");
		//1、读取工作簿
		XSSFWorkbook workbook = new XSSFWorkbook(inputStream);
		//2、读取第一个工作表
		XSSFSheet sheet = workbook.getSheetAt(0);
		//3、读取行:读取第3行
		XSSFRow row = sheet.getRow(2);
		//4、读取单元格:读取第3行第3列
		XSSFCell cell = row.getCell(2);
		System.out.println("第3行第3列单元格的内容为:" + cell.getStringCellValue());

		workbook.close();
		inputStream.close();
	}

3.6、以统一方式读取03版本和07版本的Excel数据

在\poi-3.14\docs\apidocs目录下,打开index.html查看POI api文档

从api文档中我们了解到:

HSSFWorkbook和 XSSFWorkbook 都实现了Workbook接口;

HSSFSheet和 XSSFSheet 实现了Sheet接口;

HSSFRow和 XSSFRow 实现了Row接口;

HSSFCell和 XSSFCell 实现了Cell接口;

因为这两类处理对象共同实现了对应的同一接口,这将大大方便和简化了处理不同格式的excel文件的编码工作:在处理03和07版本的excel文件时,利用统一的接口就可以做到处理两个版本的excel数据。

	@Test
	public void testRead03and07Excel() throws Exception{
		//String fileName = "D:/rk/测试.xls";
		String fileName = "D:/rk/测试.xlsx";
		if(fileName.matches("^.+\\.(?i)((xls)|(xlsx))$")){
			boolean is03Excel = fileName.matches("^.+\\.(?i)(xls)$");

			FileInputStream inputStream = new FileInputStream(fileName);

			//1、读取工作簿
			Workbook workbook = is03Excel ? new HSSFWorkbook(inputStream) : new XSSFWorkbook(inputStream);
			//2、读取第一个工作表
			Sheet sheet = workbook.getSheetAt(0);
			//3、读取行:读取第3行
			Row row = sheet.getRow(2);
			//4、读取单元格:读取第3行第3列
			Cell cell = row.getCell(2);
			System.out.println("第3行第3列单元格的内容为:"+cell.getStringCellValue());

			workbook.close();
			inputStream.close();
		}
	}

正则表达式中的(?i)

Case-insensitive matching can also be enabled via the embedded flag expression (?i).

3.7、格式化Excel

在POI中可以利用格式化对象来格式化excel文档;也即设置excel内容的样式。POI中主要的格式化对象常用的有合并单元格、设置单元格字体、边框,背景颜色等。

(1)合并单元格

(2)单元格样式

单元格内容位置:水平居中、垂直居中

字体、加粗、颜色、大小

单元格背景色

设置列宽、行高


合并单元格对象(CellRangeAddress)属于工作簿;运用于工作表

CellRangeAddress(int firstRow, int lastRow, int firstCol, int lastCol) 起始行号,结束行号,起始列号,结束列号

样式是属于工作簿的;运用于单元格

字体是属于工作簿的;加载于样式;通用样式运用于单元格

	@Test
	public void testExcelStyle() throws Exception{
		//1、创建工作簿
		HSSFWorkbook workbook = new HSSFWorkbook();
		//1.1、创建合并单元格对象:合并第3行的第3列至第5列
		CellRangeAddress cellRangeAddress = new CellRangeAddress(2, 2, 2, 4);//起始行号,结束行号,起始列号,结束列号
		//1.2、创建单元格样式
		HSSFCellStyle style = workbook.createCellStyle();
		style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平居中
		style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中
		//1.3、创建字体
		HSSFFont font = workbook.createFont();
		font.setFontName(HSSFFont.FONT_ARIAL);//字体为Arial
		font.setColor(HSSFColor.BLUE.index);//字体颜色为Blue
		font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);//加粗字体
		font.setFontHeightInPoints((short)16);//设置字体大小
		//加载字体
		style.setFont(font);

		//单元格背景
		//设置单元格填充模式,模式为全部前景色
		style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
		//设置填充背景色
		style.setFillBackgroundColor(HSSFColor.YELLOW.index);
		//设置填充前景色
		style.setFillForegroundColor(HSSFColor.RED.index);

		//2、创建工作表
		HSSFSheet sheet = workbook.createSheet("hello");//指定工作表名
		//2.1、加载合并单元格对象
		sheet.addMergedRegion(cellRangeAddress);
		sheet.setColumnWidth(0, 20*256);//列宽单位是字符的1/256

		//3、创建行:创建第3行
		HSSFRow row = sheet.createRow(2);
		row.setHeightInPoints(100); //设置行的高度
		//4、创建单元格:创建第3行第3列
		HSSFCell cell = row.createCell(2);
		//加载样式
		cell.setCellStyle(style);
		cell.setCellValue("Hello World");

		//输出至硬盘
		FileOutputStream outputStream = new FileOutputStream("D:/rk/测试样式.xls");
		//把Excel输出到具体的地址
		workbook.write(outputStream);
		workbook.close();
		outputStream.close();

	}

完整的代码TestPOI.java

package com.rk.test;

import java.io.FileInputStream;
import java.io.FileOutputStream;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
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.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.Cell;
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.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.junit.Test;

public class TestPOI {
	@Test
	public void testWrite03Excel() throws Exception{
		//1、创建工作簿
		HSSFWorkbook workbook = new HSSFWorkbook();
		//2、创建工作表
		HSSFSheet sheet = workbook.createSheet("Hello World");//指定工作表名
		//3、创建行:创建第3行(第一行从0开始)
		HSSFRow row = sheet.createRow(2);
		//4、创建单元格:创建第3行第3列(第一列从0开始)
		HSSFCell cell = row.createCell(2);
		cell.setCellValue("Hello World");

		//输出到硬盘
		FileOutputStream outputStream = new FileOutputStream("D:/rk/测试.xls");
		//把Excel输出到具体的地址
		workbook.write(outputStream);
		workbook.close();
		outputStream.close();
	}

	@Test
	public void testWrite07Excel() throws Exception{
		//1、创建工作簿
		XSSFWorkbook workbook = new XSSFWorkbook();
		//2、创建工作表
		XSSFSheet sheet = workbook.createSheet("Hello");//指定工作表名
		//3、创建行:创建第3行
		XSSFRow row = sheet.createRow(2);
		//4、创建单元格:创建第3行第3列
		XSSFCell cell = row.createCell(2);
		cell.setCellValue("Hello World");

		//输出到硬盘
		FileOutputStream outputStream = new FileOutputStream("D:/rk/测试.xlsx");
		//把Excel输出到具体的地址
		workbook.write(outputStream);
		workbook.close();
		outputStream.close();
	}

	@Test
	public void testRead03Excel() throws Exception{
		FileInputStream inputStream = new FileInputStream("D:/rk/测试.xls");
		//1、读取工作簿:将输入流转化为Workbook对象
		HSSFWorkbook workbook = new HSSFWorkbook(inputStream);
		//2、读取第一个工作表
		HSSFSheet sheet = workbook.getSheetAt(0);
		//3、读取行:读取第3行
		HSSFRow row = sheet.getRow(2);
		//4、读取单元格:读取第3行第3列
		HSSFCell cell = row.getCell(2);
		System.out.println("第3行第3列单元格的内容为:" + cell.getStringCellValue());

		workbook.close();
		inputStream.close();
	}

	@Test
	public void testRead07Excel() throws Exception{
		FileInputStream inputStream = new FileInputStream("D:/rk/测试.xlsx");
		//1、读取工作簿
		XSSFWorkbook workbook = new XSSFWorkbook(inputStream);
		//2、读取第一个工作表
		XSSFSheet sheet = workbook.getSheetAt(0);
		//3、读取行:读取第3行
		XSSFRow row = sheet.getRow(2);
		//4、读取单元格:读取第3行第3列
		XSSFCell cell = row.getCell(2);
		System.out.println("第3行第3列单元格的内容为:" + cell.getStringCellValue());

		workbook.close();
		inputStream.close();
	}

	@Test
	public void testRead03and07Excel() throws Exception{
		//String fileName = "D:/rk/测试.xls";
		String fileName = "D:/rk/测试.xlsx";
		if(fileName.matches("^.+\\.(?i)((xls)|(xlsx))$")){
			boolean is03Excel = fileName.matches("^.+\\.(?i)(xls)$");

			FileInputStream inputStream = new FileInputStream(fileName);

			//1、读取工作簿
			Workbook workbook = is03Excel ? new HSSFWorkbook(inputStream) : new XSSFWorkbook(inputStream);
			//2、读取第一个工作表
			Sheet sheet = workbook.getSheetAt(0);
			//3、读取行:读取第3行
			Row row = sheet.getRow(2);
			//4、读取单元格:读取第3行第3列
			Cell cell = row.getCell(2);
			System.out.println("第3行第3列单元格的内容为:"+cell.getStringCellValue());

			workbook.close();
			inputStream.close();
		}
	}

	@Test
	public void testExcelStyle() throws Exception{
		//1、创建工作簿
		HSSFWorkbook workbook = new HSSFWorkbook();
		//1.1、创建合并单元格对象:合并第3行的第3列至第5列
		CellRangeAddress cellRangeAddress = new CellRangeAddress(2, 2, 2, 4);//起始行号,结束行号,起始列号,结束列号
		//1.2、创建单元格样式
		HSSFCellStyle style = workbook.createCellStyle();
		style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平居中
		style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中
		//1.3、创建字体
		HSSFFont font = workbook.createFont();
		font.setFontName(HSSFFont.FONT_ARIAL);//字体为Arial
		font.setColor(HSSFColor.BLUE.index);//字体颜色为Blue
		font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);//加粗字体
		font.setFontHeightInPoints((short)16);//设置字体大小
		//加载字体
		style.setFont(font);

		//单元格背景
		//设置单元格填充模式,模式为全部前景色
		style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
		//设置填充背景色
		style.setFillBackgroundColor(HSSFColor.YELLOW.index);
		//设置填充前景色
		style.setFillForegroundColor(HSSFColor.RED.index);

		//2、创建工作表
		HSSFSheet sheet = workbook.createSheet("hello");//指定工作表名
		//2.1、加载合并单元格对象
		sheet.addMergedRegion(cellRangeAddress);
		sheet.setColumnWidth(0, 20*256);//列宽单位是字符的1/256

		//3、创建行:创建第3行
		HSSFRow row = sheet.createRow(2);
		row.setHeightInPoints(100); //设置行的高度
		//4、创建单元格:创建第3行第3列
		HSSFCell cell = row.createCell(2);
		//加载样式
		cell.setCellStyle(style);
		cell.setCellValue("Hello World");

		//输出至硬盘
		FileOutputStream outputStream = new FileOutputStream("D:/rk/测试样式.xls");
		//把Excel输出到具体的地址
		workbook.write(outputStream);
		workbook.close();
		outputStream.close();

	}
}
时间: 2024-10-20 01:00:32

POI组件:POI操作Excel的相关文章

C#使用第三方组件Epplus操作Excel表

Epplus操作Excel基础详解 1.什么是Epplus Epplus是一个使用Open Office XML文件格式,能读写Excel2007/2010文件的开源组件,在导出Excel的时候不需要电脑上安装office. 其中,Open Office XML文档格式包括我们常见的xlsx.docx.pptx等,换而言之,我们常见的这些格式的文件都是基于捆绑XML文件的,使用Epplus操作的本质是通过操作XML文件去操作xlsx.XML,是一种可扩展标记语言,在计算机中,标记指计算机能理解的

(一)JAVA使用POI操作excel

1,Poi 简介 Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能 POI为“Poor Obfuscationmplementation”的首字母缩写,意为“可怜的模糊实现”. Apache POI 是创建和维护操作各种符合Office Open XML(OOXML)标准和微软的OLE 2复合文档格式(OLE2)的Java API.用它可以使用Java读取和创建,修改M

Java使用POI实现数据导出excel报表

在上篇文章中,我们简单介绍了java读取word,excel和pdf文档内容 ,但在实际开发中,我们用到最多的是把数据库中数据导出excel报表形式.不仅仅简单的读取office中的数据.尤其是在生产管理或者财务系统中用的非常普遍,因为这些系统经常要做一些报表打印的工作.而数据导出的格式一般是EXCEL或者PDF .所以今天我们来简单看一下利用Apache  POI实现数据库中数据导出excel报表.在java中有很多实现数据导出excel报表的第三方jar包.但在比较了一下感觉还是POI相对来

JAVA_POI 操作Excel

转自: http://rensanning.iteye.com/blog/1538591# Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能. Apache POI 是创建和维护操作各种符合Office Open XML(OOXML)标准和微软的OLE 2复合文档格式(OLE2)的Java API.用它可以使用Java读取和创建,修改MS Excel文件.而且,还可以使

C#操作Excel文件~创建Excel文件

今天用了近一天的时间来完成和学习,和大家分享如下: 网上有用插件的方法,我是用COM组件 C#操作Excel文件: 1.在程序里创建Excel文件 2.在程序里对已有的Excel文件修改数据 前提: using MSExcel = Microsoft.Office.Interop.Excel; using System.Reflection; using System.IO; 备注:第一个指令集会报错,需要添加引用COM下的Office和Excel 功能一:在程序里创建Excel文件 /// <

VC++操作Excel

摘要:使用Microsoft Office所带的控件来实现代码操作excel表格. 开发环境:操作系统是Microsoft Windows7 32bit,Office办公套装是Microsoft Office 2003,编程环境是Microsoft Visual Studio 6.0. 使用背景:我最近有个项目中要生成报表,是将数据库中的发证数据查询出来导出到Excel表格中以便打印,所以上网找了这方面的内容,具体内容如下,如错误还请指证. 从平常我们操作一般文件上来看,无非是打开文件,操作文件

Apache POI组件操作Excel,制作报表(一)

Apache的POI组件是Java操作Microsoft Office办公套件的强大API,其中对Word,Excel和PowperPoint都有支持,当然使用较多的还是Excel,因为Word和PowerPoint用程序动态操作的应用较少.那么本文就结合POI来介绍一下操作Excel的方法.    Office 2007的文件结构完全不同于2003,所以对于两个版本的Office组件,POI有不同的处理API,分开使用即可.首先来说几个Excel的基本概念.对于一个Excel文件,这称为一个工

Apache POI组件操作Excel,制作报表(二)

现在来看看Excel的基本设置问题,以2007为例,先从工作簿来说,设置列宽,因为生成表格列应该固定,而行是遍历生成的,所以可以在工作簿级别来设置列宽,那么可以如下来进行.    首先是创建工作簿和工作表了: 1 // 创建Excel2007工作簿对象 2 XSSFWorkbook workbook2007 = new XSSFWorkbook(); 3 // 创建工作表对象并命名 4 XSSFSheet sheet = workbook2007.createSheet("学生信息统计表&quo

POI操作EXCEL(二)

原文转自:http://www.tqcto.com/article/code/295025.html java当初把核心处理设成Unicode,带来的好处是另代码适应了多语言环境.然而由于老外的英语只有26个字母,有些情况下,一些程序员用8 位的byte处理,一不小心就去掉了CJK的高位.或者是由于习惯在程序中采用硬编码,还有多种原因,使得许多java应用在CJK的处理上很烦恼.还好 在POI HSSF中考虑到这个问题,可以设置encoding为双字节. POI可以到www.apache.org