当前位置: 首页 > 知识库问答 >
问题:

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

程城
2023-03-14

我试图读取一个excel表格,并使用以下代码填充行的背景色:

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

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

共有2个答案

蓟辰沛
2023-03-14

简而言之:setRowStyle 并没有做你假设它做的事情。

它所做的一切(请参阅源代码)是将样式注册为行默认样式。

  row.setFormatted(true);
  row.setXFIndex(style.getIndex());

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

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

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

在您的例子中,它可能有点像这样(简化):
文档中的现有单元格引用index 0的样式。您现在使用index 1创建一个新样式,并通过setRow样式将其应用到行中。
所有不存在的(1)和新单元格将使用index 1的样式。然而,现有单元格仍然指向index 0的样式,因为它们没有自动分配新样式。

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

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

闾丘博
2023-03-14

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

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

已编辑**

工作测试代码

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");
    }
}
 类似资料:
  • 注意: Adobe Muse 不再添加新增功能,并将于 2020 年 3 月 26 日停止支持。有关详细信息和帮助,请参阅 Adobe Muse 服务结束页面。 Adobe Muse 中的浏览器填充和背景图像 当您规划网站的页面设计时,背景填充是设计的一个非常重要的部分。Adobe Muse 中的背景填充让您可以为您的网站添加背景颜色或图像。您可以使用背景图像传达产品或服务的品牌价值。同样,您还可

  • 问题内容: 今天在玩一些css3,主要是过渡。 我想实现的是,悬停在li元素上时,背景将以不同的颜色从左到右填充,理想情况下,我希望能够填充一半或全部。 我需要使用房产吗 任何人都可以给我一些有关实现这一目标的指示。 谢谢 问题答案: 您将需要在此处执行的操作是使用线性渐变作为背景并为背景位置设置动画。在代码中: 使用线性渐变(红色为50%,蓝色为50%),并告诉浏览器背景是元素宽度(宽度:200

  • 问题内容: 是否可以为SVG 元素设置a ? 例如,如果设置了element ,则CSS样式有效,但都不起作用。 问题答案: 您可以通过将背景变成图案来实现: 根据您的图像调整宽度和高度,然后从这样的路径中引用它:

  • 问题内容: 将SVG输出直接与页面代码内联放置,我能够像这样简单地用CSS修改填充颜色: 这很好用,但是我正在寻找一种方法,当它用作Background-IMAGE时,修改SVG的“填充”属性。 现在如何更改颜色?可能吗 作为参考,这是我的外部SVG文件的内容: 问题答案: 一种方法是从某种服务器端机制为svg提供服务。只需创建一个资源服务器端,即可根据GET参数输出svg,然后将其提供给某个网址

  • 您是否设法在横向模式下填充PDF文档? 谢谢你的帮助。

  • 本文向大家介绍设置一个元素的背景颜色,背景颜色会填充哪些区域?相关面试题,主要包含被问及设置一个元素的背景颜色,背景颜色会填充哪些区域?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: background-color设置的背景颜色会填充元素的content、padding、border区域,