如何使用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
相关产品推荐
相关产品推荐

