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); 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");//获取图片文件 (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
DocumentSummaryInformati
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, {//将图片转化成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; } } |
|
来自: 三十的狼 > 《java操作word》