You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@poi.apache.org by 尘 <44...@qq.com> on 2014/09/07 04:22:33 UTC

回复: How to copy a table and modify it correctly in the same docx fileusing POI?

You're right, I thought the codes just replace the content of the new table to be the old one, but actually it turns out  they refer to the same table unless I save and reopen the document. However, I can't just re-creating a new table and fill it because the table I need has a complex style, so copying a existing one seems to be the best way. Finally I made it by construct a table using the template table's "CTTbl" before using setTable() to avoid referring to the same table . Look at the piece of the codes,


	public static void copyTable() throws Exception {
		XWPFDocument doc = new XWPFDocument(new FileInputStream(
				"styledTable.docx"));
		XWPFTable table = doc.getTables().get(0);


                 // Copying a existing table
		 CTTbl ctTbl = CTTbl.Factory.newInstance(); // Create a new CTTbl for the new table
		 ctTbl.set(table.getCTTbl()); // Copy the template table's CTTbl
		 XWPFTable table2 = new XWPFTable(ctTbl, doc); // Create a new table using the CTTbl upon
		 table2.getRow(5).getCell(0).setText("123"); // Modify the new table
		 doc.createParagraph();
		 doc.createTable(); // Create a empty table in the document
		 doc.setTable(1, table2);  // Replace the empty table to table2


                  // Copying a existing table row‍
		 CTRow ctRow = CTRow.Factory.newInstance();
		 XWPFTableRow row = table.getRow(5);
		 ctRow.set(row.getCtRow());
		 XWPFTableRow row2 = new XWPFTableRow(ctRow, table);
		 row2.getCell(0).setText("123");
		 table.addRow(row2);


		FileOutputStream out = new FileOutputStream("styledTable2.docx");
		doc.write(out);
		out.close();
	}‍



By this way I could correctly copy a existing table and modify the two tables independently as well as the table row. Maybe there's a better way to solve this problem, anyway, it does works.


------------------ 原始邮件 ------------------
发件人: "Aram Mirzadeh";<aw...@mbcli.com>;
发送时间: 2014年9月7日(星期天) 上午9:05
收件人: "POI Users List"<us...@poi.apache.org>; 

主题: Re: How to copy a table and modify it correctly in the same docx fileusing POI?



Because they're passed by reference not by content.   You're better off
just re-creating the table as needed than copying an existing one.


On Sat, Sep 6, 2014 at 12:28 PM, 尘 <44...@qq.com> wrote:

> Hi, everybody,
>   I need to generate a complex docx file which mainly contains many
> tables. I try to open a template docx file and copy a empty template table
> in it, then fill the new table with texts. But it seems that there isn't a
> method such as "copyTable()" in XWPFDocument, so I have to create a empty
> table then use setTable() to set the new one as the template table. By this
> way I can get a new table same as the template table, but when I try to
> edit it, I find that the result is very strange, because either
> getTables.get(0) or getTables.get(1) will refer to the first table, not the
> second one. Here are my codes,
>
>
>         public static void copyTable() throws Exception {
>                 XWPFDocument doc = new XWPFDocument(new FileInputStream(
>                                 "styledTable.docx"));
>
>                         XWPFTable table = doc.getTables().get(0);
>                         doc.createTable();
>                         doc.createParagraph();
>                         doc.setTable(1, table);
> //                      table = doc.getTables().get(0);
>                         table = doc.getTables().get(1);
>                         table.getRows().get(0).getCell(0).setText("123");
> // The 1st table always be modified, why ?
>
>                 FileOutputStream out = new
> FileOutputStream("styledTable2.docx");
>                 doc.write(out);
>                 out.close();
>         }‍
>
>
>
>   The same problem happens when I try to copy and modify a table row by
> addRow(XWPFTableRow row). If anyone get the correct way to copy a table and
> a table row, please write me back here, thanks a lot !

Re: 回复: How to copy a table and modify it correctly in the same docx fileusing POI?

Posted by "massimo.malvestio" <ma...@gmail.com>.
Hi, usign apache-poi-3.7 I think I found a shorter way to do it

/CTTbl tbl = template.getDocument().getBody().insertNewTbl(tableIndex);

tbl.set(original.getCTTbl());

XWPFTable table2 = new XWPFTable(tbl, template);

table2.getRows().get(0).getCell(0).setText("test");/

where

*template*: XWPFDocument
*original*: original table to be duplicated
*tableIndex*: no javadoc found, I suppose is the position of the table, if i
put 0, the "position" of the original table, the duplicated one is created
but completely attached to the original





--
View this message in context: http://apache-poi.1045710.n5.nabble.com/How-to-copy-a-table-and-modify-it-correctly-in-the-same-docx-file-using-POI-tp5716551p5725580.html
Sent from the POI - User mailing list archive at Nabble.com.

---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@poi.apache.org
For additional commands, e-mail: user-help@poi.apache.org