2016-09-29 4 views
4

Я прочитал документ с текстом и хочу записать в другой файл с использованием Java. Я хочу, чтобы стиль (шрифт, полужирный, курсив, заголовок и т. Д.) Содержимого в прочитанном документе записывался, так как это новый созданный документ. Я могу скопировать содержимое, но не стиль форматирования.Запись в текстовый файл с использованием JAVA

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

Будет ли копирование целых абзацев из Test1.docx в Test2.docx? Это было бы возможно с помощью метода 'setParagraph (абзац XWPFParagraph, int pos)' 'XWPFDocument'. –

+0

Что значит «Я не могу копировать номера»? Вы имеете в виду пронумерованные списки (абзацы)? И снова: будет ли копирование целых абзацев из Test1.docx в Test2.docx? Или нужно поместить содержимое нескольких абзацев из Test1.docx в один абзац в Test2.docx требование? –

+0

Скажем, «1. Введение» присутствует в Test1.Docx. Итак, я могу скопировать только «Введение» в Test2.docx –

ответ

1

Это может помочь:

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

+0

На самом деле, я хочу прочитать документ в формате Word и записать его в другой документ в том же стиле, что и в первом документе. Предположим, данные в 1-м документе: «Меня зовут XYZ». и «XYZ» выделен жирным шрифтом. Так что я хочу, чтобы «Мое имя XYZ» было написано во втором файле с «XYZ», выделенным жирным шрифтом. –

0

Вы можете использовать файлы скопировать метод из Java. Используйте приведенный ниже фрагмент кода:

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

Надеюсь, что это служит цели.

1

Копирование целых абзацев от одного Word docx к другому будет проще, чем принимать все содержимое от одного Word docx до одного прогона в одном параграфе другого. И поскольку вы заявили, что в исходном docx есть нумерации, все абзацы нужны, поскольку только абзацы могут быть пронумерованы.

Но для копирования нумерации также необходимо скопировать /word/numbering.xml. Так что, если Test1.docx выглядит следующим образом: enter image description here

После обработки следующую программу:

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/*.* не копируется. Специальные стили типа «Заголовок 1» не будут скопированы, так как мы не копируем /word/styles.xml.

Смежные вопросы