Create a small circle in excel POI

折月煮酒 提交于 2020-01-06 19:35:34

问题


I know this question might seem similar but I have different problem. I know how to create a circle or a shape. This is what I want to create

A little circle in the center of the excel cell

The circle that I am able to make, looking at tutorials etc is:

This is the code I am using to create:

      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);

I think there is something to do with the dx1,dx2,dy1,dy2 but setting any value in there has no effect.

I need to make that shape smaller somehow


回答1:


If the shape shall within one cell only then the anchor must also be only one cell. The positioning is done then with Dx and Dy. But the measurement unit is special. It is EMU English Metric Units.

So the positioning of an ellipse in cell A1 will be like so:

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

Looks like:


But I suspect what you really want is a conditional formatting with traffic light symbols like so:

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); // old apache poi versions
   cellStyle.setAlignment(HorizontalAlignment.CENTER); // current apache poi version 4.1.0
   //cellStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER); // old apache poi versions
   cellStyle.setVerticalAlignment(VerticalAlignment.CENTER); // current apache poi version 4.1.0

   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);
   fileOut.close();

  } catch (IOException ioex) {
  }
 }
}

Looks like:



来源:https://stackoverflow.com/questions/38763554/create-a-small-circle-in-excel-poi

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!