2017-01-24 10 views
1

Error after hitting "repair"Error while opening ppt fileОшибка при открытии файла PPT, порожденную Apache POI

Я генерации презентации Powerpoint с помощью Apache POI - XSLF, на лету, когда пользователь нажимает на определенную ссылку на моем сайте. У меня есть несколько таблиц с данными в файле презентации, а также изображение (линейная диаграмма), сгенерированное с помощью jfreechart. Когда я открываю PPTX на моей машине, он работает нормально. Однако, когда я открываю файл на другом компьютере с PowerPoint 2013, я получаю следующую ошибку.

«Powerpoint обнаружил, что проблема с контентом PowerPoint может попытаться восстановить презентацию».

Я хочу избавиться от этой ошибки. Я прочитал в Интернете, что решение - «UNBLOCK» powerpoint, которое можно сделать через раздел свойств файла. Мне интересно, есть ли что-то, что я могу сделать программно, чтобы подавить эти ошибки для моих пользователей. Это сообщение об ошибке раздражает как минимум.

Моя последняя нить на этом была удалена - https://stackoverflow.com/questions/41163148/how-to-unblock-pptx-using-apache-poi

Поэтому воссоздавать эту тему здесь снова. Ошибка также указана в bugzilla для POI apache. Идентификатор ошибки - 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 должна быть пустой, то нет:

... 
    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

@ Аксель Ричер, спасибо тонну!Это действительно источник проблемы - пустые текстовые фразы. Мой код отлично работает без пустых текстовых прогонов. Я не вижу ошибки при открытии excel. Еще раз спасибо! – JavaProgrammer