当前位置: 首页 > 面试题库 >

如何在不丢失格式的情况下使用POI将一个.docx中的某些内容复制到另一个.docx中?

黎浩然
2023-03-14
问题内容

假设我有两个.DOCX文件,input.docx以及output.docx我需要选择一些内容input.docx,并将其复制到output.docx。在newdoc显示其在控制台中的内容似乎是正确的,但我没有得到的东西output.docx,除了空行。谁能提供建议?

InputStream is = new FileInputStream("D:\\input.docx"); 
XWPFDocument doc = new XWPFDocument(is);

List<XWPFParagraph> paras = doc.getParagraphs();  
List<XWPFRun> runs;
XWPFDocument newdoc = new XWPFDocument();                                     
for (XWPFParagraph para : paras) {  
            runs = para.getRuns();      
            if(!para.isEmpty())
            {
                XWPFParagraph newpara = newdoc.createParagraph(); 
                XWPFRun newrun = newpara.createRun();
                for (int i=0; i<runs.size(); i++) {                       
                    newrun=runs.get(i);
                    newpara.addRun(newrun);
                }
            }
        }


        List<XWPFParagraph> newparas = newdoc.getParagraphs(); 
        for (XWPFParagraph para1 : newparas) {  
            System.out.println(para1.getParagraphText());
        }// in the console, I have the correct information

        FileOutputStream fos = new FileOutputStream(new File("D:\\output.docx"));
        newdoc.write(fos);
        fos.flush();
        fos.close();

问题答案:

我稍加修改了您的代码,它复制文本而不更改文本格式。

public static void main(String[] args) {
    try {
        InputStream is = new FileInputStream("Japan.docx"); 
        XWPFDocument doc = new XWPFDocument(is);

        List<XWPFParagraph> paras = doc.getParagraphs();

        XWPFDocument newdoc = new XWPFDocument();                                     
        for (XWPFParagraph para : paras) {

            if (!para.getParagraphText().isEmpty()) {       
                XWPFParagraph newpara = newdoc.createParagraph();
                copyAllRunsToAnotherParagraph(para, newpara);
            }

        }

        FileOutputStream fos = new FileOutputStream(new File("newJapan.docx"));
        newdoc.write(fos);
        fos.flush();
        fos.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

// Copy all runs from one paragraph to another, keeping the style unchanged
private static void copyAllRunsToAnotherParagraph(XWPFParagraph oldPar, XWPFParagraph newPar) {
    final int DEFAULT_FONT_SIZE = 10;

    for (XWPFRun run : oldPar.getRuns()) {  
        String textInRun = run.getText(0);
        if (textInRun == null || textInRun.isEmpty()) {
            continue;
        }

        int fontSize = run.getFontSize();
        System.out.println("run text = '" + textInRun + "' , fontSize = " + fontSize);

        XWPFRun newRun = newPar.createRun();

        // Copy text
        newRun.setText(textInRun);

        // Apply the same style
        newRun.setFontSize( ( fontSize == -1) ? DEFAULT_FONT_SIZE : run.getFontSize() );    
        newRun.setFontFamily( run.getFontFamily() );
        newRun.setBold( run.isBold() );
        newRun.setItalic( run.isItalic() );
        newRun.setStrike( run.isStrike() );
        newRun.setColor( run.getColor() );
    }   
}

fontSize
仍然存在一些问题。有时POI无法确定运行的大小(我将其值写入控制台以跟踪它)并给出-1。当我自己设置字体时,它可以完美地定义字体的大小(例如,我在Word中选择一些段落并手动设置其字体,无论是大小还是字体系列)。但是当它处理另一个POI生成的文本时,有时会给出-1。因此,当POI设为-1时,我会引入
默认字体大小 (在上面的示例中为10)。

Calibri字体家族似乎出现了另一个问题。但是在我的测试中,POI默认情况下将其设置为Arial,所以我对默认fontFamily没有相同的技巧,因为它与fontSize相同。

其他字体属性(粗体,斜体等)效果很好。

可能所有这些字体问题都是由于在我的测试中,文本是从.doc文件复制而来的。如果输入的是.doc,请在Word中打开.doc文件,然后单击“另存为..”并选择.docx格式。然后在您的程序中仅使用XWPFDocument而不是HWPFDocument,我想这会没事的。



 类似资料:
  • 您好,我正在尝试将一个表从一个docx文件复制到另一个docx文件,但实际情况是,该表的值在新文档中的表下方和表外部被复制(请参见下面的图片) Talbe在新的docx里 正如您所见,表的值被复制到表的外部。我使用的是Libre Office,ApachePOI版本3.17,我的电脑运行的是Ubuntu 16.04 我用来执行复制的代码如下

  • 您好,我目前正在尝试编写一个结合docx文件的代码。这些文件可能包含文本、图像、表格或方程式。代码旨在复制这些对象并将它们附加到基本docx。我可以使用docx模块的“添加图片”和“添加段落”方法复制和合并文本、图像和表格,但我无法对word公式执行此操作。我决定尝试深入研究docx的xml,并从那里复制等式部分。我可以将公式附加到我的基本文档中,但是当我继续附加图片、文本和表格时,这些公式会显示

  • 问题内容: 我有一些数据结构,我想将其中一个用作临时结构,将另一个用作非临时结构。 现在的问题当然是实际上只是指向,因此一旦清除,也是如此。 如何在使用Java时保留值? 问题答案: 您可以使用以下技巧: 或使用 您可以在此处获取有关clone()方法的一些信息 但是您应该记住,所有这些方式都会给您 List 的副本,而不是其所有元素。因此,如果您更改复制的列表中的元素之一,则它也将在原始列表中进

  • 在我的测试中,我发现当将下面的html内容转换为docx时,原始样式将丢失。 > <代码> docx中的结果:没有下划线。

  • 问题内容: 我在做下面的运动。 创建一个包含四个元素的切片。 创建一个新切片,并将第三个和第四个元素仅复制到其中。 我已经返回了以下程序 我程序的输出是。但我希望newElements切片为[3 4]- 我的程序出了什么问题。 问题答案: 使用内置的复制功能将元素从一个切片复制到另一个切片。 在操场上跑 您可以使用append创建切片并在单个语句中复制元素,但是代码并不像使用copy那样明显。 在

  • 我想将table 1的内容复制到table 2中,但它不是直接复制,因为table 2包含的列比表1多。结构类似于这样: 表 1 { 列 2 列 4 列 6 } 表2{column1 column2 column3 column4 column5 column6} 我想做的是将table1到table2中的每一行相加,并为缺少的列设置默认值。任何帮助都将不胜感激。