2017-01-24 23 views
1

Error after hitting "repair"Error while opening ppt fileエラーはApache POIで

を生成したPPTファイルを開いている間、私は、Apache POI使用してPowerPointプレゼンテーションを作成しています - ユーザーが自分のウェブサイト上の特定のリンクをクリックしたその場で、XSLFを。私は自分のプレゼンテーションファイルのデータとjfreechartを使って生成された画像(折れ線グラフ)を持つテーブルをいくつか持っています。私のマシンでPPTXを開くと正常に動作しているようです。しかし、Powerpoint 2013を持つ別のマシンでファイルを開くと、次のエラーが発生します。

"パワーポイントでコンテンツの問題が見つかりました。パワーポイントはプレゼンテーションの修復を試みることができます"。

このエラーを取り除きたいです。私は解決策がファイルのプロパティセクションで行うことができるパワーポイントの "UNBLOCK"にあることをインターネット上で読んだ。私は、ユーザーのためにこのエラーを抑制するためにプログラムで行うことができるものがあるかどうか疑問に思っています。このエラーメッセージは、少なくとも迷惑です。

この上の私の最後のスレッドが削除された - https://stackoverflow.com/questions/41163148/how-to-unblock-pptx-using-apache-poiしたがって

再作成ここで再び、このスレッドを。バグはapi POIのためにbugzillaにも入力されます。バグ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() 
+0

をあなたの最後の質問が削除されてから変更されていますか?削除された質問への解決策は、それを盲目的に再投稿することではありません... – Gagravarr

+1

私はあなたが正しい方法でいるとは思わない。エラーは、使用しているコードが何か間違っていることを明らかにしています。修復中にステップを見れば、さらに説明することさえできます。修理プロセスを見ながら修復する必要があるものを正確に取得し、次にそれらの問題につながる可能性のあるコードを見てください。 –

+0

@Gagravarr私はこの問題を解決できませんでした。私はapache-poiでバグを開いて、このスレッドでバグ詳細を追加しました。私は "盲目的に"再転布が役に立たないと完全に理解しています。ただし、そうでないことはご安心ください。 1.私が間違ってやっていることを特定できる人が助けてくれるかもしれません。 2.解決策を知らない人は誰でもこの恩恵を受けることができます。 – JavaProgrammer

答えて

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: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); 
    }  
    } 
    } 
... 
+0

@ Axel Ritcher、ありがとう、トン!これは確かに問題の原因です - 空のテキストランです。私のコードは、空のテキストがなくても正常に動作します。私はエラーを見ていないが、もうExcelを開いている間は表示されません。再度、感謝します! – JavaProgrammer