问题
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