• 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 = {{"区域", "总销售额(万元)", "总利润(万元)简单的表格"}, {"江苏省" , 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 段落对象设置居中。

              

    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("u5b8bu4f53");
    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 = {{"区域产品销售额","",""},{"区域", "总销售额(万元)", "总利润(万元)简单的表格"}, {"江苏省" , 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]));
                    
                   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("u5b8bu4f53");
                       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"));
        }
     
    }
  • 相关阅读:
    C#中设置窗口在最前显示而其他窗口不能使用
    C#中关闭子窗口而不释放子窗口对象的方法
    C#窗体越界时鼠标还能回到初始坐标位置
    C#程序实现软件开机自动启动的两种常用方法
    C# 只开启一个程序,如果第二次打开则自动将第一个程序显示到桌面
    图标库网址收藏
    C# Winform打包部署时添加注册表信息实现开机自启动
    C# winform程序怎么打包成安装项目(VS2010图解)
    数据库的三级范式,涉及范式的问题
    基数排序
  • 原文地址:https://www.cnblogs.com/cww0814/p/8329171.html
Copyright © 2020-2023  润新知