You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Apache POI 5.2.3在XWPFDocument中添加双色圆形

使用Apache POI 5.2.3创建可编辑的双色圆形

核心实现思路

要生成可编辑的双色半圆圆形,需基于Word原生DrawingML图形实现:通过创建两个半圆形状(左/右或上/下),分别设置填充颜色后组合为整体,完全避免图片插入方案的不可编辑问题。

步骤与代码

首先确保引入Apache POI 5.2.3的依赖:

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>5.2.3</version>
</dependency>

完整代码示例

import org.apache.poi.xwpf.usermodel.*;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.*;
import org.openxmlformats.schemas.drawingml.x2006.main.*;
import org.openxmlformats.schemas.drawingml.x2006.wordprocessingDrawing.*;

import java.io.FileOutputStream;
import java.io.IOException;

public class TwoColorCircle {
    public static void main(String[] args) throws IOException {
        XWPFDocument doc = new XWPFDocument();
        XWPFParagraph para = doc.createParagraph();
        XWPFRun run = para.createRun();

        // 创建DrawingML容器
        CTDrawing drawing = run.getCTR().addNewDrawing();
        CTInline inline = drawing.addNewInline();

        // 定义单位:1磅=9525EMU,设置圆形宽高相等确保正圆
        int emuPerPt = 9525;
        int circleSizePt = 50;
        inline.getExtent().setCx(circleSizePt * emuPerPt);
        inline.getExtent().setCy(circleSizePt * emuPerPt);

        // 创建图形组,容纳两个半圆
        CTGroupShape group = inline.addNewGraphic().addNewGraphicData().addNewGrpSp();
        CTGroupShapeProperties groupProps = group.addNewGrpSpPr();
        CTTransform2D groupTransform = groupProps.addNewXfrm();
        groupTransform.addNewOff().setX(0);
        groupTransform.addNewOff().setY(0);
        groupTransform.addNewExt().setCx(circleSizePt * emuPerPt);
        groupTransform.addNewExt().setCy(circleSizePt * emuPerPt);

        // 左半圆(红色填充)
        CTShape leftSemi = group.addNewSp();
        CTShapeProperties leftProps = leftSemi.addNewSpPr();
        // 用饼图形状实现半圆,起始角0°,结束角180°
        CTPresetGeometry2D leftGeom = leftProps.addNewPrstGeom();
        leftGeom.setPrst(STShapeType.PIE);
        CTAdjustValueList leftAdjusts = leftGeom.addNewAvLst();
        leftAdjusts.addNewAv().setName("start").setValue(0);
        leftAdjusts.addNewAv().setName("end").setValue(180000); // 角度单位为千分之一度

        // 设置红色填充,去掉边框
        leftProps.addNewSolidFill().addNewSrgbClr().setVal(new byte[]{(byte)255, 0, 0});
        leftProps.addNewLn().addNewNoFill();

        // 左半圆位置与尺寸
        CTTransform2D leftTransform = leftProps.addNewXfrm();
        leftTransform.addNewOff().setX(0);
        leftTransform.addNewOff().setY(0);
        leftTransform.addNewExt().setCx(circleSizePt * emuPerPt);
        leftTransform.addNewExt().setCy(circleSizePt * emuPerPt);

        // 右半圆(蓝色填充)
        CTShape rightSemi = group.addNewSp();
        CTShapeProperties rightProps = rightSemi.addNewSpPr();
        // 饼图形状,起始角180°,结束角360°
        CTPresetGeometry2D rightGeom = rightProps.addNewPrstGeom();
        rightGeom.setPrst(STShapeType.PIE);
        CTAdjustValueList rightAdjusts = rightGeom.addNewAvLst();
        rightAdjusts.addNewAv().setName("start").setValue(180000);
        rightAdjusts.addNewAv().setName("end").setValue(360000);

        // 设置蓝色填充,去掉边框
        rightProps.addNewSolidFill().addNewSrgbClr().setVal(new byte[]{0, 0, (byte)255});
        rightProps.addNewLn().addNewNoFill();

        // 右半圆位置与尺寸
        CTTransform2D rightTransform = rightProps.addNewXfrm();
        rightTransform.addNewOff().setX(0);
        rightTransform.addNewOff().setY(0);
        rightTransform.addNewExt().setCx(circleSizePt * emuPerPt);
        rightTransform.addNewExt().setCy(circleSizePt * emuPerPt);

        // 保存文档
        try (FileOutputStream out = new FileOutputStream("TwoColorCircle.docx")) {
            doc.write(out);
        }
        doc.close();
    }
}

关键细节说明

  • 圆形实现:通过STShapeType.PIE(饼图)形状,调整起始/结束角度生成半圆,两个半圆拼接为完整圆形,宽高相等确保正圆。
  • 双色填充:分别为两个半圆设置纯色填充,移除边框避免拼接处出现线条。
  • 可编辑性:所有元素均为Word原生DrawingML形状,生成后可直接在Word中修改颜色、尺寸等属性。
  • 上下分色调整:若需要上下分色的半圆,只需调整角度参数:上半圆设起始角270000、结束角90000;下半圆设起始角90000、结束角270000。

内容的提问来源于stack exchange,提问作者hido

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 19:42:36