首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Java apache POI在excel行中填充背景色

使用Java apache POI在excel行中填充背景色
EN

Stack Overflow用户
提问于 2015-11-26 19:02:11
回答 2查看 7.8K关注 0票数 1

我正在尝试读取excel工作表,并使用以下代码填充行的背景颜色:

代码语言:javascript
运行
复制
....
HSSFCellStyle cellStyle1 = workbook.createCellStyle();
cellStyle1.setFillForegroundColor(new HSSFColor.BLACK().getIndex());
cellStyle1.setFillBackgroundColor(new HSSFColor.RED().getIndex());
cellStyle1.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);

for(int i=0;i < rowCount;i++){
     sheet.getRow(i).setRowStyle(cellStyle1);
}
...

当我运行我的代码时,颜色只填充空白单元格。对于包含数据的所有单元格,颜色没有变化。有人能告诉我为什么会这样吗?

EN

回答 2

Stack Overflow用户

发布于 2015-11-26 19:40:51

事实证明,set setFillForegroundColor是用来设置单元格背景颜色的。注释掉setFillBackgroundColor,它应该可以工作。

代码语言:javascript
运行
复制
CellStyle cellStyle1 = workbook.createCellStyle();
cellStyle1.setFillForegroundColor(IndexedColors.RED.index);
//cellStyle1.setFillBackgroundColor(IndexedColors.RED.index);
cellStyle1.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);

编辑**

工作测试代码

代码语言:javascript
运行
复制
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Iterator;

import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;


public class TestPoi {
    public static void main(String[] args) throws Exception {
        System.out.println("Started");
        Workbook workbook = new HSSFWorkbook(new FileInputStream("input.xls"));

        CellStyle cellStyle1 = workbook.createCellStyle();
        cellStyle1.setFillForegroundColor(IndexedColors.RED.index);
        //cellStyle1.setFillBackgroundColor(IndexedColors.RED.index);
        cellStyle1.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);

        Sheet sheet = workbook.getSheet("Sheet1");

        Iterator<Row> rowIterator = sheet.rowIterator();
        while(rowIterator.hasNext()){
             Row row = rowIterator.next();
             Iterator<Cell> cellIterator = row.cellIterator();
             while(cellIterator.hasNext()) {
                 Cell cell = cellIterator.next();
                 cell.setCellStyle(cellStyle1);
                 /*HSSFCellStyle style = (HSSFCellStyle)cell.getCellStyle();
                 style.setFillBackgroundColor(IndexedColors.RED.index);*/
                 System.out.println(cell.getStringCellValue());
             }
        }
        workbook.write(new FileOutputStream("output.xls"));
        System.out.println("Ended");
    }
}
票数 1
EN

Stack Overflow用户

发布于 2015-11-26 23:03:57

简而言之:setRowStyle 并没有像你想象的那样工作。

它所做的一切(see source)就是将样式注册为行的默认样式。

代码语言:javascript
运行
复制
  row.setFormatted(true);
  row.setXFIndex(style.getIndex());

它不会迭代一行中的所有单元格,也不会更改它们的样式。因此,该样式仅适用于不存在的单元格(1)和默认情况下引用行样式的新创建的单元格。

从上面的代码中可以看出,样式只是通过它们的索引来引用的。为了在行和各种单元格上允许不同的样式,单元格必须能够引用不同的样式。然后,单元格样式在逻辑上取代行样式。因此,要将样式应用于所有单元格,不仅必须将该样式分配给该行,还必须将该样式分配给所有现有的单元格。

您在问题中说您正在阅读文档,然后尝试对行进行着色。因此,我将假设您实际上没有自己创建新的单元格,因为POI应该复制行样式,这可能是一个错误。

在您的示例中,它可能有点像这样(简化):

文档中的现有单元格引用带有index 0的样式。现在使用index 1创建一个新样式,并通过setRowStyle将其应用于行。

所有不存在的单元格(1)和新的单元格将使用带有index 1的样式。但是,现有单元格仍然指向带有index 0的样式,因为没有自动为它们分配新样式。

您可能希望setRowStyle的行为类似于Excel应用程序,在该应用程序中,您可以选择整行并在其中设置样式。但这不是它的工作方式。您必须手动迭代并将更改应用于所有单元格。

1:为了节省空间,只在逻辑上存在于Excel应用程序中,而在数据结构中尚未物理存在的单元格。这就是为什么getCell可以返回null,而不是默认返回CELL_TYPE_BLANK的原因。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33936946

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档