如何在 Java 中为 word 文档(.doc 或 .docx)设置背景颜色(页面颜色)?

Posted

技术标签:

【中文标题】如何在 Java 中为 word 文档(.doc 或 .docx)设置背景颜色(页面颜色)?【英文标题】:How to set background color (Page Color) for word document (.doc or .docx) in Java? 【发布时间】:2016-03-31 01:20:28 【问题描述】:

通过像 http://poi.apache.org 这样的一些库,我们可以创建具有任何文本颜色的 word 文档,但是对于文本的 background 或突出显示,我没有找到任何解决方案。

以手动方式为单词的页面颜色!:

https://support.office.com/en-us/article/Change-the-background-or-color-of-a-document-6ce0b23e-b833-4421-b8c3-b3d637e62524

这是我通过 poi.apache 创建 word 文档的主要代码

        // Blank Document
        @SuppressWarnings("resource")
        XWPFDocument document = new XWPFDocument();
        // Write the Document in file system
        FileOutputStream out = new FileOutputStream(new File(file_address));
        // create Paragraph
        XWPFParagraph paragraph = document.createParagraph();
        paragraph.setAlignment(ParagraphAlignment.RIGHT);

        XWPFRun run = paragraph.createRun();
        run.setFontFamily(font_name);
        run.setFontSize(font_size);
        // This only set text color not background!
        run.setColor(hex_color);

        for (String s : text_array) 
            run.setText(s);
            run.addCarriageReturn();
        

        document.write(out);
        out.close();

【问题讨论】:

请找stcakoverflow回答***.com/questions/35419619/… @LearNer 谢谢!通常初学者在这个网站上反应更快! 【参考方案1】:

我们只需要添加这 3 行来为 XWPF 设置 Word 文档的背景颜色。我们必须在声明 XWPFRun 和它的文本颜色后设置这些行:

CTShd cTShd = run.getCTR().addNewRPr().addNewShd();
cTShd.setVal(STShd.CLEAR);
cTShd.setFill(hex_background_color);

【讨论】:

记录在案:可以在this answer 中找到这种基于 XWPF 方法的更详细的版本。【参考方案2】:

更新:XWPF 是创建 word 文档文件的最新方式,但设置背景只能通过 HWPF 进行,它适用于旧格式版本 (.doc)

对于 *.doc(即 POI 的 HWPF 组件):

    突出显示文本: 查看setHighlighted()

    背景颜色:

    我想你是指段落的背景(AFAIK,Word 也允许为整个页面着色,这是另一回事)

    setShading() 允许您为段落提供前景色和背景色(通过setCvFore()setCvBack()SHDAbstractType)。 IIRC,它是您想要设置的 foreground 以便为您的段落着色。 背景仅与由两种(交替)颜色组成的阴影相关。

    底层数据结构被命名为Shd80 ([MS-DOC], 2.9.248)。还有SHDOperand ([MS-DOC], 2.9.249) 反映了 Word97 之前 Word 的功能。 [MS-DOC] 是二进制 Word 文件格式规范,可在 MSDN 上免费获取。

编辑:

这里有一些代码来说明上述情况:

    try 
        HWPFDocument document = [...]; // comes from somewhere
        Range range = document.getRange();

        // Background shading of a paragraph
        Paragraphproperties pprops = new ParagraphProperties();
        ShadingDescriptor shd = new ShadingDescriptor();
        shd.setCvFore(Colorref.valueOfIco(0x07)); // yellow; ICO
        shd.setIpat(0x0001); // solid background; IPAT
        pprops.setShading(shd);
        Paragraph p1 = range.insertBefore(pprops, StyleSheet.NIL_STYLE);
        p1.insertBefore("shaded paragraph");

        // Highlighting of individual characters
        Paragraph p2 = range.insertBefore(new ParagraphProperties(), StyleSheet.NIL_STYLE);     
        CharacterRun cr = p2.insertBefore("highlighted text\r");
        cr.setHighlighted((byte) 0x06); // red; ICO

        document.write([...]); // document goes to somewhere
     catch (IOException e)    
        e.printStackTrace();
    
ICO 是一个颜色结构 IPAT 是预定义的着色样式列表

【讨论】:

不幸的是,他们只介绍JavaDoc的方法,而不是真实的例子!你能用代码回答我吗? support.office.com/en-us/article/… 所以您真的想更改文档的背景,而不是单个段落的背景? 是的!但是,如果该页面颜色不可能,那么该段落也足够好。 :) @bdshahab 对于 HWPF,您需要在类路径中同时拥有核心 POI 库和 poi-scatchpad。见here。 @bdshahab HWPFDocument.getRange() 是 HWPF 的基本功能。我可以在trunk 中看到它,所以你使用哪个版本的 POI 来工作并不重要。你确定 poi 和 poi-scratchpad jar 都在你的类路径上吗?

以上是关于如何在 Java 中为 word 文档(.doc 或 .docx)设置背景颜色(页面颜色)?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过java将多个word文档合成一个wor

Java 实现 Word 文档分栏效果

Java 实现 Word 文档分栏效果

Kotlin-为Android项目生成Doc文档

java读取word文件的内容

java中poi如何将word文档转换成pdf