OutputStream не сохранит все обновления в файле - PullRequest
0 голосов
/ 29 февраля 2012

Я работаю над документом Microsoft Word 2007.

Мои цели заполнить:

  1. Ячейка таблицы.
  2. Строка абзаца.

Итак, мой код выполняет эту работу, но проблема в том, что когда я пишу файл, используя FileOutputStream, он записывает только одну из моих целей (только последняя модификация).заголовка:

enter image description here

и вот код, который я использовал:

    try{

InputStream input = new FileInputStream("c:\\doslot.docx");
XWPFDocument document=new XWPFDocument(input);
 //*********************inserting the 2nd line**************************
  XWPFHeader head = document.getHeaderList().get(0);
    List<XWPFParagraph> para= head.getParagraphs();
    XWPFRun pararun=para.get(0).createRun();
    pararun.setText("DOSSIER DE LOT GLUSCAN® N°FG-4040400A");
 //*********************inserting the header thrid table cell*************************
   XWPFHeader headd = document.getHeaderList().get(1);
    List<XWPFTable> tables = headd.getTables();
    List<XWPFTableRow> rows = tables.get(0).getRows();
  XWPFTableCell cell =    rows.get(0).getTableCell(rows.get(0).getTableCells().get(3).getCTTc());
    XWPFParagraph p =cell.addParagraph();
    XWPFRun pararuno=p.createRun();
    pararuno.setText("some text");


    FileOutputStream out = new FileOutputStream("c:\\fin.docx");
    document.write(out);
    out.close();


     }catch(Exception ex){
         ex.printStackTrace();
     }

1 Ответ

1 голос
/ 29 февраля 2012

Проблема в том, что List<XWPFTableCell> cell = rows.get(0).getTableCells(); возвращает вновь созданный список, XWPFTableRow.getTableCells () говорит:

создает и возвращает список всех XWPFTableCell, которые принадлежат этой строке

И комментарии, конечно, лгут, а код - нет, поэтому sources говорят:

public List<XWPFTableCell> getTableCells(){
    if(tableCells == null){
        //Here it is created
        List<XWPFTableCell> cells = new ArrayList<XWPFTableCell>();
        for (CTTc tableCell : ctRow.getTcList()) {
            cells.add(new XWPFTableCell(tableCell, this, table.getPart()));
        }
        this.tableCells = cells;
    }
    return tableCells;
}

И для вашей помощи есть XWPFTableRow.getTableCell (ячейка CTTc) , где вы передаете ячейку CTTc, и метод определенно возвращает существующий объект:

public XWPFTableCell getTableCell(CTTc cell) {
    for(int i=0; i<tableCells.size(); i++){
        if(tableCells.get(i).getCTTc() == cell) return tableCells.get(i); 
    }
    return null;
}

Вы можете получить ячейку CTTc, вызвав XWPFTableCell.getCTTc () и затем измените его напрямую.

Код для прямого доступа к существующей ячейке будет выглядеть следующим образом:

XWPFTableCell cell = 
    rows.getTableCell(rows.get(0).getTableCells().get(3).getCTTc());

Я не пробовал или не компилировал этот код, поэтому я не уверен, что онправильно, но я доверяю своим знаниям и источникам ОО.Конечно, это должно сделать это.Если да - исправьте код, чтобы убедиться, что он правильный и компилируемый.

FTR, я думаю, что должен быть более удобный способ сделать это, довольно часто редактировать ячейки, и я думаю, что это должноНе будь таким сложным, я бы предложил попробовать некоторые учебники по XWPFTable и его манипуляциям.

...