Java 如何使用POI删除表后的第一个字符

Java 如何使用POI删除表后的第一个字符,java,ms-word,apache-poi,Java,Ms Word,Apache Poi,我正在尝试格式化具有多个表的Word文档。我需要删除表格后面出现的换行符。如何用Java编程实现这一点 我目前正在使用以下代码进行尝试,但它不起作用 org.apache.xmlbeans.XmlCursor cursor = xwpfTable.getCTTbl().newCursor(); cursor.toEndToken(); cursor.toNextToken(); cursor.removeChars(2); 进一步澄清:我们正在从外部来源接收未格式化的word文件。当表只有一行

我正在尝试格式化具有多个表的Word文档。我需要删除表格后面出现的换行符。如何用Java编程实现这一点

我目前正在使用以下代码进行尝试,但它不起作用

org.apache.xmlbeans.XmlCursor cursor = xwpfTable.getCTTbl().newCursor();
cursor.toEndToken();
cursor.toNextToken();
cursor.removeChars(2);
进一步澄清:我们正在从外部来源接收未格式化的word文件。当表只有一行时,我们需要消除段落(表之间的额外行)。目前我正在使用宏并通过代码实现这一点:

For Each t In doc.Tables
        Set myrange = doc.Characters(t.Range.End + 1)            
        If myrange.Text = Chr(13) Then
            myrange.Delete
        End If
提前谢谢

我试图删除的内容:

根据您的屏幕截图,您希望删除紧跟在表格后面的空段落

这是可能的,尽管我想知道为什么会有这些段落。删除这些段落后,在
Word
中,表格不再作为单个表格进行编辑,而是仅作为一个表格中的行进行编辑。这是你想要的吗

无论如何,正如前面所说的,删除表格后面的空段落是可能的。为此,您可以遍历文档的body元素。如果有一个
XWPFTable
紧接着一个
XWPFParagraph
,并且该
XWPFParagraph
中没有任何文本运行,则从文档中删除该
XWPFParagraph

例如:

import java.io.FileInputStream;
import java.io.FileOutputStream;

import org.apache.poi.xwpf.usermodel.*;

public class WordRemoveEmptyParagraphs {

 public static void main(String[] args) throws Exception {

  XWPFDocument document = new XWPFDocument(new FileInputStream("./WordTables.docx"));

  int thisBodyElementPos = 0;
  int nextBodyElementPos = 1;
  IBodyElement thisBodyElement = null;
  IBodyElement nextBodyElement = null;
  if (document.getBodyElements().size() > 1) { // document must have at least two body elements
   do {
    thisBodyElement = document.getBodyElements().get(thisBodyElementPos);
    nextBodyElement = document.getBodyElements().get(nextBodyElementPos);
    if (thisBodyElement instanceof XWPFTable && nextBodyElement instanceof XWPFParagraph) {
     XWPFParagraph paragraph = (XWPFParagraph)nextBodyElement;
     if (paragraph.getRuns().size() == 0) { // if paragraph does not have any text runs in it
      document.removeBodyElement(nextBodyElementPos);
     }
    }
    thisBodyElementPos++;
    nextBodyElementPos = thisBodyElementPos + 1;
   } while (nextBodyElementPos < document.getBodyElements().size());
  }

  FileOutputStream out = new FileOutputStream("./WordTablesChanged.docx");
  document.write(out);
  out.close();
  document.close();
 }
}
import java.io.FileInputStream;
导入java.io.FileOutputStream;
导入org.apache.poi.xwpf.usermodel.*;
公共类WordRemoveEmptyParagraphs{
公共静态void main(字符串[]args)引发异常{
XWPFDocument document=newxwpfdocument(newfileinputstream(“./WordTables.docx”);
int thisbodyementpos=0;
int nextbodylementpos=1;
IBodyElement thisBodyElement=null;
IBodyElement nextbodylement=null;
如果(document.getBodyElements().size()>1){//文档必须至少有两个正文元素
做{
thisBodyElement=document.getBodyElements().get(thisBodyElementPos);
nextBodyElement=document.getBodyElements().get(nextBodyElementPos);
if(XWPFTable的thisBodyElement实例和XWPFParagraph的nextBodyElement实例(&N)){
XWPFParagraph段落=(XWPFParagraph)下一个模块;
如果(段落.getRuns().size()==0){//如果段落中没有任何文本运行
文档。删除主体元素(下一个odyelementpos);
}
}
thisBodyElementPos++;
nextBodyElementPos=thisBodyElementPos+1;
}while(nextbodylementpos
这个问题现在无法回答。在
Word
officeopenxml
中,换行符没有特殊含义,就像在
XML
中一样。所以不清楚你到底想删除什么。也许桌子后面有一段空的。但每个表格后面至少需要一段文字。因此,请显示一个屏幕截图,你到底想删除。感谢阿克塞尔的回应。请查找我试图删除的内容的屏幕截图,并在主要问题中添加此方法有效。这些额外的段落是由于创建这些文件的源系统中的问题而存在的。在提供的代码之后,这些表显示为单个表(这正是我想要的)。唯一的问题是当ApachePOI再次读取生成的文件时,这些行被计为单独的表。有没有办法解决这个问题?@Prasanth P J:是的,因为我们只删除了表格之间的段落,所以在
Word
中,表格并不是作为单个表格进行编辑,而是作为一个表格中的行进行编辑。但是当然,
XML
仍然包含单个表,只要不在
Word
GUI
中打开文档,编辑表并重新保存即可。使用
Word
GUI
这只能通过合并单个表的
XML
来更改。那将是非常费力的。