有人可以分享如何从文本框中删除段落吗
Could someone share how to delete a paragraph form a textbox
我目前正在从事一个项目,用 Apache POI 项目操作 Docx 文件。我已使用 api 从文本框内的 运行 中删除文本,但不知道如何删除文本框内的段落。我假设我需要使用 class CTP 来获取要删除的段落对象。任何例子或建议将不胜感激。
在 中,我展示了如何替换 Word
文本框内容中的文本。该方法是使用 XmlCursor
从 XPath
.//*/w:txbxContent/w:p/w:r
中获取 XML
文本 运行 元素的列表,该 XmlCursor
从 /word/document.xml
中选择该路径。
当然可以使用路径 .//*/w:txbxContent/w:p
来完成同样的操作,它获取文本框内容中的文本段落。有了那些低级别的段落 XML
,我们可以将它们转换为 XWPFParagraph
以从中获取纯文本。然后,如果纯文本包含一些标准,我们可以简单地删除段落的 XML
.
来源:
代码:
import java.io.FileOutputStream;
import java.io.FileInputStream;
import org.apache.poi.xwpf.usermodel.*;
import org.apache.xmlbeans.XmlObject;
import org.apache.xmlbeans.XmlCursor;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTP;
import java.util.List;
import java.util.ArrayList;
public class WordRemoveParagraphInTextBox {
public static void main(String[] args) throws Exception {
XWPFDocument document = new XWPFDocument(new FileInputStream("WordRemoveParagraphInTextBox.docx"));
for (XWPFParagraph paragraph : document.getParagraphs()) {
XmlCursor cursor = paragraph.getCTP().newCursor();
cursor.selectPath("declare namespace w='http://schemas.openxmlformats.org/wordprocessingml/2006/main' .//*/w:txbxContent/w:p");
List<XmlObject> ctpsintxtbx = new ArrayList<XmlObject>();
while(cursor.hasNextSelection()) {
cursor.toNextSelection();
XmlObject obj = cursor.getObject();
ctpsintxtbx.add(obj);
}
for (XmlObject obj : ctpsintxtbx) {
CTP ctp = CTP.Factory.parse(obj.xmlText());
//CTP ctp = CTP.Factory.parse(obj.newInputStream());
XWPFParagraph bufferparagraph = new XWPFParagraph(ctp, document);
String text = bufferparagraph.getText();
if (text != null && text.contains("remove")) {
obj.newCursor().removeXml();
}
}
}
FileOutputStream out = new FileOutputStream("WordRemoveParagraphInTextBoxNew.docx");
document.write(out);
out.close();
document.close();
}
}
结果:
我目前正在从事一个项目,用 Apache POI 项目操作 Docx 文件。我已使用 api 从文本框内的 运行 中删除文本,但不知道如何删除文本框内的段落。我假设我需要使用 class CTP 来获取要删除的段落对象。任何例子或建议将不胜感激。
在 Word
文本框内容中的文本。该方法是使用 XmlCursor
从 XPath
.//*/w:txbxContent/w:p/w:r
中获取 XML
文本 运行 元素的列表,该 XmlCursor
从 /word/document.xml
中选择该路径。
当然可以使用路径 .//*/w:txbxContent/w:p
来完成同样的操作,它获取文本框内容中的文本段落。有了那些低级别的段落 XML
,我们可以将它们转换为 XWPFParagraph
以从中获取纯文本。然后,如果纯文本包含一些标准,我们可以简单地删除段落的 XML
.
来源:
代码:
import java.io.FileOutputStream;
import java.io.FileInputStream;
import org.apache.poi.xwpf.usermodel.*;
import org.apache.xmlbeans.XmlObject;
import org.apache.xmlbeans.XmlCursor;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTP;
import java.util.List;
import java.util.ArrayList;
public class WordRemoveParagraphInTextBox {
public static void main(String[] args) throws Exception {
XWPFDocument document = new XWPFDocument(new FileInputStream("WordRemoveParagraphInTextBox.docx"));
for (XWPFParagraph paragraph : document.getParagraphs()) {
XmlCursor cursor = paragraph.getCTP().newCursor();
cursor.selectPath("declare namespace w='http://schemas.openxmlformats.org/wordprocessingml/2006/main' .//*/w:txbxContent/w:p");
List<XmlObject> ctpsintxtbx = new ArrayList<XmlObject>();
while(cursor.hasNextSelection()) {
cursor.toNextSelection();
XmlObject obj = cursor.getObject();
ctpsintxtbx.add(obj);
}
for (XmlObject obj : ctpsintxtbx) {
CTP ctp = CTP.Factory.parse(obj.xmlText());
//CTP ctp = CTP.Factory.parse(obj.newInputStream());
XWPFParagraph bufferparagraph = new XWPFParagraph(ctp, document);
String text = bufferparagraph.getText();
if (text != null && text.contains("remove")) {
obj.newCursor().removeXml();
}
}
}
FileOutputStream out = new FileOutputStream("WordRemoveParagraphInTextBoxNew.docx");
document.write(out);
out.close();
document.close();
}
}
结果: