我有一个包含单个表的.docx文件。我想删除第2行到结尾的所有文本。
但是,方法myTable.getRow(somecounter).getCell(somecounter2).setText("")
不起作用,因为它只将“”连接到现有值。
我还尝试制作一个XWPFRun并从run.setText("")
创建myTable.getRow(sc).getCell(sc2).getParagraphs().get(0).createRun()
,但它也不起作用。
也尝试了this thread的解决方案,这次没有运气:(
如何轻松地从单元格中删除文本? 我的想法是从头开始创建一个新表,并用内容填充它,但它似乎非常艰巨。
答案 0 :(得分:1)
您的要求“从第2行删除所有文本到结尾”将有点复杂,因为Word
表格单元格可以包含许多其他内容而不仅仅是文本。
考虑下表:
因此,如果要求从第2行删除所有内容,那么您可以简单地用新的单元格替换所有单元格。或者至少是那些只有空段落的那些。
import java.io.FileOutputStream;
import java.io.FileInputStream;
import java.util.List;
import org.apache.poi.xwpf.usermodel.*;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTc;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTc;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTP;
/*
needs the full ooxml-schemas-1.3.jar as mentioned in https://poi.apache.org/faq.html#faq-N10025
since the CTRowImpl is not fully shipped with poi-ooxml-schemas-3.13-*.jar
*/
public class WordCleanTableRows {
public static void main(String[] args) throws Exception {
FileInputStream fis = new FileInputStream("document.docx");
XWPFDocument doc = new XWPFDocument(fis);
List<XWPFTable> tables = doc.getTables();
XWPFTable table = tables.get(0);
XWPFTableRow[] rows = table.getRows().toArray(new XWPFTableRow[0]);
for (int r = 0; r < rows.length; r++) {
if (r > 0) {
XWPFTableRow row = rows[r];
CTTc[] cells = row.getCtRow().getTcList().toArray(new CTTc[0]);
for (int c = 0; c < cells.length; c++) {
CTTc cTTc = cells[c];
//clear only the paragraphs in the cell, keep cell styles
cTTc.setPArray(new CTP[] {CTP.Factory.newInstance()});
cells[c] = cTTc;
}
row.getCtRow().setTcArray(cells);
//System.out.println(row.getCtRow());
}
}
doc.write(new FileOutputStream("new document.docx"));
}
}
这需要https://poi.apache.org/faq.html#faq-N10025中提到的完整的ooxml-schemas-1.3.jar 由于CTROWImpl没有完全附带poi-ooxml-schemas-3.13 - * .jar。
如果没有完整的ooxml-schemas-1.3.jar,您只需删除除第一行以外的所有行并添加新行。
import java.io.FileOutputStream;
import java.io.FileInputStream;
import java.util.List;
import org.apache.poi.xwpf.usermodel.*;
public class WordCleanTableRows2 {
public static void main(String[] args) throws Exception {
FileInputStream fis = new FileInputStream("document.docx");
XWPFDocument doc = new XWPFDocument(fis);
List<XWPFTable> tables = doc.getTables();
XWPFTable table = tables.get(0);
XWPFTableRow[] rows = table.getRows().toArray(new XWPFTableRow[0]);
for (int r = 0; r < rows.length; r++) {
if (r > 0) {
XWPFTableRow row = rows[r];
table.removeRow(1); //remove second row. others shift upwards
table.createRow(); //add new row at the end
}
}
doc.write(new FileOutputStream("new document.docx"));
}
}
修改强>
以下应该在没有ooxml-schemas-1.3.jar的情况下工作,并且和我的第一个例子一样。
import java.io.FileOutputStream;
import java.io.FileInputStream;
import java.util.List;
import org.apache.poi.xwpf.usermodel.*;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTP;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STOnOff;
import java.math.BigInteger;
public class WordCleanTableRows3 {
public static void main(String[] args) throws Exception {
FileInputStream fis = new FileInputStream("document.docx");
XWPFDocument doc = new XWPFDocument(fis);
List<XWPFTable> tables = doc.getTables();
XWPFTable table = tables.get(0);
XWPFTableRow[] rows = table.getRows().toArray(new XWPFTableRow[0]);
for (int r = 0; r < rows.length; r++) {
if (r > 0) {
XWPFTableRow row = rows[r];
List<XWPFTableCell> cells = row.getTableCells();
for (XWPFTableCell cell : cells) {
//get CTTc and replace the CTPArray with one empty CTP
cell.getCTTc().setPArray(new CTP[] {CTP.Factory.newInstance()});
//set some default styles for the paragraphs in the cells:
//http://grepcode.com/file/repo1.maven.org/maven2/org.apache.poi/ooxml-schemas/1.1/org/openxmlformats/schemas/wordprocessingml/x2006/main/CTParaRPr.java
CTP cTP = cell.getCTTc().getPArray(0);
cTP.addNewPPr();
cTP.getPPr().addNewRPr();
cTP.getPPr().getRPr().addNewB().setVal(STOnOff.ON);
cTP.getPPr().getRPr().addNewColor().setVal("FF0000");
cTP.getPPr().getRPr().addNewSz().setVal(BigInteger.valueOf(40));
}
}
}
doc.write(new FileOutputStream("new document.docx"));
}
}
org.openxmlformats.schemas.wordprocessingml.x2006.main.CTP随附poi-ooxml-schemas-3.13 - * .jar。