笨方法学 Java -32-综合练习3-关于 Word 文档的生成
一、前言
前面的综合练习2,我们已经知道一些关于 Office Word 文档的处理知识。但是,我们之前的处理逻辑,都是基于一个现有的 word 文档。那么,我们能不能自己生成一个 word 文档呢?答案是可以的。
因此,接下来,我们将介绍关于word文档的生成。
二、关于03版与07版Word文档的差异
根据本人对官网API的研究。03版的doc格式文档没有直接创建段落之类的处理方法。所以,估计03版的word没法直接生成。所以,我们这里讨论的范围也仅限于07版的docx格式文档。
三、docx格式的Word文档生成
其实按照API,创建一个docx文档对象并不难。直接new 出来即可,如下代码:
XWPFDocument docx = new XWPFDocument();
四、页眉的设置
//页眉对象
XWPFHeader header = docx.createHeader(HeaderFooterType.DEFAULT);
//创建一个段落,用于装载文字信息
XWPFParagraph pHeader = header.createParagraph();
//设置文字水平居中
pHeader.setAlignment(ParagraphAlignment.CENTER);
//设置段落的文字内容
pHeader.createRun().setText("我是页眉,这文档内容是自动生成的");五、页脚的设置
//页脚对象
XWPFFooter footer = docx.createFooter(HeaderFooterType.DEFAULT);
//创建一个段落,用于装载文字信息
XWPFParagraph pFooter = footer.createParagraph();
//设置文字水平居中
pFooter.setAlignment(ParagraphAlignment.CENTER);
//设置段落的文字内容
pFooter.createRun().setText("我是页脚,这内容是自动生成的");
六、标题的设置
//标题(一个段落对象)
XWPFParagraph titleParagraph = docx.createParagraph();
//水平居中
titleParagraph.setAlignment(ParagraphAlignment.CENTER);
//1.5倍行距
titleParagraph.setSpacingBetween(1.5);
//创建文字对象
XWPFRun titleRun = titleParagraph.createRun();
//设置字体 和 字号
titleRun.setFontFamily("SimSun");//宋体
titleRun.setFontSize(16);//三号字
//设置内容
titleRun.setText("这是一个标题");七、图片的设置
//图片
String imgPath = fileDir+File.separator+"test.JPG";
//创建一个段落对象
XWPFParagraph imageParagraph = docx.createParagraph();
imageParagraph.setAlignment(ParagraphAlignment.CENTER);
imageParagraph.setSpacingBetween(1.5);//1.5倍行距
//创建一个关于图片的run对象
XWPFRun imgRun = imageParagraph.createRun();
//文件类型(需要翻译,因为参数需要数字,而不是字符)
int imgType = getImageFormatType(imgPath);
//插入图片
imgRun.addPicture(new FileInputStream(imgPath), imgType, "文件 1-1", Units.toEMU(400), Units.toEMU(225));
//添加一个段内换行
imgRun.addBreak();
//添加文字信息
imgRun.setText("图片 1-1");八、正文的设置
//正文
XWPFParagraph contentParagraph = docx.createParagraph();
//设置两端对齐
contentParagraph.setAlignment(ParagraphAlignment.BOTH);
contentParagraph.setSpacingBetween(1.5);//1.5倍行距
contentParagraph.setIndentationFirstLine(500);//首行缩进
XWPFRun contentRun = contentParagraph.createRun();
contentRun.setFontFamily("SimSun");//宋体
contentRun.setFontSize(12);//小四号字
contentRun.setText("读朱自清的荷塘月色,品读鲁迅的从百草园到三味书屋,"
+ "看梁实秋的雅舍!一篇篇经典散文,想起来就像藏在脑海里的动画,"
+ "优雅唯美的画面,好像夜晚的微风,轻抚着凝望远方的脸颊!美文入心!"
+ "感慨万千!下面是100篇名家经典散文摘抄,敬请你的欣赏!");九、表格的设置
//表格(5行3列)
XWPFTable table = docx.createTable(5,3);
table.setWidth("100%");//表格宽度100%
List<XWPFTableRow> rows = table.getRows();
for(int i=0;i<rows.size();i++) {
Random rand = new Random();
int age = rand.nextInt(100);
rows.get(i).setHeight(500);//行高
if(i==0) {
rows.get(i).getCell(0).setWidth("50%");//宽度
rows.get(i).getCell(0).setText("姓名");
rows.get(i).getCell(0).setVerticalAlignment(XWPFVertAlign.CENTER);//垂直居中
rows.get(i).getCell(1).setWidth("20%");//宽度
rows.get(i).getCell(1).setText("性别");
rows.get(i).getCell(1).setVerticalAlignment(XWPFVertAlign.CENTER);
rows.get(i).getCell(1).getParagraphs().get(0).setAlignment(ParagraphAlignment.CENTER);//水平居中
rows.get(i).getCell(2).setWidth("30%");//宽度
rows.get(i).getCell(2).setText("年龄");
rows.get(i).getCell(2).setVerticalAlignment(XWPFVertAlign.CENTER);
rows.get(i).getCell(2).getParagraphs().get(0).setAlignment(ParagraphAlignment.CENTER);
}else {
rows.get(i).getCell(0).setText("王五"+age);
rows.get(i).getCell(0).setVerticalAlignment(XWPFVertAlign.CENTER);
rows.get(i).getCell(1).setText("男");
rows.get(i).getCell(1).setVerticalAlignment(XWPFVertAlign.CENTER);
rows.get(i).getCell(1).getParagraphs().get(0).setAlignment(ParagraphAlignment.CENTER);
rows.get(i).getCell(2).setText(age+"");
rows.get(i).getCell(2).setVerticalAlignment(XWPFVertAlign.CENTER);
rows.get(i).getCell(2).getParagraphs().get(0).setAlignment(ParagraphAlignment.CENTER);
}
}
十、保存到本地的文件
//word文档写入 docx.write(new FileOutputStream(testFilePath)); docx.close();
十一、文件生成的效果图


希望这篇文章,对于需要创建word文档的读者,有所帮助。
图片类型翻译函数如下:
/**
* >> 根据传入的图片信息,判断具体的类型。如果有问题,直接抛出异常
* @param imageFilePath 图片路径
* @return 图片类型
* @throws Exception 有问题,直接抛出异常
*/
private static int getImageFormatType(String imageFilePath) throws Exception {
int result = -1;
if(imageFilePath==null || imageFilePath.trim().length()<=0) {
System.out.println("传入的文件路径异常,imageFilePath="+imageFilePath);
}else {
String suffix = imageFilePath.substring(imageFilePath.indexOf(".")+1).toLowerCase();
switch(suffix) {
case "emf":
result = Document.PICTURE_TYPE_EMF;
break;
case "wmf":
result = Document.PICTURE_TYPE_WMF;
break;
case "pict":
result = Document.PICTURE_TYPE_PICT;
break;
case "jpeg":
case "jpg":
result = Document.PICTURE_TYPE_JPEG;
break;
case "png":
result = Document.PICTURE_TYPE_PNG;
break;
case "dib":
result = Document.PICTURE_TYPE_DIB;
break;
case "gif":
result = Document.PICTURE_TYPE_GIF;
break;
case "tiff":
result = Document.PICTURE_TYPE_TIFF;
break;
case "eps":
result = Document.PICTURE_TYPE_EPS;
break;
case "bmp":
result = Document.PICTURE_TYPE_BMP;
break;
case "wpg":
result = Document.PICTURE_TYPE_WPG;
break;
default:
result = -1;
break;
}
}
return result;
}字体大小转换对照表如下:

资料来源:Word字体大小对照换算表(字号、磅、英寸、像素)_word 字号转成pt-CSDN博客
本章节完结