如何使用Apache POI设置单元格背景?

时间:2019-07-17 06:47:00

标签: java groovy apache-poi

我尝试根据值设置单元格的背景色。请在下面找到相应的代码。

File inputFile = new File(path)
FileInputStream fis = new FileInputStream(inputFile)
XSSFWorkbook inputWorkbook = new XSSFWorkbook(fis) 

XSSFWorkbook outputWorkbook = new XSSFWorkbook()

XSSFSheet inputSheet = inputWorkbook.getSheetAt(1)
def inputSheetName = inputWorkbook.getSheetName(1)
XSSFSheet outputSheet = outputWorkbook.createSheet(inputSheetName)

// some code

CellStyle style = outputSheet.getRow(rowIndex).getCell(columnIndex).getCellStyle()
short color = (status.get(listIndex) == 'Passed') ? IndexedColors.GREEN.getIndex() : IndexedColors.RED.getIndex()
style.setFillBackgroundColor(color)
outputSheet.getRow(rowIndex).getCell(columnIndex).setCellStyle(style)

// some code

此代码不会出错,但是未设置单元格背景...

有人可以帮助我吗?感谢您的帮助!

更新1

CellStyle style = outputSheet.getRow(rowIndex).getCell(columnIndex).getCellStyle()
short color = (status.get(listIndex) == 'Passed') ? IndexedColors.GREEN.getIndex() : IndexedColors.RED.getIndex()
style.setFillPattern(FillPatternType.SOLID_FOREGROUND)
style.setFillForegroundColor(color)
outputSheet.getRow(rowIndex).getCell(columnIndex).setCellStyle(style)

更新2

以下代码的目标是将excel文件的内容复制并粘贴到另一个文件中。我想根据状态值设置单元格的颜色。

def function(dateTimeOfTestSuite, status, executionDateTime) {
    File inputFile = new File(path)
    FileInputStream fis = new FileInputStream(inputFile)
    XSSFWorkbook inputWorkbook = new XSSFWorkbook(fis)
    def inputSheetCount = inputWorkbook.getNumberOfSheets()

    def directoryName = 'Data Files\\Reports\\' + name
    File directory = new File(directoryName)
    if (!directory.exists())
        directory.mkdirs()

    def excelOutputFileName = directory.path + '\\' + dateTimeOfTestSuite + '.xlsx'
    excelOutputFileName = excelOutputFileName.replace(':', '-')
    File outputFile = new File(excelOutputFileName)
    FileOutputStream fos = new FileOutputStream(outputFile)

    XSSFWorkbook outputWorkbook = new XSSFWorkbook()

    for(int i = 0; i < inputSheetCount; i++) {
        XSSFSheet inputSheet = inputWorkbook.getSheetAt(i)
        def inputSheetName = inputWorkbook.getSheetName(i)
        XSSFSheet outputSheet = outputWorkbook.createSheet(inputSheetName)

        def numberOfRows = inputSheet.getPhysicalNumberOfRows()
        def numberOfColumns = inputSheet.getRow(0).getPhysicalNumberOfCells()

        def listIndex = 0
        def rowIndex = 0
        outputSheet.createRow(0)
        while (rowIndex < numberOfRows && inputSheet.getRow(rowIndex).getCell(0).getCellType() != Cell.CELL_TYPE_BLANK) {
            def columnIndex = 0
            while (columnIndex < numberOfColumns && inputSheet.getRow(0).getCell(columnIndex).getCellType() != Cell.CELL_TYPE_BLANK) {
                def value = (inputSheet.getRow(rowIndex).getCell(columnIndex).toString() == 'null') ? '' : inputSheet.getRow(rowIndex).getCell(columnIndex).toString()
                if (columnIndex == 0)
                    outputSheet.createRow(rowIndex).createCell(columnIndex).setCellValue(value)
                else
                    outputSheet.getRow(rowIndex).createCell(columnIndex).setCellValue(value)

                outputSheet.autoSizeColumn(columnIndex)
                columnIndex++
            }

            if(inputSheetName == "input") {
                if(rowIndex == 0) {
                    outputSheet.getRow(0).createCell(columnIndex).setCellValue('Status')
                    outputSheet.getRow(0).createCell(columnIndex + 1).setCellValue('ExecutedAt')
                }
                else if (rowIndex > 1) {
                    outputSheet.getRow(rowIndex).createCell(columnIndex).setCellValue(status.get(listIndex))

                    if(status.get(listIndex) != 'No run') {
                        outputSheet.getRow(rowIndex).createCell(columnIndex + 1).setCellValue(executionDateTime.get(listIndex))

                        CellStyle style = outputSheet.getRow(rowIndex).getCell(columnIndex).getCellStyle()
                        def color = (status.get(listIndex) == 'Passed') ? IndexedColors.GREEN.getIndex() : IndexedColors.RED.getIndex()
                        style.setFillPattern(FillPatternType.SOLID_FOREGROUND)
                        style.setFillForegroundColor(color)
                        outputSheet.getRow(rowIndex).getCell(columnIndex).setCellStyle(style)
                    }

                    listIndex++
                }

                outputSheet.autoSizeColumn(columnIndex)
                outputSheet.autoSizeColumn(columnIndex + 1)
            }

            rowIndex++
        }
    }

    outputWorkbook.write(fos)
    fos.close()
}

解决方案

XSSFCellStyle style = outputWorkbook.createCellStyle()
def color = (status.get(listIndex) == 'Passed') ? IndexedColors.GREEN.getIndex() : IndexedColors.RED.getIndex()
style.setFillPattern(FillPatternType.SOLID_FOREGROUND)
style.setFillForegroundColor(color)
outputSheet.getRow(rowIndex).getCell(columnIndex).setCellStyle(style)

1 个答案:

答案 0 :(得分:2)

实际上与背景无关。它是前景色。另外,您需要像这样指定FillPattern

style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
style.setFillForegroundColor(color);

作为原因,为什么是setFillForegroundColor而不是setFillBackgroundColor,我找不到任何信息,确切的区别是什么,但是以下代码显示了它们的工作原理:

style.setFillPattern(FillPatternType.LEAST_DOTS);
style.setFillForegroundColor(IndexedColors.BRIGHT_GREEN.getIndex());
style.setFillBackgroundColor(IndexedColors.RED.getIndex());

结果如下:

enter image description here

据此,我猜想setFillBackgroundColor只能与setFillForegroundColor结合使用才能创建这样的模式。