在excel POI中创建一个小圆圈

时间:2016-08-04 09:29:54

标签: excel apache-poi

我知道这个问题可能看似相似,但我有不同的问题。我知道如何创建一个圆形或一个形状。这就是我想要创造的东西

enter image description here

excel单元格中心的一个小圆圈

我能够制作的圈子,看教程等是:

enter image description here

这是我用来创建的代码:

      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有关,但设置任何值都没有效果。

我需要以某种方式缩小形状

1 个答案:

答案 0 :(得分:2)

如果形状只在一个单元格内,则锚点也必须只有一个单元格。然后使用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) {
  }
 }
}

看起来像:enter image description here

但我怀疑你真正想要的是带有交通灯符号的条件格式,如下所示:

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) {
  }
 }
}

看起来像:enter image description here