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

Apache POI字表单元格未更新颜色(XWPFTableCell)

别烨熠
2023-03-14
String rgb = "FF0000";

for(XWPFTable table : moddedFile.getTables()) {
    for (XWPFTableRow row : table.getRows()) {
        for (XWPFTableCell cell : row.getTableCells()) {
            for (XWPFParagraph paragraph : cell.getParagraphs()) {
                if (paragraph == p) {
                    System.out.println(cell.getText());
                    System.out.println(cell.getColor());
                    cell.setColor(rgb);
                    System.out.println(cell.getColor());
                }
            }
        }
    }
}

共有1个答案

巫马昆杰
2023-03-14

也许单元格的灰色背景是使用主题填充和主题填充阴影设置的。主题填充设置和显式填充设置都可以设置。但是主题填充设置是有特权的。因此,如果主题填充设置存在,那么显式填充设置将被忽略。

SetColor(String rgbStr)只设置显式填充设置,但不考虑主题填充设置。应该像这样打补丁:

public void setColor(String rgbStr) {
    CTTcPr tcpr = getTcPr();
    CTShd ctshd = tcpr.isSetShd() ? tcpr.getShd() : tcpr.addNewShd();
    ctshd.setColor("auto");
    ctshd.setVal(STShd.CLEAR);
    ctshd.setFill(rgbStr);

    if (ctshd.isSetThemeFill()) ctshd.unsetThemeFill();
    if (ctshd.isSetThemeFillShade()) ctshd.unsetThemeFillShade();
    if (ctshd.isSetThemeFillTint()) ctshd.unsetThemeFillTint();
}

无需修补,可以使用自己的setcolor方法

import java.io.FileOutputStream;
import java.io.FileInputStream;

import org.apache.poi.xwpf.usermodel.*;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.*;

public class WordChangeTableCellColor{

 static void setColor(XWPFTableCell cell, String rgbStr) {
  CTTc ctTc = cell.getCTTc();
  CTTcPr tcpr = ctTc.isSetTcPr() ? ctTc.getTcPr() : ctTc.addNewTcPr();
  CTShd ctshd = tcpr.isSetShd() ? tcpr.getShd() : tcpr.addNewShd();
  ctshd.setColor("auto");
  ctshd.setVal(STShd.CLEAR);
  ctshd.setFill(rgbStr);

  if (ctshd.isSetThemeFill()) ctshd.unsetThemeFill();
  if (ctshd.isSetThemeFillShade()) ctshd.unsetThemeFillShade();
  if (ctshd.isSetThemeFillTint()) ctshd.unsetThemeFillTint();
 }

 public static void main(String[] args) throws Exception {
  XWPFDocument moddedFile = new XWPFDocument(new FileInputStream("./WordDocument.docx"));

  //Not clear where the XWPFParagraph p comes from in question's code.
  //But if WordDocument.docx contains at least one table having at least one row having at least three cells, then this should work.
  XWPFParagraph p = null;
  try {
   p = moddedFile.getTables().get(0).getRows().get(0).getTableCells().get(2).getParagraphs().get(0);
  } catch (Exception ex) {
   ex.printStackTrace();
  }

  String rgb = "FF0000";

  for(XWPFTable table : moddedFile.getTables()) {
   for (XWPFTableRow row : table.getRows()) {
    for (XWPFTableCell cell : row.getTableCells()) {
     for (XWPFParagraph paragraph : cell.getParagraphs()) {
      if (paragraph == p) {
       System.out.println(cell.getText());
       System.out.println(cell.getColor());
       //cell.setColor(rgb);
       setColor(cell, rgb);
       System.out.println(cell.getColor());
      }
     }
    }
   }
  }

  FileOutputStream out = new FileOutputStream("./WordDocumentNew.docx");
  moddedFile.write(out);
  out.close();
  moddedFile.close();
 }
}
 类似资料:
  • 我正在使用Apache POI读取零件编号电子表格中的数据。我在我们的数据库中查找零件编号,如果我们有零件的计算机辅助设计图纸,我将零件编号单元格涂成绿色,如果没有,我将其涂成红色。处理完成后,将保存电子表格。我遇到的问题是那列中的每个细胞都是绿色的。我已经完成了代码,查找零件号的逻辑工作正常,确定单元格应该是什么颜色以及设置颜色和填充的逻辑似乎也工作正常。知道我做错了什么吗? 谢谢

  • 我正在使用这个引导表插件:http://bootstrap-table.wenzhixin.net.cn/documentation/ 这张桌子运转良好。我正在使用ajax推送一个json数组。桌子完成后,我有一个按钮。当点击此按钮时,它将调用一些函数,并需要更新一些单元格颜色。下面是一个代码示例: 使用我可以更改当前值。。。有没有办法改变背景颜色而不是值?

  • 我试图改变单元格的颜色/文本颜色/边框在谷歌表使用Node.js.我有一些数据,我想把这些数据在工作表和突出显示某些行的条件。当我使用时,放入数据部分工作。作为高亮显示的基本测试,我尝试改变单元格A1的一些属性,如下所示: 但所有发生的事情是单元格A1上的格式被重置(我手动将其设置为粗体,然后取消粗体设置)。该值未设置为。 如何设置单元格(或单元格范围)的颜色?

  • 问题内容: 我想制作一个可编辑的表,然后检查数据以确保其有效。我不确定如何仅更改一个单元格的颜色。我想要一个单元格,例如(0,0)并将前景颜色设置为红色。我已经阅读了SO和Oracle上有关自定义ColorRenderer的其他文章,但是我不知道如何使用它。 谢谢。 问题答案: 假设您要用其他颜色渲染的单元格代表一种状态(我将以“拒绝并批准”为例)。然后,我将在我的表模型中实现一个名为getSta

  • 问题内容: 我试图使自己熟悉JTables,TableModels,JTableHeaders,渲染器等。我试图制作一个简单的虚拟表(出于练习目的),看起来像这样: 我还希望B2单元格-并且只有该单元格-具有蓝色(Color.BLUE)背景-所有其他单元格都可以具有自动分配的Swing默认颜色。 我的代码在下面,并且基于我在本网站和整个互联网上发现的无数示例。但是我没有得到想要的结果。相反,我得到