java通过poi操作ppt

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()方法指定坐标,则幻灯片中不会显示该文本元素。

          

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需要指定坐标位置,幻灯片的元素都需要指定坐标位置。

          

1
2
3
4
5
6
7
8
9
10
11
12
Object[][] datas = {{ "区域" , "总销售额(万元)" , "总利润(万元)简单的表格" }, { "江苏省" , 9045 2256 }, { "广东省" , 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 段落对象设置居中。

          

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);

表格设置行高、列宽

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

          

1
2
3
4
tableRow.setHeight( 30 );
table.setColumnWidth( 0 , 150 );
table.setColumnWidth( 1 , 150 );
table.setColumnWidth( 2 , 250 );

文本设置字体样式

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

          

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()方法有四个参数,第一个参数:开始行,第二个参数:合并结束行,第三个参数:开始列,第四个参数:合并结束列。

          

1
2
//合并单元格
table.mergeCells( 0 , 0 , 0 , 2 );

幻灯片插入图片

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

          Java poi导出ppt

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

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例子源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
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 , 10 , 0 , 0 ));
         textBox.addNewTextParagraph().addNewTextRun().setText( "创建幻灯片" );
         
         Object[][] datas = {{ "区域产品销售额" , "" , "" },{ "区域" , "总销售额(万元)" , "总利润(万元)简单的表格" }, { "江苏省" , 9045 2256 }, { "广东省" , 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]));
                
                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( 0 , 150 );
        table.setColumnWidth( 1 , 150 );
        table.setColumnWidth( 2 , 250 );
        
        //合并单元格
        table.mergeCells( 0 , 0 , 0 , 2 );
        
        //插入图片
        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( 10 , 200 , 339 , 197 ));
        
        //创建一个文本链接
        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" );
                
         ppt.write( new FileOutputStream( "/Users/mike/ppt8.pptx" ));
     }
 
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值