zoukankan      html  css  js  c++  java
  • 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"));
        }
     
    }
  • 相关阅读:
    React生命周期, 兄弟组件之间通信
    React组件式编程Demo-用户的增删改查
    React之this.refs, 实现数据双向绑定
    CCF CSP 201812-4 数据中心
    CCF CSP 201812-4 数据中心
    PAT 顶级 1020 Delete At Most Two Characters (35 分)
    PAT 顶级 1020 Delete At Most Two Characters (35 分)
    Codeforces 1245C Constanze's Machine
    Codeforces 1245C Constanze's Machine
    CCF CSP 201712-4 行车路线
  • 原文地址:https://www.cnblogs.com/cww0814/p/8329171.html
Copyright © 2011-2022 走看看