打开Apache POI生成的PPT文件时出错

时间:2017-01-24 02:33:40

标签: apache-poi xslf

Error after hitting "repair" Error while opening ppt file

当用户点击我网站上的某个链接时,我正在使用apache POI - XSLF生成一个powerpoint演示文稿。我有一些表格,其中包含我的演示文稿文件中的数据以及使用jfreechart生成的图像(折线图)。当我在我的机器上打开PPTX时,似乎工作正常。但是,当我在另一台具有powerpoint 2013的机器上打开文件时,我收到以下错误。

“powerpoint发现内容powerpoint有问题可以尝试修复演示文稿”。

我想摆脱这个错误。我在网上看到解决方案是“解锁”powerpoint,这可以通过文件的属性部分完成。我想知道是否有一些我可以通过编程方式来为我的用户抑制这个错误。此错误消息至少令人讨厌。

我的最后一个帖子被删除了 - https://stackoverflow.com/questions/41163148/how-to-unblock-pptx-using-apache-poi

因此再次重新创建此线程。在bugzilla中也为apache POI输入了一个bug。错误ID - 60633(https://bz.apache.org/bugzilla/show_bug.cgi?id=60633)。

    XSLFTableCell cell
    XSLFTextParagraph p
    XSLFTextRun line

    XSLFTable tbl = slide.createTable();
    tbl.setAnchor(new Rectangle(X, Y, WIDTH, HEIGHT));

    XSLFTableRow headerRow = tbl.addRow();
    headerRow.setHeight(45);
    //Loop through the data collection and populate rows and columns. 
    for(int i = 0; i < numberOfCols; i++) {
    XSLFTableCell th = headerRow.addCell();
    p = th.addNewTextParagraph();
    p.setTextAlign(TextAlign.CENTER);
    line = p.addNewTextRun();.....}
    for (int item=0; item < 8; item++)
    {
    XSLFTableRow itemRow = tbl.addRow();.....}

   //finally write the file
   File pptFile = File.createTempFile("fileName", ".ppt")
   FileOutputStream out = new FileOutputStream(pptFile)
   ppt.write(out)
   out.close()

1 个答案:

答案 0 :(得分:1)

如果提供代码和错误报告,则此代码必须完整且可验证。您的代码不完整且可验证。如果我完成它,那么它可以毫无问题地工作。

import java.io.FileOutputStream;

import org.apache.poi.xslf.usermodel.*;
import org.apache.poi.sl.usermodel.TextParagraph.TextAlign;
import org.apache.poi.sl.usermodel.TableCell.BorderEdge;
import org.apache.poi.sl.usermodel.TextParagraph.TextAlign;

import java.awt.Rectangle;
import java.awt.Point;
import java.awt.Color;

public class CreatePPTX {

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

  XMLSlideShow ppt = new XMLSlideShow();

  XSLFSlide slide = ppt.createSlide();

  XSLFTableCell cell;
  XSLFTextParagraph p;
  XSLFTextRun line;

  XSLFTable tbl = slide.createTable();
  tbl.setAnchor(new Rectangle(new Point(100, 100)));

  XSLFTableRow headerRow = tbl.addRow();
  headerRow.setHeight(45);

  for(int i = 0; i < 5; i++) {
   XSLFTableCell th = headerRow.addCell();
   p = th.addNewTextParagraph();
   p.setTextAlign(TextAlign.CENTER);
   line = p.addNewTextRun();
   line.setText("Header " + i);
   th.setBorderWidth(BorderEdge.bottom, 2.0);
   th.setBorderColor(BorderEdge.bottom, Color.black);
  }

  for (int item=0; item < 8; item++) {
   XSLFTableRow itemRow = tbl.addRow();
   for (int i = 0; i < 5; i++) {
    XSLFTableCell td = itemRow.addCell();
    p = td.addNewTextParagraph();
    p.setTextAlign(TextAlign.CENTER);
    line = p.addNewTextRun();
    line.setText("Cell " + item + ":" +i);    
   }
  }

  FileOutputStream out = new FileOutputStream("fileName.pptx");
  ppt.write(out);
  out.close();
 }
}

因此,使用您提供的代码无法重现您的问题。

但有一件事可能导致你的问题。如果表格中的单元格为空,则不要创建空运行,而是让单元格完全清空。

使用上面的代码示例,如果单元格1:1应为空,则不要:

...
  for (int item=0; item < 8; item++) {
   XSLFTableRow itemRow = tbl.addRow();
   for (int i = 0; i < 5; i++) {
    XSLFTableCell td = itemRow.addCell();
    p = td.addNewTextParagraph();
    p.setTextAlign(TextAlign.CENTER);
    line = p.addNewTextRun();
    if (!(item==1 && i==1)) {
     line.setText("Cell " + item + ":" +i);
    }    
   }
  }
...

这会导致错误。

取而代之的是:

...
  for (int item=0; item < 8; item++) {
   XSLFTableRow itemRow = tbl.addRow();
   for (int i = 0; i < 5; i++) {
    XSLFTableCell td = itemRow.addCell();
    p = td.addNewTextParagraph();
    p.setTextAlign(TextAlign.CENTER);
    if (!(item==1 && i==1)) {
     line = p.addNewTextRun();
     line.setText("Cell " + item + ":" +i);
    }    
   }
  }
...