POI(一)

              POI操作Excel

 Excel简介

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

POI工具包

JAVA中操作Excel的有两种比较主流的工具包: JXL 和 POI 。jxl 只能操作Excel 95, 97, 2000也即以.xls为后缀的excel。而poi可以操作Excel 95及以后的版本,即可操作后缀为 .xls 和 .xlsx两种格式的excel.

JXL的官网为:http://www.andykhan.com/jexcelapi

POI全称 Poor Obfuscation Implementation,直译为“可怜的模糊实现”,利用POI接口可以通过JAVA操作Microsoft office 套件工具的读写功能。官网:http://poi.apache.org ,POI支持office的所有版本,并且在接下来的演示中需要从前端页面导入用户上传的版本不确定的excel文件,所以选择POI来讲解。在官网,下载POI :

下载完后,打开获取操作excel需要的jar包,并将这些jar包复制到项目中。

如:

对于只操作2003 及以前版本的excel,只需要 poi-3.10.1-20140818.jar ,如果需要同时对2007及以后版本进行操作则需要复制 poi-ooxml-3.10.1-20140818.jar,poi-ooxml-schemas-3.10.1-20140818.jar,以及复制在ooxml-lib目录下的xmlbeans-2.6.0.jar,dom4j-1.6.1.jar。

 POI Hello World

在POI包中有如下几个主要对象和excel的几个对象对应:
HSSFWorkbook Excel 工作簿workbook
HSSFSheet Excel 工作表 sheet
HSSFRow Excel 行
HSSFCell Excel 单元格
利用以上几个对象,我们简单创建一个Excel工作表,往里面的C1单元格写入和读出“Hello World”:

POI与Excel

通过上门的例子我们知道如下信息:
  • Excel 的工作簿对应POI的HSSFWorkbook对象;
  • Excel 的工作表对应POI的HSSFSheet对象;
  • Excel 的行对应POI的HSSFRow对象;
  • Excel 的单元格对应POI的HSSFCell对象。
POI 也能对07以后的excel版本进行读写,读写方法和读写03版是一样的,只是对象名称变了;原来各对象的开头字母H变为X,操作方式不变。
  • Excel 的工作簿对应POI的XSSFWorkbook对象;
  • Excel 的工作表对应POI的XSSFSheet对象;
  • Excel 的行对应POI的XSSFRow对象;
  • Excel 的单元格对应POI的XSSFCell对象。

创建07以后版本excel

读取07以后版本excel

         在“poi-bin-3.10.1-20140818\poi-3.10.1\docs\apidocs”目录中,点击“index.html”查看POI api文档,我们可以查询POI中所有这些对象的属性和方法。

从api文档中我们了解到:

HSSFWorkbook 和 XSSFWorkbook 都实现了Workbook接口;

HSSFSheet 和 XSSFSheet 实现了Sheet接口;

HSSFRow 和 XSSFRow 实现了Row接口;

HSSFCell 和 XSSFCell 实现了Cell接口;

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

POI同时读入03和07版本的excel。

方法一:判断文件的名称后调用对应版本的读入方法。

方法二:根据不同版本用Workbook接口来读入文件并统一处理。

 格式化Excel

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

合并单元格

在POI中有一个CellRangeAddress对象,中文直译是 单元格范围地址,主要用于在单元格的合并上,这个对象的构造方法CellRangeAddress(int firstRow, int lastRow, int firstCol, int lastCol) 有4个参数,分别表示(起始行号,终止行号, 起始列号,终止列号), 设置这个对象中要合并的单元格范围后,工作表对象sheet调用方法addMergedRegion(CellRangeAddress region) ,将上述设置的CellRangeAddress对象作为参数传入即可合并单元格。

【注意:上图中合并单元格后,单元格的名称是第一个单元格;即上面中合并了第二行的第二列到第五列,合并后的单元格叫B2,而其它被合并的单元格已经无效了,不能对无效单元格设置值。如果进行了设置将不显示。】

设置单元格样式

首先要设置单元格样式则要先初始化POI中的单元格样式对象HSSFCellStyle,然后在样式对象中设置不同的样式(内容位置、字体、背景、颜色、边框等)。单元格样式是由工作簿workbook创建的,一个工作簿可以创建多个样式。

 
  • 设置单元格字体;POI中的字体对象为HSSFFont,字体是由工作簿创建,可以用于多个单元格上。
  • 设置单元格背景色。

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

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;
/*
excel基础元素

工作簿
工作表(属于工作簿)
行(属于工作表)
单元格(属于行;由行和列确定)

-------------操作excel
1、创建/读取工作簿
2、创建/读取工作表
3、创建/读取行
4、创建/读取单元格
*/
public class TestPOI2Excel {

@Test
public void testWrite03Excel() throws IOException{

//1、创建工作簿
HSSFWorkbook workbook = new HSSFWorkbook();
//2、创建工作表
HSSFSheet sheet = workbook.createSheet(“hello word”);//指定工作表名
//3、创建行 从0开始的
HSSFRow row = sheet.createRow(2); //创建第三行
//4、创建单元格 从0开始的
HSSFCell cell = row.createCell(2); //创建第三行第三列
cell.setCellValue(“Hello Word!”);

//输出到硬盘
FileOutputStream outputStream = new FileOutputStream(“E:\POI\测试.xls”);
//把excel的内容输出到文件中
workbook.write(outputStream);

//关流
workbook.close();
outputStream.close();
}

@Test
public void testRead03Excel() throws IOException{
FileInputStream inputStream = new FileInputStream(“E:\POI\测试.xls”);
//1、读取工作簿
HSSFWorkbook workbook = new HSSFWorkbook(inputStream);
//2、读取工作表 读取第一个工作表
HSSFSheet sheet = workbook.getSheetAt(0);//指定工作表名
//3、读取行 从0开始的
HSSFRow row = sheet.getRow(2); //创建第三行
//4、读取单元格 从0开始的
HSSFCell cell = row.getCell(2); //创建第三行第三列
System.out.println("第三行第三列单元格的内容为: " + cell.getStringCellValue());

//关流
workbook.close();
inputStream.close();

}

/
03 转为07 版本 就是将HSSF ==> XSSF
并将文件名转化为 .xlsx 后缀
/
@Test
public void testWrite07Excel() throws IOException{

//1、创建工作簿
XSSFWorkbook workbook = new XSSFWorkbook();
//2、创建工作表
XSSFSheet sheet = workbook.createSheet(“hello word”);//指定工作表名
//3、创建行 从0开始的
XSSFRow row = sheet.createRow(2); //创建第三行
//4、创建单元格 从0开始的
XSSFCell cell = row.createCell(2); //创建第三行第三列
cell.setCellValue(“Hello Word!”);

//输出到硬盘
FileOutputStream outputStream = new FileOutputStream(“E:\POI\测试.xlsx”);
//把excel的内容输出到文件中
workbook.write(outputStream);

//关流
workbook.close();
outputStream.close();
}

/
同时读取03 和 07 版本
/
@Test
public void testRead03And07Excel() throws IOException{
String fileName = “E:\POI\测试.xls”;
if(fileName.matches("^.+\.(?i)((xls)|(xlsx))KaTeX parse error: Expected '}', got 'EOF' at end of input: …^.+\\.(?i)(xls)");

FileInputStream inputStream = new FileInputStream(fileName);

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

//关流
workbook.close();
inputStream.close();
}
}

/*
-----------excel样式

合并单元格对象(CellRangeAddress)属于工作簿;运用于工作表
CellRangeAddress(int firstRow, int lastRow, int firstCol, int lastCol) 起始行号,结束行号,起始列号,结束列号
样式是属于工作簿的;运用于单元格
字体是属于工作簿的;加载于样式;通用样式运用于单元格
*/
@Test
public void testExcelStyle() throws IOException{

//1、创建工作簿
HSSFWorkbook workbook = new HSSFWorkbook();
//1.1 创建合并单元格对象, 合并第三行第三列到第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.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); // 加粗字体
//font.setFontHeight((short)16); //设置字体大小 字体大小为正常的20/1
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 word”);//指定工作表名
//2.1 加载合并单元格对象
sheet.addMergedRegion(cellRangeAddress);

//3、创建行 从0开始的
HSSFRow row = sheet.createRow(2); //创建第三行
//4、创建单元格 从0开始的
HSSFCell cell = row.createCell(2); //创建第三行第三列
//加载样式
cell.setCellStyle(style);
cell.setCellValue(“Hello Word!”);

//输出到硬盘
FileOutputStream outputStream = new FileOutputStream(“E:\POI\测试.xls”);
//把excel的内容输出到文件中
workbook.write(outputStream);

//关流
workbook.close();
outputStream.close();
}

}

猜你喜欢

转载自blog.csdn.net/qq_41164787/article/details/86526827
poi
今日推荐