OutputStream不会保存文件的所有更新

时间:2012-02-29 16:14:50

标签: java file header apache-poi fileoutputstream

我正在使用Microsoft Word 2007 Document。

我的目标是填写:

  1. 表格单元格。
  2. 段落行。
  3. 所以,我的代码完成了这项工作,但问题是当我使用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 个答案:

答案 0 :(得分:1)

问题是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 cell),您传递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;
}

您可以通过调用XWPFTableCell.getCTTc()来实现CTTc单元格,然后直接修改它。

直接访问现有单元格的代码是:

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

我没有尝试或编译此代码,因此我不确定它是否正确,但我相信我的OO知识和来源。无论如何,这应该做到这一点。如果确实如此 - 请更正代码以确保其正确且可编辑。

FTR,我认为应该有更方便的方法来做这个,编辑单元格很常见,我认为不应该这么复杂,我建议尝试一些关于XWPFTable及其操作的教程。