Soru Apache poi kullanarak hücre rengini değiştirme


Parça numaralarının elektronik tablosundaki verileri okumak için Apache POI kullanıyorum. Ben parça rengini renklendirdiğimiz kısımda bir CAD çizimi varsa, eğer kırmızı renklendirmezsek, veri tabanımızdaki parça numarasını araştırıyorum. İşlem tamamlandıktan sonra elektronik tablo kaydedilir. Sorun şu ki bu sütundaki her hücre yeşil çıkıyor. Kodun içine girdim, parça numarasına bakmak için mantık iyi çalışıyor ve hücrenin hangi renkte olması gerektiğini belirleyen mantık ve rengi ve dolgusu ayarlamak işe yarayacak gibi görünüyor. Burada yanlış yaptığım herhangi bir fikir var mı?

Teşekkürler.

//Check the parts
for(int r=1;r<sheet.getPhysicalNumberOfRows();r++) {
    String partNumber = null;
    switch(cell.getCellType()) {
        case HSSFCell.CELL_TYPE_NUMERIC:
            long pNum = (long) cell.getNumericCellValue();
            partNumber = String.valueOf(pNum);
            break;
        case HSSFCell.CELL_TYPE_STRING:
            partNumber = cell.getStringCellValue();
            break;
        default:
            logger.info("Part Number at row " + r + " on sheet " + partList.getSheetName(s) + "is of an unsupported type");
    }

    try {
        List<String> oldMaterialNumbers = getOldMaterialNumbers(partNumber);

        boolean gotDrawing = checkPartNumber(oldMaterialNumbers, partNumber);
        //If there's a drawing then color the row green, if not red.
        short bgColorIndex = gotDrawing
                                ?HSSFColor.LIGHT_GREEN.index //42
                                :HSSFColor.RED.index; //10

        HSSFCell curCell = row.getCell(partNumberColumn);
        HSSFCellStyle curStyle = curCell.getCellStyle();

        curStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
        curStyle.setFillForegroundColor(bgColorIndex);

        curCell.setCellStyle(curStyle);

    }catch(Exception e) {
        throw e;
    }
}

21
2017-07-17 19:31


Menşei


CheckPartNumber'in çıkışı hakkında emin misiniz? - Alfabravo
CheckPartNumber'in dönüş değeri bir booledir ve bu değer doğru bir şekilde döndürülür. - Striker
Hücre stilini yerine yapmak yerine: CellStyle myStyle = partList.createCellStyle (); Doğru renkleri alıyorum ama mevcut hücre formatını kaybediyorum. - Striker


Cevaplar:


Kısa versiyon: Stilleri yalnızca bir kez oluşturun, her yerde kullanın.

Uzun versiyon: İhtiyacınız olan stilleri oluşturmak için bir yöntem kullanın (stillerin miktarının sınırına dikkat edin).

private static Map<String, CellStyle> styles;

private static Map<String, CellStyle> createStyles(Workbook wb){
        Map<String, CellStyle> styles = new HashMap<String, CellStyle>();
        DataFormat df = wb.createDataFormat();

        CellStyle style;
        Font headerFont = wb.createFont();
        headerFont.setBoldweight(Font.BOLDWEIGHT_BOLD);
        headerFont.setFontHeightInPoints((short) 12);
        style = createBorderedStyle(wb);
        style.setAlignment(CellStyle.ALIGN_CENTER);
        style.setFont(headerFont);
        styles.put("style1", style);

        style = createBorderedStyle(wb);
        style.setAlignment(CellStyle.ALIGN_CENTER);
        style.setFillForegroundColor(IndexedColors.LIGHT_CORNFLOWER_BLUE.getIndex());
        style.setFillPattern(CellStyle.SOLID_FOREGROUND);
        style.setFont(headerFont);
        style.setDataFormat(df.getFormat("d-mmm"));
        styles.put("date_style", style);
        ...
        return styles;
    }

stilleri hashmap oluştururken tekrarlayan görevleri yapmak için yöntemler de kullanabilirsiniz

private static CellStyle createBorderedStyle(Workbook wb) {
        CellStyle style = wb.createCellStyle();
        style.setBorderRight(CellStyle.BORDER_THIN);
        style.setRightBorderColor(IndexedColors.BLACK.getIndex());
        style.setBorderBottom(CellStyle.BORDER_THIN);
        style.setBottomBorderColor(IndexedColors.BLACK.getIndex());
        style.setBorderLeft(CellStyle.BORDER_THIN);
        style.setLeftBorderColor(IndexedColors.BLACK.getIndex());
        style.setBorderTop(CellStyle.BORDER_THIN);
        style.setTopBorderColor(IndexedColors.BLACK.getIndex());
        return style;
    }

daha sonra, "ana" kodunuzda stili, sahip olduğunuz stiller haritasından ayarlayın.

Cell cell = xssfCurrentRow.createCell( intCellPosition );       
cell.setCellValue( blah );
cell.setCellStyle( (CellStyle) styles.get("style1") );

20
2017-07-17 20:13





Hücre stillerini oluşturmak için: http://poi.apache.org/spreadsheet/quick-guide.html#CustomColors.

Özel renkler

HSSF:

HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet();
HSSFRow row = sheet.createRow((short) 0);
HSSFCell cell = row.createCell((short) 0);
cell.setCellValue("Default Palette");

//apply some colors from the standard palette,
// as in the previous examples.
//we'll use red text on a lime background

HSSFCellStyle style = wb.createCellStyle();
style.setFillForegroundColor(HSSFColor.LIME.index);
style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);

HSSFFont font = wb.createFont();
font.setColor(HSSFColor.RED.index);
style.setFont(font);

cell.setCellStyle(style);

//save with the default palette
FileOutputStream out = new FileOutputStream("default_palette.xls");
wb.write(out);
out.close();

//now, let's replace RED and LIME in the palette
// with a more attractive combination
// (lovingly borrowed from freebsd.org)

cell.setCellValue("Modified Palette");

//creating a custom palette for the workbook
HSSFPalette palette = wb.getCustomPalette();

//replacing the standard red with freebsd.org red
palette.setColorAtIndex(HSSFColor.RED.index,
        (byte) 153,  //RGB red (0-255)
        (byte) 0,    //RGB green
        (byte) 0     //RGB blue
);
//replacing lime with freebsd.org gold
palette.setColorAtIndex(HSSFColor.LIME.index, (byte) 255, (byte) 204, (byte) 102);

//save with the modified palette
// note that wherever we have previously used RED or LIME, the
// new colors magically appear
out = new FileOutputStream("modified_palette.xls");
wb.write(out);
out.close();

XSSF:

 XSSFWorkbook wb = new XSSFWorkbook();
    XSSFSheet sheet = wb.createSheet();
    XSSFRow row = sheet.createRow(0);
    XSSFCell cell = row.createCell( 0);
    cell.setCellValue("custom XSSF colors");

    XSSFCellStyle style1 = wb.createCellStyle();
    style1.setFillForegroundColor(new XSSFColor(new java.awt.Color(128, 0, 128)));
    style1.setFillPattern(CellStyle.SOLID_FOREGROUND);

5
2018-01-16 11:24





Bunun olduğuna inanıyorum çünkü cell.getCellStyle başlangıçta değiştirdiğiniz varsayılan hücre stilini döndürür.

Bu tarz stiller oluşturun ve bunları hücrelere uygulayın:

cellStyle = (XSSFCellStyle) cell.getSheet().getWorkbook().createCellStyle();

Önceki posterde belirtildiği gibi, stilleri denemek ve oluşturmak ve yeniden kullanmak.

XSSF kitaplığında, sağladığım kodu önleyecek ve stilleri otomatik olarak yeniden deneyen bir yardımcı program sınıfı da vardır. 0ff elini hatırlayamıyorum.


3
2017-07-17 22:07





buradan örnek alın

http://svn.apache.org/repos/asf/poi/trunk/src/examples/src/org/apache/poi/ss/examples/BusinessPlan.java

style.setFillForegroundColor(IndexedColors.LIGHT_CORNFLOWER_BLUE.getIndex());

1
2018-04-02 04:52





Apache POI 3.9 için aşağıdaki kodu kullanabilirsiniz:

HSSFCellStyle style = workbook.createCellStyle()
style.setFillForegroundColor(HSSFColor.YELLOW.index)
style.setFillPattern((short) FillPatternType.SOLID_FOREGROUND.ordinal())

3.9 sürümü için yöntemler kısa sürer ve girişlere dikkat etmelisiniz.


0
2017-07-05 11:21