笨方法学 Java -32-综合练习3-关于 Word 文档的生成
作者:谎言诞行    发布时间:2024年03月25日

一、前言

前面的综合练习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();


十一、文件生成的效果图

image.png

image.png


希望这篇文章,对于需要创建word文档的读者,有所帮助。


图片类型翻译函数如下:

/**
 * >>&nbsp;根据传入的图片信息,判断具体的类型。如果有问题,直接抛出异常
 * @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;
}


字体大小转换对照表如下:

image.png

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


本章节完结


填写一种颜色的字符(不区分大小写),1分钟有效,点击图片刷新
谎言诞行
2024-03-27 11:00:53
增加了一个字体大小的对照表。来源:CSDN 博客