分享

POI技术使用说明

 三十的狼 2018-06-19



POI技术使用说明



目    


一、 文档总体说明 3

二、 POI技术基础准备 3

2.1常用jar包 3

2.2资源下载网址 3

三、 POI对EXCEL的操作 3

3.1创建一个Excel 3

3.1.1常用方法以及实例对象的创建 3

3.1.2完整例子 4

3.2 解析Excel 5

3.2.1 常用方法整理 5

3.2.2 完整实例 5

四、 POI对word的操作 6

4.1 关于POI 对word操作的简介 6

4.2 POI 对word的解析 7

4.2.1 常用方法整理 7

4.2.2 对word中图片的解析例子 7

五、 POI对ppt的操作 8

5.1 POI 创建PPT文件 8

5.1.1 常用方法整理 8

5.1.2 完整例子 8

 

一、文档总体说明

该文档的主要内容是对POI技术的使用说明,POI 技术主要是对office文件的读写控制,通过程序解析文件中的内容,或者将数据内容生成文件。操作的对象主要有:excel,doc,ppt等文件。

二、POI技术基础准备

2.1常用jar包

主要jar包:poi-3.8-beta4-20110826.jar

poi-excelant-3.8-beta4-20110826.jar

poi-ooxml-3.8-beta4-20110826.jar

poi-scratchpad-3.8-beta4-20110826.jar

一些辅助的jar 包有:xmlbeans-2.3.0.jar

stax-api-1.0.1.jar

ooxml-schemas-1.0.jar

log4j-1.2.13.jar

dom4j-1.6.1.jar

commons-logging-1.1.jar

commons-codec-1.3.jar

2.2资源下载网址

主要Jar包:http://poi./download.html

三、POI对EXCEL的操作

3.1创建一个Excel

3.1.1常用方法以及实例对象的创建

(1)HSSFWorkbook demoWorkBook = new HSSFWorkbook();// 创建一个excel对象

(2)HSSFSheet demoSheet = demoWorkBook.createSheet("sheet名称");// 创建一个sheet对象,可创建多个

(3)HSSFRow row = demoSheet.createRow((short) index); //创建excel行,index为第几行,从0开始

(4)HSSFCell cell = row.createCell(i);// 创建第row行的第i个单元格,i从0开始

(5)单元格内容的设置:

HSSFCellStyle cellStyle2 = demoWorkBook.createCellStyle();//创建单元格样式

HSSFDataFormat format = demoWorkBook.createDataFormat();//创建数据格式

cellStyle2.setDataFormat(format.getFormat("@"));//字符串类型所对应的是数据格式为"@"

cell.setCellStyle(cellStyle2);//给cell赋样式

cell.setCellValue(cells.get(i));//给单元格赋值

3.1.2完整例子

package com.poi.excel;

import java.io.FileOutputStream;

import org.apache.poi.hssf.usermodel.HSSFCell;

import org.apache.poi.hssf.usermodel.HSSFCellStyle;

import org.apache.poi.hssf.usermodel.HSSFDataFormat;

import org.apache.poi.hssf.usermodel.HSSFRow;

import org.apache.poi.hssf.usermodel.HSSFSheet;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;

public class Test {

public static void main(String[] args) throws Exception {

String fileName = "f:\\我创建的Excel.xls";

FileOutputStream fos = null;

String[] tableHeader = { "姓名", "民族", "性别","年龄"};//表头名字

HSSFWorkbook demoWorkBook = new HSSFWorkbook();// 创建excel

HSSFSheet demoSheet = demoWorkBook.createSheet("个人信息");// 创建sheet

int cellNumber = tableHeader.length;// 表头数目

 

HSSFRow headerRow = demoSheet.createRow((short) 0); //第一行

for (int i = 0; i < cellNumber; i++) {

HSSFCell headerCell = headerRow.createCell(i);//创建第一行第i个单元格,从0开始

headerCell.setCellType(HSSFCell.CELL_TYPE_STRING);//设置内容格式为字符串型

headerCell.setCellValue(tableHeader[i]);//设置内容

}

 

for (int i = 1; i < 10; i++) {

HSSFRow row = demoSheet.createRow(i);// 创建第rowIndex行

for (int j = 0; j < cellNumber; j++) {

HSSFCell cell = row.createCell(j);// 创建第rowIndex行的第i个单元格

if (cell.getCellType() != 1) {

cell.setCellType(HSSFCell.CELL_TYPE_STRING);//设置数据类型

}

// 设置CELL格式为文本格式

HSSFCellStyle cellStyle2 = demoWorkBook.createCellStyle();//创建单元格样式

HSSFDataFormat format = demoWorkBook.createDataFormat();//创建数据格式

cellStyle2.setDataFormat(format.getFormat("@"));//字符串类型所对应的是数据格式为"@"

cell.setCellStyle(cellStyle2);//给cell赋样式

cell.setCellValue("第"+i+"行 第"+j+"列");//给单元格赋值

}

}

//写入文件

fos = new FileOutputStream(fileName);//文件输出流

demoWorkBook.write(fos);

System.out.println("表格已成功导出到 : " + fileName);

}

}

3.2 解析Excel

3.2.1 常用方法整理

(1)HSSFWorkbook wb = HSSFReadWrite.readFile(fileName);//xls文件转换成Excel实体类

(2)wb.getNumberOfSheets()//获取Excel实体类的sheet数目

(3)HSSFSheet sheet = wb.getSheetAt(k);//获取sheet对象

(4)int rows = sheet.getPhysicalNumberOfRows();//获取sheet行数

(5)HSSFRow row = sheet.getRow(r);//获取单行对象

(6)int cells = row.getPhysicalNumberOfCells();//该数据行的列数目

(7)HSSFCell cell = row.getCell(c);//获取单元格对象

(8)得到单元格内容:

value = "FORMULA value=" + cell.getCellFormula();//公式型数据

value = "NUMERIC value=" + cell.getNumericCellValue();//数字型

value = "STRING value=" + cell.getStringCellValue();//字符串型

3.2.2 完整实例

String fileName = "e:\\test.xls";

HSSFWorkbook wb = HSSFReadWrite.readFile(fileName);//xls文件转换成Excel实体类

for (int k = 0; k < wb.getNumberOfSheets(); k++) {//wb.getNumberOfSheets()为sheet数目//遍历

HSSFSheet sheet = wb.getSheetAt(k);//获取sheet对象

int rows = sheet.getPhysicalNumberOfRows();//获取sheet行数

//wb.getSheetName(k)为sheet名字

System.out.println("Sheet " + k + " "" + wb.getSheetName(k) + "" has " + rows

+ " row(s).");

for (int r = 0; r < rows; r++) {//遍历行

HSSFRow row = sheet.getRow(r);//获取单行对象

if (row == null) {

continue;

}

int cells = row.getPhysicalNumberOfCells();//该数据行的列数目

//row.getRowNum()为行号,从0开始

System.out.println("\nROW " + row.getRowNum() + " has " + cells

+ " cell(s).");

for (int c = 0; c < cells; c++) {

HSSFCell cell = row.getCell(c);//获取单元格对象

String value = null;

switch (cell.getCellType()) {//判断单元格数据类型

case HSSFCell.CELL_TYPE_FORMULA://公式型

value = "FORMULA value=" + cell.getCellFormula();

break;

case HSSFCell.CELL_TYPE_NUMERIC://数值型

value = "NUMERIC value=" + cell.getNumericCellValue();

break;

case HSSFCell.CELL_TYPE_STRING://字符型

value = "STRING value=" + cell.getStringCellValue();

break;

default:

}

System.out.println("CELL col=" + cell.getColumnIndex() + " VALUE="

+ value);

}

}

}

四、POI对word的操作

4.1 关于POI 对word操作的简介

POI 对word操作,其中解析word还行,但是把数据生成一个word就没那么好用了。下面主要介绍的是POI对word的解析

4.2 POI 对word的解析

4.2.1 常用方法整理

(1)FileInputStream in = new FileInputStream("D:\\b.doc");// 获得文件的输入流

(2)POIFSFileSystem pfs = new POIFSFileSystem(in);// poi系统流文件对象

(3)HWPFDocument hwpf = new HWPFDocument(pfs);// 获取word文档对象

(4)Range range = hwpf.getRange();// 得到文档的读取范围

(5)WordExtractor extractor = new WordExtractor(hwpf);// 读取所有文字

String wordcontents = extractor.getText().trim();

 

(6)TableIterator it = new TableIterator(range);// 获得所有表格的迭代器

(7)Table tb = (Table) it.next();//遍历获取每一个表格

(8)tb.numRows()//获取表格的行数

(9)TableRow tr = tb.getRow(i);//获取行对象

(10)tr.numCells()//获取单行的列数

(11)TableCell td = tr.getCell(j);//单行中的单元格

(12)int p = td.numParagraphs();// 该单元格内字符串的行数

(13)Paragraph para = td.getParagraph(k);   String s = para.text();// 表格中的内容

4.2.2 对word中图片的解析例子

FileInputStream in = new FileInputStream("D:\\b.doc");// 获得文件的输入流

POIFSFileSystem pfs = new POIFSFileSystem(in);// poi系统流文件对象

HWPFDocument hwpf = new HWPFDocument(pfs);// 获取word文档对象

Range range = hwpf.getRange();// 得到文档的读取范围

String imgPath = "D:/bbbbbb";

File imgFile = new File(imgPath);

if (!imgFile.exists()) {

imgFile.mkdir();

}

// 得到word的数据流

byte[] dataStream = hwpf.getDataStream();

int numChar = range.numCharacterRuns();

PicturesTable pTable = new PicturesTable(hwpf, dataStream,

dataStream, null, null);

for (int j = 0; j < numChar; ++j) {

CharacterRun cRun = range.getCharacterRun(j);

// 判断是否有图片

boolean has = pTable.hasPicture(cRun);

if (has) {

Picture pic = pTable.extractPicture(cRun, true);//获取该图片

// 目录路径,保存成文件

pic.writeImageContent(new FileOutputStream(imgPath + "/"

+ file.getName().replaceAll(".doc", "") +"-"+ j + ".jpg"));

}

}

五、POI对ppt的操作

5.1 POI 创建PPT文件

5.1.1 常用方法整理

(1)HSLFSlideShow hslf = HSLFSlideShow.create();

SlideShow ppt = new SlideShow(hslf);//创建ppt

(2)Slide slide = ppt.createSlide();//创建幻灯片

(3)Table table1 = new Table(6, 2);//创建表格

(4)slide.addShape(table1);//添加table到ppt中

(5)table1.moveTo((pgWidth - table1.getAnchor().width)/2, 100);//设置table位置

(6)TextBox textBox=new TextBox();//创建文本框

(7)File file=new File("d:\\001.png");//获取图片文件        BufferedImage image = ImageIO.read(file);//可获取图片属性

(8)int newIndex = ppt.addPicture(file, Picture.PNG);//添加到ppt内,返回id//第一个参数也可以传图片的byte[]

(9)Picture picture2=new Picture(newIndex);//获得图片

(10)picture2.setAnchor(new Rectangle(100,100,100,100));//后两个设置图片大小  ,前两个设置位置

(11)slide1.addShape(picture2);//插入幻灯片

5.1.2 完整例子

public final class TableDemo {

public static void main(String[] args) throws Exception {

//test data for the first taable

String[][] txt1 = {

{"INPUT FILE", "NUMBER OF RECORDS"},

{"Item File", "11,559"},

{"Vendor File", "502"},

{"Purchase History File - # of PO\u2019s\r(12/01/04 - 05/31/06)", "12,852"},

{"Purchase History File - # of PO Lines\r(12/01/04 - 05/31/06)", "53,523" },

{"Total PO History Spend", "$10,172,038"}

};

HSLFSlideShow hslf = HSLFSlideShow.create();

SlideShow ppt = new SlideShow(hslf);//创建ppt

DocumentSummaryInformation doc = hslf.getDocumentSummaryInformation();  

SummaryInformation info = hslf.getSummaryInformation();  

doc.setCompany("secret");

info.setAuthor("杜磊米");

info.setTitle("nothing");

Slide slide = ppt.createSlide();//创建幻灯片

Slide slide1 = ppt.createSlide();

 

//six rows, two columns

Table table1 = new Table(6, 2);//创建表格

for (int i = 0; i < txt1.length; i++) {//遍历数据

for (int j = 0; j < txt1[i].length; j++) {

TableCell cell = table1.getCell(i, j);//获得单个单元格

cell.setText(txt1[i][j]);//设置内容

RichTextRun rt = cell.getTextRun().getRichTextRuns()[0];//获得文本

rt.setFontName("Arial");

rt.setFontSize(10);//字号

if(i == 0){

cell.getFill().setForegroundColor(new Color(227, 227, 227));//table的背景颜色

} else {

rt.setBold(true);//字体加粗

}

cell.setVerticalAlignment(TextBox.AnchorMiddle);

cell.setHorizontalAlignment(TextBox.AlignCenter);

}

}

Line border1 = table1.createBorder();

border1.setLineColor(Color.black);

border1.setLineWidth(1.0);

table1.setAllBorders(border1);

table1.setColumnWidth(0, 300);

table1.setColumnWidth(1, 150);

slide.addShape(table1);//添加table到ppt中

int pgWidth = ppt.getPageSize().width;

table1.moveTo((pgWidth - table1.getAnchor().width)/2, 100);//设置table位置

 

 

TextBox textBox=new TextBox();

textBox.setText("我爱北京天安门");

textBox.setAnchor(new Rectangle((pgWidth-200)/2,10,200,30));

RichTextRun richTextRun=textBox.getTextRun().getRichTextRunAt(0);

richTextRun.setFontColor(Color.blue);

textBox.setFillColor(Color.gray);//背景色

slide1.addShape(textBox);

// 创建并置入简单文本    

TextBox _text = new TextBox();    

TextRun _textRun = _text.createTextRun();    

_textRun.setRawText("杜磊米");    

_text.setAnchor(new Rectangle(10,10,100,100));    

// 创建并置入带有样式的文本    

AutoShape _autoShape = new AutoShape(ShapeTypes.Rectangle); //设置形状    

TextRun _autoText = _autoShape.createTextRun();    

_autoText.setRawText("杜磊米");    

_autoShape.setAnchor(new Rectangle(200,200,100,100));    

_autoShape.setFillColor(new Color(170,215,255));    

_autoShape.setLineWidth(5.0);    

_autoShape.setLineStyle(Line.LINE_DOUBLE);    

// AutoShape 对象可以设置多个不同样式文本    

TextRun _autoText2 = _autoShape.createTextRun();    

RichTextRun _richText = _autoText2.appendText("杜");    

_richText.setFontColor(new Color(255,255,255));    

RichTextRun _richText2 = _autoText2.appendText("磊米");    

_richText2.setFontColor(new Color(255,0,0));    

_richText2.setFontSize(12);   

slide1.addShape(_text);    

slide1.addShape(_autoShape);   

 

 

File file=new File("d:\\001.png");//获取图片文件    

BufferedImage image = ImageIO.read(file);//可获取图片属性

int newIndex = ppt.addPicture(file, Picture.PNG);//添加到ppt内,返回id//第一个参数也可以传图片的byte[]

Picture picture2=new Picture(newIndex);//获得图片

picture2.setAnchor(new Rectangle(100,100,100,100));//后两个设置图片大小  ,前两个设置位置

slide1.addShape(picture2);//插入幻灯片

 

//picture2.moveTo(200, 200);

//test data for the second taable

String[][] txt2 = {

{"Data Source"},

{"CAS Internal Metrics - Item Master Summary\r" +

"CAS Internal Metrics - Vendor Summary\r" +

"CAS Internal Metrics - PO History Summary"}

};

//two rows, one column

Table table2 = new Table(2, 1);

for (int i = 0; i < txt2.length; i++) {//遍历数据

for (int j = 0; j < txt2[i].length; j++) {

TableCell cell = table2.getCell(i, j);//选择单个单元格

cell.setText(txt2[i][j]);//设置单元格内容

RichTextRun rt = cell.getTextRun().getRichTextRuns()[0];

rt.setFontSize(10);

rt.setFontName("Arial");

if(i == 0){

cell.getFill().setForegroundColor(new Color(0, 51, 102));

rt.setFontColor(Color.white);

rt.setBold(true);

rt.setFontSize(14);

cell.setHorizontalAlignment(TextBox.AlignCenter);

} else {

rt.setBullet(true);

rt.setFontSize(12);

cell.setHorizontalAlignment(TextBox.AlignLeft);

}

cell.setVerticalAlignment(TextBox.AnchorMiddle);

}

}

table2.setColumnWidth(0, 300);

table2.setRowHeight(0, 30);

table2.setRowHeight(1, 70);

Line border2 = table2.createBorder();

table2.setOutsideBorders(border2);

slide.addShape(table2);

table2.moveTo(200, 400);

FileOutputStream out = new FileOutputStream("d:/hslf-table.ppt");

ppt.write(out);

out.close();

System.out.println("完成");

}

private static int loadPicture( String path,  SlideShow show) throws IOException

{//将图片转化成ByteArrayOutputStream然后添加到hssfWorkbook对象中,返回图片的index

int pictureIndex;

FileInputStream fis = null;

ByteArrayOutputStream bos = null;

try

{

fis = new FileInputStream(path);

bos = new ByteArrayOutputStream( );

int c;

while ( (c = fis.read()) != -1)

bos.write( c );

pictureIndex = show.addPicture( bos.toByteArray(), HSSFWorkbook.PICTURE_TYPE_PNG);

}

finally

{

if (fis != null)

fis.close();

if (bos != null)

bos.close();

}

return pictureIndex;

}

}


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约