在excel POI中创build一个小圆圈

我知道这个问题可能看起来相似,但我有不同的问题。 我知道如何创build一个圆或形状。 这是我想要创build的

在这里输入图像说明

在Excel单元格的中心有一个小圆圈

我可以做的圈子,看教程等是:

在这里输入图像说明

这是我用来创build的代码:

CreationHelper helper = workbook.getCreationHelper(); Drawing drawing = worksheet.createDrawingPatriarch(); ClientAnchor anchor = helper.createClientAnchor(); anchor.setCol1(0); anchor.setRow1(0); anchor.setCol2(1); anchor.setRow2(1); anchor.setDx1(255); anchor.setDx2(255); anchor.setDy1(0); anchor.setDy2(0); XSSFSimpleShape shape = ((XSSFDrawing)drawing).createSimpleShape((XSSFClientAnchor)anchor); shape.setShapeType(ShapeTypes.FLOW_CHART_CONNECTOR); shape.setFillColor(255, 0, 0); 

我认为这与dx1,dx2,dy1,dy2有关,但是设置任何值都没有效果。

我需要以某种方式使这个形状变小

如果形状应该在一个单元格内,那么锚点也必须只有一个单元格。 然后用DxDy 。 但是测量单位是特殊的。 这是EMU英制公制单位。

所以在单元格A1椭圆的位置将如下所示:

 import org.apache.poi.xssf.usermodel.*; import org.apache.poi.ss.usermodel.*; import org.apache.poi.util.Units; import java.io.FileOutputStream; import java.io.IOException; class CenterShapeInCell { public static void main(String[] args) { try { Workbook workbook = new XSSFWorkbook(); Sheet sheet = workbook.createSheet("Sheet1"); Row row = sheet.createRow(0); Cell cell = row.createCell(0); row.setHeight((short)(20*20)); sheet.setColumnWidth(0, 20*256); CreationHelper helper = workbook.getCreationHelper(); Drawing drawing = sheet.createDrawingPatriarch(); ClientAnchor anchor = helper.createClientAnchor(); //set anchor to A1 only anchor.setCol1(0); anchor.setRow1(0); anchor.setCol2(0); anchor.setRow2(0); //get the cell width of A1 float cellWidthPx = sheet.getColumnWidthInPixels(0); System.out.println(cellWidthPx); //set wanted shape size int shapeWidthPx = 20; int shapeHeightPx = 20; //calculate the position of left upper edge float centerPosPx = cellWidthPx/2f - (float)shapeWidthPx/2f; System.out.println(centerPosPx); //set the position of left edge as Dx1 in unit EMU anchor.setDx1(Math.round(centerPosPx * Units.EMU_PER_PIXEL)); //set the position of right edge as Dx2 in unit EMU anchor.setDx2(Math.round((centerPosPx + shapeWidthPx) * Units.EMU_PER_PIXEL)); //set upper padding int upperPaddingPx = 4; //set upper padding as Dy1 in unit EMU anchor.setDy1(upperPaddingPx * Units.EMU_PER_PIXEL); //set upper padding + shape height as Dy2 in unit EMU anchor.setDy2((upperPaddingPx + shapeHeightPx) * Units.EMU_PER_PIXEL); XSSFSimpleShape shape = ((XSSFDrawing)drawing).createSimpleShape((XSSFClientAnchor)anchor); shape.setShapeType(ShapeTypes.ELLIPSE); shape.setFillColor(255, 0, 0); FileOutputStream fileOut = new FileOutputStream("CenterShapeInCell.xlsx"); workbook.write(fileOut); fileOut.close(); } catch (IOException ioex) { } } } 

好像: 在这里输入图像说明


但我怀疑你真正想要的是一个有如红绿灯符号的条件格式:

 import org.apache.poi.xssf.usermodel.*; import org.apache.poi.ss.usermodel.*; import org.apache.poi.ss.util.CellRangeAddress; import java.io.FileOutputStream; import java.io.IOException; class ConditionalFormattingIconSet { public static void main(String[] args) { try { Workbook workbook = new XSSFWorkbook(); Sheet sheet = workbook.createSheet("Sheet1"); CellStyle cellStyle = workbook.createCellStyle(); cellStyle.setAlignment(CellStyle.ALIGN_CENTER); cellStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER); Cell cell; for (int i = 0; i < 3; i++) { cell = sheet.createRow(i).createCell(0); cell.setCellValue(1+i); cell.setCellStyle(cellStyle); } SheetConditionalFormatting sheetCF = sheet.getSheetConditionalFormatting(); ConditionalFormattingRule rule = sheetCF.createConditionalFormattingRule(IconMultiStateFormatting.IconSet.GYR_3_TRAFFIC_LIGHTS); rule.getMultiStateFormatting().setIconOnly(true); ConditionalFormattingRule [] cfRules = {rule}; CellRangeAddress[] regions = {CellRangeAddress.valueOf("A1:A3")}; sheetCF.addConditionalFormatting(regions, cfRules); FileOutputStream fileOut = new FileOutputStream("ConditionalFormattingIconSet.xlsx"); workbook.write(fileOut); } catch (IOException ioex) { } } } 

好像: 在这里输入图像说明