【问题标题】:Write into a word file using JAVA使用JAVA写入word文件
【发布时间】:2016-10-13 23:12:26
【问题描述】:

我阅读了一个 word 文档,并想使用 Java 写入另一个 word 文件。我希望写入读取文档中内容的样式(字体、粗体、斜体、标题等),因为它是创建的新文档。 我可以复制内容,但不能复制格式样式。

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.extractor.XWPFWordExtractor;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import java.util.List;

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

        XWPFDocument docx = new XWPFDocument(new  FileInputStream("d:\\Profiles\\mehjain\\Desktop\\Test1.docx"));
        List<XWPFParagraph> paragraphList =  docx.getParagraphs();

        XWPFDocument document= new XWPFDocument(); 
        FileOutputStream out = new FileOutputStream(new File("d:\\Profiles\\mehjain\\Desktop\\Test2.docx"));
        XWPFParagraph n = document.createParagraph();
        XWPFRun run=n.createRun();

        for (XWPFParagraph paragraph: paragraphList)
        { 
            run.setText(paragraph.getText());              
            run.addCarriageReturn();
        }
        document.write(out); 
        document.close();   
        out.close();
        System.out.println("Test2.docx written successfully");
    }
}

我得到了复制相同格式文本的答案,但我无法复制数字。 我执行了这段代码:

 import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import org.apache.poi.xwpf.usermodel.IBody;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.hwpf.model.StyleDescription;
import org.apache.poi.xwpf.extractor.XWPFWordExtractor;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import org.apache.poi.xwpf.usermodel.XWPFStyle;
import org.apache.poi.xwpf.usermodel.XWPFStyles;
import java.util.List;

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

  XWPFDocument docx = new XWPFDocument(new    FileInputStream("d:\\Profiles\\mehjain\\Desktop\\Test1.docx"));

  List<XWPFParagraph> paragraphList =  docx.getParagraphs();

   XWPFDocument document= new XWPFDocument(); 
   FileOutputStream out = new FileOutputStream(new File("d:\\Profiles\\mehjain\\Desktop\\Test2.docx"));
   XWPFParagraph n = document.createParagraph();



  for (XWPFParagraph paragraph : paragraphList)
  {

       for(XWPFRun run1 : paragraph.getRuns())
       {
         XWPFRun run=n.createRun();
         run.setText(run1.getText(0));
        run.setFontFamily( run1.getFontFamily() );
        run.setBold( run1.isBold() );
        run.setItalic( run1.isItalic() );
        run.setStrike( run1.isStrike() );
        run.setColor( run1.getColor() );
        }
       XWPFRun run=n.createRun();
       run.addCarriageReturn();
    }
   document.write(out); 
   document.close();   
   out.close();
   System.out.println("Test2.docx written successfully"); 
  }
  }

【问题讨论】:

  • 可以选择将整个段落从 Test1.docx 复制到 Test2.docx 吗?这可以使用setParagraph(XWPFParagraph paragraph, int pos)XWPFDocument 方法来实现。
  • “我无法复制数字”是什么意思?您是指编号列表(段落)吗?再说一遍:将整个段落从 Test1.docx 复制到 Test2.docx 是一种选择吗?或者是将Test1.docx中的多个段落的内容放到Test2.docx中的一个段落的要求?
  • 假设 Test1.Docx 中存在“1. Introduction”。所以,我只能在 Test2.docx 中复制“简介”
  • 如果是“1.”在“1. Introduction”中将只是运行中的文本,然后将被复制。既然你说,它不会被复制,我怀疑,它是自动段落编号。如果是这样,我们也必须从源文档中复制/word/numbering.xml。看我的回答。

标签: java apache-poi


【解决方案1】:

将整个段落从一个 Word docx 复制到另一个将比将所有内容从一个 Word docx 复制到另一个单个段落中的单个运行更简单。而且由于您声明源 docx 中有编号,因此需要整个段落,因为只有段落可以编号。

但要复制编号,还必须复制/word/numbering.xml。 因此,如果 Test1.docx 看起来像这样:

处理以下程序后:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import org.apache.poi.xwpf.usermodel.*;

import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTNumbering;

import java.util.List;
import java.lang.reflect.Field;

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

  XWPFDocument docx1 = new XWPFDocument(new  FileInputStream("Test1.docx"));
  XWPFNumbering numberingDocx1 = docx1.getNumbering();
  // get paragraphListDocx1 as a List of all paragraphs from docx1
  List<XWPFParagraph> paragraphListDocx1 =  docx1.getParagraphs();

  // get the numbering.xml from docx1 to docx2
  // this is needed if some of the paragraphs from docx1 are numbered
  XWPFDocument docx2= new XWPFDocument(); 
  if (numberingDocx1 != null) {
   XWPFNumbering numberingDocx2 = docx2.createNumbering();
   try {
    Field f = numberingDocx1.getClass().getDeclaredField("ctNumbering");
    f.setAccessible(true);
    numberingDocx2.setNumbering((CTNumbering)f.get(numberingDocx1));
   } catch (NoSuchFieldException nsfex) {
   } catch (IllegalAccessException iaex) {
   }
  }

  // create a paragraph in docx2
  XWPFParagraph paragraphDocx2 = docx2.createParagraph();
  XWPFRun run = paragraphDocx2.createRun();
  run.setText("This is from Test1.docx:");

  // this will copy all paragraphs from paragraphListDocx1 to docx2
  for (XWPFParagraph paragraphDocx1 : paragraphListDocx1) { 
   paragraphDocx2 = docx2.createParagraph();
   docx2.setParagraph(paragraphDocx1, docx2.getPosOfParagraph(paragraphDocx2));            
  }

  paragraphDocx2 = docx2.createParagraph();
  run = paragraphDocx2.createRun();
  run.setText("^-- this was from Test1.docx.");


  FileOutputStream out = new FileOutputStream(new File("Test2.docx"));
  docx2.write(out); 
  docx2.close();   

  System.out.println("Test2.docx written successfully");
 }
}

Test2.docx 将如下所示:

注意: 因为我们只复制段落,所以不会复制表格。 由于/word/media/*.* 未被复制,图片将被破坏。 由于我们不复制/word/styles.xml,因此不会复制“标题 1”等特殊样式。

【讨论】:

    【解决方案2】:

    这可能会有所帮助:

    import java.io.File;
    import java.io.FileOutputStream;
    
    import org.apache.poi.xwpf.usermodel.VerticalAlign;
    import org.apache.poi.xwpf.usermodel.XWPFDocument;
    import org.apache.poi.xwpf.usermodel.XWPFParagraph;
    import org.apache.poi.xwpf.usermodel.XWPFRun;
    
    public class FontStyle 
    {
       public static void main(String[] args)throws Exception 
       {
       //Blank Document
       XWPFDocument document= new XWPFDocument(); 
    
       //Write the Document in file system
       FileOutputStream out = new FileOutputStream(
       new File("fontstyle.docx"));
    
       //create paragraph
       XWPFParagraph paragraph = document.createParagraph();
    
       //Set Bold an Italic
       XWPFRun paragraphOneRunOne = paragraph.createRun();
       paragraphOneRunOne.setBold(true);
       paragraphOneRunOne.setItalic(true);
       paragraphOneRunOne.setText("Font Style");
       paragraphOneRunOne.addBreak();
    
       //Set text Position
       XWPFRun paragraphOneRunTwo = paragraph.createRun();
       paragraphOneRunTwo.setText("Font Style two");
       paragraphOneRunTwo.setTextPosition(100);
    
       //Set Strike through and Font Size and Subscript
       XWPFRun paragraphOneRunThree = paragraph.createRun();
       paragraphOneRunThree.setStrike(true);
       paragraphOneRunThree.setFontSize(20);
       paragraphOneRunThree.setSubscript(
       VerticalAlign.SUBSCRIPT);
       paragraphOneRunThree.setText(" Different Font Styles");
    
       document.write(out);
       out.close();
       System.out.println("fontstyle.docx written successully");
       }
    }
    

    道具:http://www.tutorialspoint.com/apache_poi_word/apache_poi_word_font_style.htm

    【讨论】:

    • 其实我是想读取一个word文档,并以与第一个文档相同的样式写入另一个word文档。假设第一个文档中的数据是:“我的名字是 XYZ”。 'XYZ' 是粗体。所以我希望将“我的名字是 XYZ”写在第二个文件中,并以粗体显示“XYZ”。
    【解决方案3】:

    您可以使用 java 中的文件复制方法。使用下面的代码sn-p:

    Files.copy(new File("source path location"), new File("destination path location"));
    

    希望,它可以达到目的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多