使用JAVA写入word文件

使用JAVA写入word文件,java,apache-poi,Java,Apache Poi,我读了一个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.

我读了一个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");
    }
}
导入java.io.File;
导入java.io.FileInputStream;
导入java.io.FileOutputStream;
导入org.apache.poi.xwpf.usermodel.XWPFDocument;
导入org.apache.poi.xwpf.extractor.XWPFWordExtractor;
导入org.apache.poi.xwpf.usermodel.XWPFParagraph;
导入org.apache.poi.xwpf.usermodel.XWPFRun;
导入java.util.List;
公共类读取文件
{
公共静态void main(字符串[]args)引发异常
{
XWPFDocument docx=新的XWPFDocument(新文件输入流(“d:\\Profiles\\mehjain\\Desktop\\Test1.docx”);
List paragraphList=docx.getparaphs();
XWPFDocument document=新的XWPFDocument();
FileOutputStream out=新的FileOutputStream(新文件(“d:\\Profiles\\mehjain\\Desktop\\Test2.docx”);
XWPFParagraph n=document.createParagraph();
XWPFRun=n.createRun();
对于(XWPF段落:段落列表)
{ 
run.setText(段落.getText());
run.addcarrientreturn();
}
文件。写(出);
document.close();
out.close();
System.out.println(“Test2.docx编写成功”);
}
}
我得到的答案是复制相同格式的文本,但我无法复制数字。 我执行了以下代码:

 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"); 
  }
  }
导入java.io.File;
导入java.io.FileInputStream;
导入java.io.FileOutputStream;
导入org.apache.poi.xwpf.usermodel.IBody;
导入org.apache.poi.xwpf.usermodel.XWPFDocument;
导入org.apache.poi.hwpf.model.StyleDescription;
导入org.apache.poi.xwpf.extractor.XWPFWordExtractor;
导入org.apache.poi.xwpf.usermodel.XWPFParagraph;
导入org.apache.poi.xwpf.usermodel.XWPFRun;
导入org.apache.poi.xwpf.usermodel.XWPFStyle;
导入org.apache.poi.xwpf.usermodel.XWPFStyles;
导入java.util.List;
公共类读取文件
{
公共静态void main(字符串[]args)引发异常
{
XWPFDocument docx=新的XWPFDocument(新文件输入流(“d:\\Profiles\\mehjain\\Desktop\\Test1.docx”);
List paragraphList=docx.getparaphs();
XWPFDocument document=新的XWPFDocument();
FileOutputStream out=新的FileOutputStream(新文件(“d:\\Profiles\\mehjain\\Desktop\\Test2.docx”);
XWPFParagraph n=document.createParagraph();
对于(XWPF段落:段落列表)
{
对于(XWPFRun run1:paragration.getRuns())
{
XWPFRun=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=n.createRun();
run.addcarrientreturn();
}
文件。写(出);
document.close();
out.close();
System.out.println(“Test2.docx编写成功”);
}
}
这可能会有帮助:

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");
   }
}

道具:

您可以使用从java复制文件的方法。使用以下代码段:

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

希望它能达到这个目的。

将整个段落从一个
Word
docx复制到另一个
Word
docx,要比将所有内容从一个
Word
docx复制到另一个
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");
 }
}
导入java.io.File;
导入java.io.FileInputStream;
导入java.io.FileOutputStream;
导入org.apache.poi.xwpf.usermodel.*;
导入org.openxmlformats.schemas.wordprocessingml.x2006.main.ctnumber;
导入java.util.List;
导入java.lang.reflect.Field;
公共类CopyWordParagraphsDocDoc{
公共静态void main(字符串[]args)引发异常{
XWPFDocument docx1=新的XWPFDocument(新文件输入流(“Test1.docx”);
xwpfnumberingnumberingdocx1=docx1.getNumbering();
//获取paragraphListDocx1作为docx1中所有段落的列表
列出段落ListDocx1=docx1.getParaghts();
//从docx1到docx2获取numbering.xml
//如果docx1中的某些段落已编号,则需要进行此操作
XWPFDocument docx2=新的XWPFDocument();
如果(numberingDocx1!=null){
xwpfnumberingnumberingdocx2=docx2.createNumbering();
试一试{
字段f=numberingDocx1.getClass().getDeclaredField(“ctNumbering”);
f、 setAccessible(true);
numberingDocx2.setNumbering((CTNumbering)f.get(numberingDocx1));
}捕获(NoSuchFieldException nsfex){
}捕获(IllegalacessException iaex){
}
}
//在docx2中创建段落
XWPFParagraph paragraphDocx2=docx2.createparagraphy();
XWPFRun=paragraphDocx2.createRun();
run.setText(“这是来自Test1.docx:”);
//这将把所有段落从段落列表docx1复制到docx2
对于(XWPFParagraph段落docx1:paragraphListDocx1){
paragraphDocx2=docx2.createParagraphDocx2();
docx2.设置段落(段落Docx1,docx2.GetPosof段落(段落docx2));
}
paragraphDocx2=docx2.createParagraphDocx2();
run=paragraphDocx2.createRun();
run.setText(“^——这来自Test1.docx”);
FileOutputStream out=新的FileOutputStream(新文件(“Test2.docx”);
docx2.写(出);
docx2.close();
System.out.println(“Test2.docx编写成功”);
}
}
Test2.docx将如下所示:

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