Java POI导出ppt简单实现

Java使用poi组件导出ppt报表幻灯片,poi导出pptx表格可以合并单元格,输出老版本的ppt不支持合并单元格,
下面介绍poi导出pptx的一些常用功能, 采用的是poi-3.8-20120326.jar,poi-ooxml-3.8-20120326.jar,poi-scratchpad-3.8-20120326.jar。

创建幻灯片

poi输出pptx首先需要创建幻灯片,可以创建多个幻灯片,然后幻灯片中可以加入表格、图片、文本等元素,如下通过ppt.createSlide()创建一个幻灯片,幻灯片中加入TextBox文本,需要指定TextBox坐标位置,长和宽可以设置为0,自动适应文本大小, 
如果不通过setAnchor()方法指定坐标,则幻灯片中不会显示该文本元素。

          Java POI导出ppt简单实现_第1张图片

1

2

3

4

5

6

7

XMLSlideShow ppt = new XMLSlideShow();

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

XSLFTextBox textBox = slide.createTextBox();

textBox.setAnchor(new Rectangle2D.Double(10,10, 0, 0));

textBox.addNewTextParagraph().addNewTextRun().setText("创建幻灯片");

 

ppt.write(new FileOutputStream("/Users/mike/ppt1.pptx"));

幻灯片插入表格

幻灯片插入表格通过slide.createTable()方法创建表格,同样table需要指定坐标位置,幻灯片的元素都需要指定坐标位置。

          Java POI导出ppt简单实现_第2张图片

1

2

3

4

5

6

7

8

9

10

11

12

Object[][] datas = {{"区域", "总销售额(万元)", "总利润(万元)简单的表格"}, {"江苏省" , 90452256}, {"广东省", 3000, 690}};

XSLFTable table = slide.createTable();//创建表格

table.setAnchor(new Rectangle2D.Double(10, 50, 0, 0));

for(int i = 0; i < datas.length; i++) {

   XSLFTableRow tableRow = table.addRow(); //创建表格行

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

       XSLFTableCell tableCell = tableRow.addCell();//创建表格单元格

       XSLFTextParagraph p = tableCell.addNewTextParagraph();

       XSLFTextRun tr = p.addNewTextRun();

       tr.setText(String.valueOf(datas[i][j]));

   }

}

设置表格样式

单元格可以设置居左、居中、居右、上下居中、设置边框、设置边框颜色、设置单元格背景颜色, 设置文本居中是使用XSLFTextParagraph p 段落对象设置居中。

          Java POI导出ppt简单实现_第3张图片

1

2

3

4

5

6

7

8

9

10

11

12

tableCell.setFillColor(Color.getColor("0xdd7e6b"));

p.setTextAlign(TextAlign.CENTER);

tableCell.setVerticalAlignment(VerticalAlignment.MIDDLE);

 

tableCell.setBorderBottom(1);

tableCell.setBorderLeft(1);

tableCell.setBorderTop(1);

tableCell.setBorderRight(1);

tableCell.setBorderBottomColor(Color.BLACK);

tableCell.setBorderLeftColor(Color.BLACK);

tableCell.setBorderTopColor(Color.BLACK);

tableCell.setBorderRightColor(Color.BLACK);

表格设置行高、列宽

有时幻灯片中表格文本比较多,需要设置表格的列宽度,在创建每行时设置高度,在创建表格之后设置表格每列宽度

          Java POI导出ppt简单实现_第4张图片

1

2

3

4

tableRow.setHeight(30);

table.setColumnWidth(0, 150);

table.setColumnWidth(1, 150);

table.setColumnWidth(2, 250);

文本设置字体样式

单元格文本可设置字体大小、颜色、斜体、粗体、下划线等, 设置字体样式时通过XSLFTextRun tr 对象设置。

          Java POI导出ppt简单实现_第5张图片

1

2

3

4

5

6

tr.setFontSize(16);

tr.setBold(true);

tr.setItalic(true);

tr.setUnderline(true);

tr.setFontFamily("\u5b8b\u4f53");

tr.setFontColor(Color.RED);

合并单元格

合并单元格需要在表格创建完之后(行与列全部创建完之后),mergeCells()方法有四个参数,第一个参数:开始行,第二个参数:合并结束行,第三个参数:开始列,第四个参数:合并结束列。

          Java POI导出ppt简单实现_第6张图片

1

2

//合并单元格

table.mergeCells(0, 0, 0, 2);

幻灯片插入图片

幻灯片中插入图片首选在ppt对象中加入图片生成一个idx图片对应下标值,幻灯片对象slide创建图片传人下标值, 设置图片在幻灯片中的绝对位置,图片元素必须设置大小,否则不显示。

          Java POI导出ppt简单实现_第7张图片

1

2

3

4

5

//插入图片

byte[] bt = FileUtils.readFileToByteArray(new File("/Users/mike/pie.png"));

int idx = ppt.addPicture(bt, XSLFPictureData.PICTURE_TYPE_PNG);

XSLFPictureShape pic = slide.createPicture(idx);

pic.setAnchor(new Rectangle(10, 200, 339, 197));

创建一个链接

文本链接通过XSLFTextRun对象的createHyperlink()方法创建

          Java POI导出ppt简单实现_第8张图片

1

2

3

4

5

6

7

//创建一个文本链接

XSLFTextBox linkText = slide.createTextBox();

linkText.setAnchor(new Rectangle2D.Double(430, 310, 0, 0));

XSLFTextRun r = linkText.addNewTextParagraph().addNewTextRun();

r.setText("Apache POI");

XSLFHyperlink link = r.createHyperlink();

link.setAddress("http://poi.apache.org");

完整例子

poi导出pptx例子源码

import java.awt.Color;

import java.awt.geom.Rectangle2D;

import java.io.File;

import java.io.FileOutputStream;

 

import org.apache.commons.io.FileUtils;

import org.apache.poi.xslf.usermodel.TextAlign;

import org.apache.poi.xslf.usermodel.VerticalAlignment;

import org.apache.poi.xslf.usermodel.XMLSlideShow;

import org.apache.poi.xslf.usermodel.XSLFHyperlink;

import org.apache.poi.xslf.usermodel.XSLFPictureData;

import org.apache.poi.xslf.usermodel.XSLFPictureShape;

import org.apache.poi.xslf.usermodel.XSLFSlide;

import org.apache.poi.xslf.usermodel.XSLFTable;

import org.apache.poi.xslf.usermodel.XSLFTableCell;

import org.apache.poi.xslf.usermodel.XSLFTableRow;

import org.apache.poi.xslf.usermodel.XSLFTextBox;

import org.apache.poi.xslf.usermodel.XSLFTextParagraph;

import org.apache.poi.xslf.usermodel.XSLFTextRun;

 

public class TestExportPptx {

 

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

 

        XMLSlideShow ppt = new XMLSlideShow();

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

        XSLFTextBox textBox = slide.createTextBox();

        textBox.setAnchor(new Rectangle2D.Double(10,1000));

        textBox.addNewTextParagraph().addNewTextRun().setText("创建幻灯片");

         

        Object[][] datas = {{"区域产品销售额","",""},{"区域""总销售额(万元)""总利润(万元)简单的表格"}, {"江苏省" 9045,  2256}, {"广东省"3000690}};

        XSLFTable table = slide.createTable();//创建表格

        table.setAnchor(new Rectangle2D.Double(105000));

       for(int i = 0; i < datas.length; i++) {

           XSLFTableRow tableRow = table.addRow(); //创建表格行

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

               XSLFTableCell tableCell = tableRow.addCell();//创建表格单元格

               XSLFTextParagraph p = tableCell.addNewTextParagraph();

               XSLFTextRun tr = p.addNewTextRun();

               tr.setText(String.valueOf(datas[i][j]));

                

               tableCell.setFillColor(Color.getColor("0xdd7e6b"));

               p.setTextAlign(TextAlign.CENTER);

               tableCell.setVerticalAlignment(VerticalAlignment.MIDDLE);

                

               if(i == datas.length - 1 && j == 3-1) {

                   tr.setFontSize(16);

                   tr.setBold(true);

                   tr.setItalic(true);

                   tr.setUnderline(true);

                   tr.setFontFamily("\u5b8b\u4f53");

                   tr.setFontColor(Color.RED);

               }

                

               tableCell.setBorderBottom(1);

               tableCell.setBorderLeft(1);

               tableCell.setBorderTop(1);

               tableCell.setBorderRight(1);

               tableCell.setBorderBottomColor(Color.BLACK);

               tableCell.setBorderLeftColor(Color.BLACK);

               tableCell.setBorderTopColor(Color.BLACK);

               tableCell.setBorderRightColor(Color.BLACK);

           }

            

           tableRow.setHeight(30);

       }

        

       //设置列宽

       table.setColumnWidth(0150);

       table.setColumnWidth(1150);

       table.setColumnWidth(2250);

        

       //合并单元格

       table.mergeCells(0002);

        

       //插入图片

       byte[] bt = FileUtils.readFileToByteArray(new File("/Users/mike/pie.png"));

       int idx = ppt.addPicture(bt, XSLFPictureData.PICTURE_TYPE_PNG);

       XSLFPictureShape pic = slide.createPicture(idx);

       pic.setAnchor(new Rectangle2D.Double(10200339197));

        

       //创建一个文本链接

       XSLFTextBox linkText = slide.createTextBox();

       linkText.setAnchor(new Rectangle2D.Double(43031000));

       XSLFTextRun r = linkText.addNewTextParagraph().addNewTextRun();

       r.setText("Apache POI");

       XSLFHyperlink link = r.createHyperlink();

       link.setAddress("http://poi.apache.org");

                

        ppt.write(new FileOutputStream("/Users/mike/ppt8.pptx"));

    }

 

}

你可能感兴趣的:(Java面向对象)