2016-08-04 40 views
0

Ich weiß, dass diese Frage ähnlich scheint, aber ich habe ein anderes Problem. Ich weiß, wie man einen Kreis oder eine Form erzeugt. Dies ist, was ichErstellen Sie einen kleinen Kreis in Excel POI

enter image description here

Ein kleiner Kreis in der Mitte der Excel-Zelle

Der Kreis, der ich bin in der Lage zu machen, suchen Sie in Tutorials usw. ist erstellen möchten:

enter image description here

Dies ist der Code, den ich erstellen bin mit:

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

Ich denke, es gibt etwas mit dem dx1, dx2, dy1, dy2 zu tun, aber das Setzen eines beliebigen Wertes hat keinen Effekt.

Ich brauche diese Form kleiner irgendwie

Antwort

2

zu machen, wenn die Form wird innerhalb einer Zelle nur dann der Anker auch nur eine Zelle sein muss. Die Positionierung erfolgt dann mit Dx und Dy. Aber die Maßeinheit ist speziell. Es ist EMU englische metrische Einheiten.

So ist die Positionierung einer Ellipse in Zelle A1 wird wie so sein:

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

Sieht aus wie: enter image description here


Aber ich vermute, was Sie wirklich wollen, eine bedingte Formatierung mit Ampel Symbole wie folgt:

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

L ooks wie: enter image description here

+0

Die Ampelsymbole war was ich suchte. Soweit ich das verstehe, enthält die ConditionalFormattingRule die Regeln für grüne, gelbe und rote Kreise. –

+0

Axel welche Poi Version verwendest du? Mit poi 3.14 sind die Funktionsaufrufe, die Sie aufgelistet haben, nicht verfügbar –

+0

Ich verwende poi-3.14 und ich habe es getestet. Sei bitte genau. Welche Funktionsanrufe sind für Sie nicht verfügbar? –