HSSFCell setCellStyle在所有工作表的单元格上应用样式,而不是选定的单元格

时间:2017-04-15 16:21:25

标签: java apache-poi hssf

我将名为sCurrentLine的字符串转换为Excel的行。取决于该行是以X,Y还是Z开头,我为该行着色。

        row = sheet.createRow(lines);
        String[] parts = sCurrentLine.split("\\|");

        if (sCurrentLine.contains("X")) {
            bgColorIndex = HSSFColor.RED.index;
        } else if (sCurrentLine.contains("Y")){
            bgColorIndex = HSSFColor.LIGHT_BLUE.index;
        } else if (sCurrentLine.contains("Z")) {
            bgColorIndex = HSSFColor.YELLOW.index;
        } else {
            bgColorIndex = HSSFColor.BROWN.index;
        }

所以我有一个名为bgColorIndex的变量,用它来设置行的所有单元格的颜色

        for (short i = 0; i < parts.length; i++) {
            row.createCell(i).setCellValue(parts[i]);

            HSSFCell curCell = row.getCell(i);
            HSSFCellStyle curStyle = curCell.getCellStyle();
            curStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
            curStyle.setFillForegroundColor(bgColorIndex);
            curStyle.setFillBackgroundColor(bgColorIndex);
            System.out.println("Color is: " + bgColorIndex);

            curCell.setCellStyle(curStyle);
        }
        lines++;
    }

我遇到的问题是setCellStyle正在为所有行和工作表应用样式,因此我检测到的最后一种颜色应用于整个文档。

我如何独立地为每个细胞着色?

EDITED: 整个代码:

private void generateCSVFile() {
    String filename = "excel.xls" ;
    HSSFWorkbook workbook = new HSSFWorkbook();
    HSSFSheet sheet = workbook.createSheet("FirstSheet");  

    HSSFRow rowhead = sheet.createRow((short)0);

    // header
    rowhead.createCell((short)0).setCellValue("AXIS");
    rowhead.createCell((short)1).setCellValue("INIT");
    rowhead.createCell((short)2).setCellValue("MID");
    rowhead.createCell((short)3).setCellValue("END");     

    // Set columns width
    for (short i = 0; i < 3; i++)  {
        sheet.setColumnWidth(i, (short)(20*300));
    }

    BufferedReader br = null;
    FileReader fr = null;

    try {

        fr = new FileReader("data.txt");
        br = new BufferedReader(fr);

        String sCurrentLine;

        br = new BufferedReader(new FileReader("data.txt"));
        short lines = 1;
        HSSFRow row = null;

        while ((sCurrentLine = br.readLine()) != null) {
            if (sCurrentLine.contains("AXIS")) {
                lines = 0;
                sheet = workbook.createSheet("SecondSheet");  
                // Set columns width
                for (short i = 0; i < 7; i++)  {
                    sheet.setColumnWidth(i, (short)(20*256));
                }

                row = sheet.createRow(lines);
            } 

            row = sheet.createRow(lines);
            String[] parts = sCurrentLine.split("\\|");

            short bgColorIndex = 0;
            // Check the first cell to set color for X, Y or Z
            if (sCurrentLine.contains("X")) {
                bgColorIndex = HSSFColor.RED.index;
            } else if (sCurrentLine.contains("Y")){
                bgColorIndex = HSSFColor.LIGHT_BLUE.index;
            } else if (sCurrentLine.contains("Z")) {
                bgColorIndex = HSSFColor.YELLOW.index;
            } else {
                bgColorIndex = HSSFColor.BROWN.index;
            }

            for (short i = 0; i < parts.length; i++) {

                row.createCell(i).setCellValue(parts[i]);

                HSSFCell curCell = row.getCell(i);
                HSSFCellStyle curStyle = curCell.getCellStyle();
                curStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
                curStyle.setFillForegroundColor(bgColorIndex);
                curStyle.setFillBackgroundColor(bgColorIndex);
                System.out.println("Color is: " + bgColorIndex);

                curCell.setCellStyle(curStyle);
                curStyle = null;
            }
            lines++;
        }

    } catch (IOException e) {

        e.printStackTrace();

    } finally {

        try {

            if (br != null)
                br.close();

            if (fr != null)
                fr.close();

        } catch (IOException ex) {

            ex.printStackTrace();

        }

    }
}

1 个答案:

答案 0 :(得分:2)

您必须在工作簿中创建四个不同的CellStyle:

CellStyle styleX = wb.createCellStyle();
styleX.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
styleX.setFillForegroundColor(HSSFColor.RED.index);
styleX.setFillBackgroundColor(HSSFColor.RED.index);
CellStyle styleY = wb.createCellStyle();
styleY.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
styleY.setFillForegroundColor(HSSFColor.LIGHT_BLUE.index);
styleY.setFillBackgroundColor(HSSFColor.LIGHT_BLUE.index);
CellStyle styleZ = wb.createCellStyle();
styleZ.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
styleZ.setFillForegroundColor(HSSFColor.YELLOW.index);
styleZ.setFillBackgroundColor(HSSFColor.YELLOW.index);
CellStyle styleOther = wb.createCellStyle();
styleOther .setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
styleOther .setFillForegroundColor(HSSFColor.BROWN.index);
styleOther .setFillBackgroundColor(HSSFColor.BROWN.index);

而且,对于每一行:

CellStyle style = null;
row = sheet.createRow(lines);
String[] parts = sCurrentLine.split("\\|");

if (sCurrentLine.contains("X")) {
    style = styleX;
} else if (sCurrentLine.contains("Y")){
    style = styleY;
} else if (sCurrentLine.contains("Z")) {
    style = styleZ;
} else {
    style = styleOther;
}
for (short i = 0; i < parts.length; i++) {
    row.createCell(i).setCellValue(parts[i]);
    HSSFCell curCell = row.getCell(i);
    currCell.setCellStyle(style);
}