- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在列中创建渐变图案,每个单元格都有其 rgb 值。我面临的问题是 RGB 颜色在该列的其他单元格中被覆盖。因此,最后生成的 RGB 颜色将被赋予该列中的所有单元格。我尝试在每次迭代的循环中创建新对象,但覆盖仍然存在。
public static void giveGradientToColumn(HSSFWorkbook workbook, HSSFSheet sheet, String yemi, Double minimum, Double maximum) throws IOException {
int columnIndex = 5;
int maxRows = sheet.getPhysicalNumberOfRows();
Random rand = new Random();
int i = maxRows+1;
for(int rowIndex = maxRows-1 ; rowIndex > 0 ; rowIndex--){
Row row = CellUtil.getRow(rowIndex, sheet);
Cell cell = CellUtil.getCell(row, columnIndex);
String cellContent = cell.toString();
String percentvalue = cellContent.split("%")[0];
if(!(percentvalue.equals("NaN")))
{
FileOutputStream fileOut = new FileOutputStream(yemi);
double value;
HSSFWorkbook workbook1 = workbook;
try{
value = Double.parseDouble(percentvalue);
}
catch(Exception e){
continue;
}
double ratio;
if(maximum!=minimum)
ratio = 2 * (value-minimum) / (maximum - minimum);
else
ratio = 1;
int b = (max(0, 255*(1 - ratio)));
int r = (max(0, 255*(ratio - 1)));
int g = 255 - b - r;
r = rand.nextInt(255);
g = rand.nextInt(255);
b = rand.nextInt(255);
System.out.println(r+" "+g+" "+b);
HSSFCellStyle style = workbook1.createCellStyle();
HSSFPalette palette = workbook1.getCustomPalette();
HSSFColor myColor = setColor(workbook1, (byte) r, (byte) g, (byte) b);
short palIndex = myColor.getIndex();
style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
style.setFillForegroundColor(palIndex);
cell.setCellStyle(style);
workbook1.write(fileOut);
fileOut.close();
}
}
}
@SuppressWarnings("deprecation")
public static HSSFColor setColor(HSSFWorkbook workbook, byte r,byte g, byte b){
HSSFPalette palette = workbook.getCustomPalette();
HSSFColor hssfColor = null;
try {
hssfColor= palette.findColor(r, g, b);
if (hssfColor == null)
{
palette.setColorAtIndex(HSSFColor.GOLD.index, r, g, b);
hssfColor = palette.getColor(HSSFColor.GOLD.index);
}
} catch (Exception e) {
System.out.println(e);
}
return hssfColor;
}
我正在打印 rgb 值以进行调试,并且最后打印的颜色值将被赋予该列中的所有单元格。 (RGB目前是随机计算的。)
输出:- Output Image
我哪里出错了?
最佳答案
您的代码存在多个问题,导致多个不同的问题。所以答案会有点长。
首先了解 Excel 工作簿的结构:
工作簿由至少一个但也可能是多个工作表组成,每个工作表具有多行,每行具有多个单元格。每个单元格都可以有样式。但样式设置不存储在单元格中,而是存储在工作簿级别的样式表(样式表)中。因此,样式可以跨单元格、行甚至工作表存储。如果多个单元格具有相同的外观,则它们可以共享相同的存储样式。颜色也是如此。颜色也存储在工作簿级别。不幸的是,在 *.xls
BIFF
格式中,颜色仅限于调色板中的索引颜色。在 BIFF8 中,用户定义的 PALETTE 记录中有 49 个(索引 16 到 64),另外还有一些。这 49 个可以被覆盖,但数量不能增加。
现在看你的代码:
每次更改工作表行中的一个单元格时,您都会写出整个工作簿。你不应该这样做。相反,如果您完成了工作簿,则应该将其写出来。
您正在为每个需要添加样式的单元格创建一个新的单元格样式。你不应该这样做。 Excel *.xls
仅限于大约 4,000 种不同的单元格格式组合。因此,您需要检查工作簿中是否已存在您不需要的样式。这可能非常乏味,但有 CellUtil ,您已经找到并已在代码中使用它。这提供了 setCellStyleProperties
,它“尝试查找与单元格当前样式以及属性中的样式属性相匹配的现有 CellStyle。如果工作簿不包含匹配的样式,则会创建一个新样式。”。
您首先要搜索所需的颜色是否已存在。那挺好的。但如果没有,您将始终覆盖 GOLD
相同的颜色索引。由于颜色也存储在工作簿级别,因此只有最后覆盖的颜色值才会存储为GOLD
。如果工作簿中需要存储不同的颜色,则需要覆盖不同颜色索引。
示例:
源 Excel:
代码:
import java.io.FileInputStream;
import java.io.FileOutputStream;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.util.CellUtil;
import java.util.Map;
import java.util.HashMap;
public class ExcelSetHSSFCellStyleColors {
static void giveGradientToColumn(HSSFSheet sheet, int columnIndex, double minimum, double maximum) throws Exception {
DataFormatter formatter = new DataFormatter(java.util.Locale.US);
short colorIndex = 16; //color indexes 0 to 15 should not be overwritten
HSSFPalette palette = sheet.getWorkbook().getCustomPalette();
for (Row row : sheet) {
Cell cell = CellUtil.getCell(row, columnIndex);
String cellContent = formatter.formatCellValue(cell);
System.out.println(cellContent);
String percentValue = cellContent.split("%")[0];
double value = Double.NaN;
try {
value = Double.valueOf(percentValue);
} catch(Exception e){
//percentValue was not numeric
}
if (!Double.isNaN(value) && value >= minimum && value <= maximum){
double ratio = (value - minimum) / (maximum - minimum);
byte r = (byte)Math.round(Math.max(0, 255 * (1 - ratio)));
byte b = 0;
byte g = (byte)Math.round(Math.max(0, 255 - (int)b - (int)r));
System.out.println(ratio + " " + String.format("%02X", r) + ":" + String.format("%02X", g) + ":" + String.format("%02X", b));
HSSFColor hssfColor = palette.findColor(r, g, b);
if (hssfColor == null /*&& colorIndex < 64*/) {
palette.setColorAtIndex(colorIndex, r, g, b);
hssfColor = palette.getColor(colorIndex);
colorIndex++;
}
System.out.println("got color: " + ((hssfColor!=null)?hssfColor.getIndex() + ": " + hssfColor.getHexString():hssfColor)); //if not a index available, hssfColor may be null
if (hssfColor != null) {
Map<String, Object> styleproperties = styleproperties = new HashMap<String, Object>();
styleproperties.put(CellUtil.FILL_FOREGROUND_COLOR, hssfColor.getIndex());
styleproperties.put(CellUtil.FILL_PATTERN, FillPatternType.SOLID_FOREGROUND);
CellUtil.setCellStyleProperties(cell, styleproperties);
}
}
}
}
public static void main(String[] args) throws Exception {
Workbook workbook = WorkbookFactory.create(new FileInputStream("ExcelTest.xls"));
HSSFSheet sheet = (HSSFSheet)workbook.getSheetAt(0);
giveGradientToColumn(sheet, 5, 10, 90);
workbook.write(new FileOutputStream("ExcelTestNew.xls"));
workbook.close();
}
}
结果:
免责声明:
代码经过测试,可使用 apache poi
的最新稳定版本 3.17
进行测试和运行。您的代码使用了旧版本(我知道是因为使用了 HSSFColor.GOLD.index
)。
顺便说一句:
我真正建议的是将 Excel 文件格式升级为现代的 *.xlsx
Office Open XML
文件格式。不仅颜色限制消失了,您还可以简单地使用 Conditional Formatting使用色阶可能会更好地满足您的要求。
关于java - 使用自定义 rgb 对列的单元格进行着色,以在列中创建渐变图案,每个单元格使用 apache poi 都有自己的 rgb,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51171098/
我拦截了一个数据包并提取了有效载荷。此有效负载是压缩的 jpeg 字节流数据(例如,将此数据分配给 unsigned char *payload )。我知道如果我有一个 FILE 指针,那么我可以使用
假设我们有一个单 channel 图像 (5x5) A = [ 1 2 3 4 5 6 7 8 9 2 1 4 5 6 3 4 5 6 7 4 3 4
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 2 年前。 Improve th
我有一个 RGB LED 并且有 9、10、11 的引脚和接地的引脚。已为 R、G 和 B 提供电阻器。 当我这样做时: analogWrite(r, 255); // I see a red c
我想知道如何从像素中获取颜色作为 RGB 整数,并在需要时进行转换。另外,如何利用差异来确定一个像素是否比另一个像素更亮或更暗。 最佳答案 简单: rgb_int = rgb_tuple[0] <<
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 3 年前。 Improve
我的目标是找到与数组中的 RGB 相比最接近的 RGB 匹配项。我已经创建了一个循环遍历图片中每个像素的函数。我现在唯一需要做的就是找到图片中每个像素最接近数组颜色的颜色。 $colors = arr
将 YUV 文件转换为 RGB 文件时出现问题。完成后,我无法使用 GIMP 或其他查看器打开 .rgb 文件,但我成功打开下载的 .rgb 文件。请告诉我RGB文件的结构是什么? (它是否包含标题?
我正在开发一个程序,在该程序中我获取图像的一部分并计算该图像的平均 RGB。当我计算它时,我得到完全不同的值,就好像我要使用内置函数一样。当我测试我的数字并将它们放入 RGB 颜色图表时,它们会关闭,
我正在尝试无损压缩图像,为了利用规律性,我想将图像从 RGB 转换为 Y'CbCr。 (我所说的 RGB 和 Y'CbCr 的具体细节在这里并不重要;RGB 数据由三个字节组成,我有三个字节来存储结果
我有一个应用程序可以生成一堆 jpg,我需要将这些 jpg 转换为 webm 视频。我正在尝试将 jpeg 中的 rgb 数据放入 vpxenc 示例中。我可以在输出视频中看到原始 jpg 的基本形状
我不太熟悉位移位,所以我有以下问题。我使用下面的函数(在别处找到)从 YUV 解码为 RGB int 数组。 现在我想调整红色或绿色或蓝色值来创建一些自定义滤镜效果。我需要检索 R 值、G 值和 B
在下面的代码片段中,我试图在 Visual C++ 中检索像素的 RGB 值,然后将相同的 RGB 值设置回相同的像素。也就是说,这只是一个测试。但是,当我这样做时,生成的图像相似但颜色错误/关闭。生
我试图在 上将 RGB 颜色从蓝色 (rgba(0,0,255)) 转换为红色 (rgba(255,0,0)) >JS mouseenter,渐进式。 因此,每次鼠标进入一个元素时,它都会“增加”其背
我需要根据像素的 RGB 颜色创建一个 Color 对象(读取 PNG 文件的 BufferedImage 对象,BufferedImage 颜色空间为 BufferedImage.TYPE_4BYT
我正在编写一段代码,它必须从 RGB 图像转换为 rgb 标准化空间。我已经使用 for 格式使用它,但它运行速度太慢,我需要评估大量图像。我正在尝试矢量化完整功能以加快它的速度。我现在有以下内容:
我想在多种光照条件下获取图像的 RGB 值。为了获得某种中性场景,我想使用一些预定义图像的 RGB 值对 RGB 值进行归一化。 让我解释一下。我有 6 张预定义图像,我知道它们的确切平均 RGB 值
将平行四边形((RGB)点的二维数组)投影到三角形((RGB)点的二维数组)(在我的特定情况下,将矩形投影到具有相同边长的直角三角形)的伪代码算法是什么(等腰),在我的例子中,斜边的大小与矩形的最大边
假设我有一张摄影底片扫描为 RGB 图像,我正试图找到一种算法将颜色值转换为 RGB 正片。 由于橙色偏差 (http://photo.net/learn/orange-negative-mask),
我已成功将图像转换为灰度图像,我想将灰度图像恢复为 RGB 图像。请帮忙。提前致谢。 -(UIImage *) toGrayscale { const int RED = 1;
我是一名优秀的程序员,十分优秀!