我读了一个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");
}
}
答案 0 :(得分: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
答案 1 :(得分: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 :(得分:0)
您可以使用java中的Files copy方法。使用以下代码段:
Files.copy(new File("source path location"), new File("destination path location"));
希望它能达到目的。