2016-09-29 2 views
4

Ich lese ein Word-Dokument und möchte mit Java in eine andere Word-Datei schreiben. Ich möchte, dass der Stil (Schriftart, fett, kursiv, Überschrift usw.) des Inhalts im gelesenen Dokument so geschrieben wird, wie es das neue Dokument ist. Ich kann den Inhalt, aber nicht den Format-Stil kopieren.Mit JAVA in eine Word-Datei schreiben

Ich bekam eine Antwort, um das gleiche Format des Textes zu kopieren, aber ich kann keine Zahlen kopieren. ich ausgeführt, um diesen Code:

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

Möchten Sie ganze Absätze von Test1.docx zu Test2.docx kopieren? Dies wäre mit der Methode 'setParagraph (XWPFparagraph paragraph, int pos)' von 'XWPFDocument' möglich. –

+0

Was meinst du mit "Ich kann keine Zahlen kopieren"? Meinst du nummerierte Listen (Absätze)? Und noch einmal: Würde das Kopieren von ganzen Absätzen von Test1.docx nach Test2.docx eine Option sein? Oder soll man den Inhalt mehrerer Absätze aus Test1.docx in einen Absatz in Test2.docx der Anforderung einfügen? –

+0

Lassen Sie uns sagen "1. Einführung" ist in Test1.Docx vorhanden. So kann ich nur "Einführung" in Test2.docx kopieren –

Antwort

1

Diese helfen könnten:

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

Props an: http://www.tutorialspoint.com/apache_poi_word/apache_poi_word_font_style.htm

+0

Eigentlich möchte ich ein Word-Dokument lesen und es in ein anderes Word-Dokument im selben Stil wie im ersten Dokument schreiben. Angenommen, die Daten im ersten Dokument sind: 'Mein Name ist XYZ'. und "XYZ" ist fett gedruckt. Also ich möchte 'Mein Name ist XYZ' in der zweiten Datei mit 'XYZ' in Fettschrift geschrieben werden. –

0

Sie können Dateien kopieren Methode von Java verwenden. Verwenden Sie das folgende Code-Schnipsel:

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

Ich hoffe, dass es den Zweck erfüllt.

1

Kopieren ganze Absätze aus einem Word docx zum anderen wird einfacher sein als von einem Word docx zu einem einzigen Durchlauf in einem einzigen Absatz eines anderen alle Inhalte nehmen. Und da Sie angegeben haben, dass es in der Quellendokumentation Nummern gibt, werden die ganzen Absätze benötigt, da nur Absätze nummeriert werden können.

Um jedoch die Nummern zu kopieren, muss auch die /word/numbering.xml kopiert werden. So wenn die Test1.docx dies wie folgt aussieht: enter image description here

Nach der Verarbeitung des folgenden Programms:

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

Die Test2.docx wird wie folgt aussehen:

Hinweis: Tabellen werden nicht kopiert, da nur Absätze kopiert werden. Bilder werden unterbrochen, da die /word/media/*.* nicht kopiert wird. Spezielle Stylings wie "Überschrift 1" werden nicht kopiert, da wir nicht /word/styles.xml kopieren.