Excel 内饰。颜色属性反转颜色?
我已经编写了一段代码,允许我检索excel工作簿工作表中特定单元格的着色颜色。通过使用MATLAB启动COM服务器,然后访问特定单元格对象的内部对象,我成功地检索了RGB整数值。然后我得到该整数的等效RGB三元组,以便稍后在MATLAB中绘制 为了测试我的代码是否正常工作,我设计了以下测试:我创建了一个名为Excel 内饰。颜色属性反转颜色?,excel,matlab,Excel,Matlab,我已经编写了一段代码,允许我检索excel工作簿工作表中特定单元格的着色颜色。通过使用MATLAB启动COM服务器,然后访问特定单元格对象的内部对象,我成功地检索了RGB整数值。然后我得到该整数的等效RGB三元组,以便稍后在MATLAB中绘制 为了测试我的代码是否正常工作,我设计了以下测试:我创建了一个名为colorTest.xlsx的Excel工作簿,使用8种不同的颜色: 然后我运行我的MATLAB代码,它提取B列每个单元格的颜色信息。我应该得到一个具有相同垂直顺序的颜色的绘图,以及一个具有
colorTest.xlsx
的Excel工作簿,使用8种不同的颜色:
然后我运行我的MATLAB代码,它提取B列每个单元格的颜色信息。我应该得到一个具有相同垂直顺序的颜色的绘图,以及一个具有int值和每种颜色的RGB三元组的表
然而意外的事情发生了!查看结果:
请注意,从“颜色”属性中获取的整数值并不总是与原始单元格的颜色匹配,对于黑色、白色、绿色和洋红,整数值是正确的,但对于所有其他颜色,情况并非如此。例如,您可以看到,对于Excel上的红色,输出int和RGB三元组对应于蓝色
我添加了下表,其中包含我应该得到的正确结果,以供参考:
Color Int R G B
-------- -------- -----
Black 0 0 0 0
White 16777215 1 1 1
Red 16711680 1 0 0
Green 65280 0 1 0
Blue 255 0 0 1
Cyan 65535 0 1 1
Magenta 16711935 1 0 1
Yellow 16776960 1 1 0
我使用获得了每种颜色的正确整数值
如果我们比较这两个表,我们可以推断红色通道和蓝色通道是反向的
代码:
我为运行测试而执行的函数名为getCellColor
。请看一下代码:
function getCellColor()
clear all;
clc;
% Excel
filename = 'colorTest.xlsx';
% Start Excel as ActiveX server process on local host
Excel = actxserver('Excel.Application');
% Handle requested Excel workbook filename
path = validpath(filename);
% Cleanup tasks upon function completion
cleanUp = onCleanup(@()xlsCleanup(Excel, path));
% Open Excel workbook.
readOnly = true;
[~, workbookHandle] = openExcelWorkbook (Excel, path, readOnly);
% Initialise worksheets object
workSheets = workbookHandle.Worksheets;
% Get the sheet object (sheet #1)
sheet = get(workSheets,'item',1);
% Print table headers
fprintf('Color \t Int \t R G B\n');
fprintf('--------\t --------\t -----\n');
% Create figure
figure;
hold on;
% Loop through every color on the Excel file
for row = 1:8
% Get the cell object with name of color
cell = get(sheet, 'Cells', row, 1);
cName = cell.value;
% Get the cell object with colored background
cell = get(sheet, 'Cells', row, 2);
% Get the interior object
interior = cell.Interior;
% Get the color integer property
cInt = get(interior, 'Color'); % <-- Pay special attention here(*)
% Get the RGB triplet from its integer value
cRGB = int2rgb(cInt);
% Plot the color
patch([0 0 1 1], [8-row 9-row 9-row 8-row], cRGB);
% Print row with color data
fprintf('%-8s\t %8d\t %d %d %d\n', cName, cInt, cRGB);
end
% Turn off axes
set(findobj(gcf, 'type','axes'), 'Visible','off')
end
我试图从中理解一些道理,但我真的不知道发生了什么。我做了一些研究,运气不好,但引起了我的注意。也许这和我的问题有关 Interior.Color属性真的反转颜色吗?
如果是这样的话,我应该认为这是正常行为还是这个bug?
下载链接: 我已经将整个项目打包在一个.zip文件中并上传了它,所以您可以立即在您的机器上运行此测试。下载文件并解压缩
您的
int2rgb
方法反转R和B。替换它们,您将获得正确的转换。Interior.Color属性使用R最不重要的约定,而您使用的FileExchange函数使用相反的约定
要将整型转换为RGB,请执行以下操作:
B = floor(colorInt / (256*256));
G = floor((colorInt - B*256*256)/256);
R = colorInt - B*256*256 - G*256;
colorRGB = [R G B];
要从RGB转换为int,请执行以下操作:
colorInt = colorRGB * [1 256 256*256]';
我的第一个想法是检查通道顺序RGB与BGR 您可以使用
typecast
来简化int2rgb
函数。下面是一个使用您发布的值的示例:
clrs = [0; 16777215; 16711680; 65280; 255; 65535; 16711935; 16776960]
for i=1:numel(clrs)
bgra = typecast(int32(clrs(i)), 'uint8')
end
输出:
clrs =
0
16777215
16711680
65280
255
65535
16711935
16776960
bgra =
0 0 0 0
bgra =
255 255 255 0
bgra =
0 0 255 0
bgra =
0 255 0 0
bgra =
255 0 0 0
bgra =
255 255 0 0
bgra =
255 0 255 0
bgra =
0 255 255 0
这里没有“对”或“错”,Matlab和Excel只是对颜色进行不同的编码。您需要在代码中说明这一点
我能找到的最接近官方来源的是这篇MSDN文章,大约在文章的一半,请参见“蓝色”编码示例
以下示例将选定单元格的内部设置为蓝色。
Selection.Interior.Color=16711680Selection.Interior.Color=&HFF0000
Selection.Interior.Color=&O77600000
Selection.Interior.Color=RGB(0,0,255) 从RGB颜色模型上的: RGB颜色模型用于指定颜色。这个模型 以0到0的比例指定红色、绿色和蓝色的强度 255,0(零)表示最小强度。设置 这三种颜色通过使用此选项转换为单个整数值 公式: RGB值=红色+(绿色*256)+(蓝色*256*256) 正如中所建议的,在颜色编码方面没有“对”或“错”。微软选择这种特殊的颜色编码方式,原因只有他们知道,我应该坚持下去 所以我得到的RGB值是完全正确的 在下表中,我将MSDN文章中提供的RGB值与我在MATLAB中得到的值放在一起,它们是完美匹配的
Color Int RGB values from MSDN
-------- -------- --------
Black 0 0
White 16777215 16777215
Red 255 255
Green 65280 65280
Blue 16711680 16711680
Cyan 16776960 16776960
Magenta 16711935 16711935
Yellow 65535 65535
现在是否可以在Excel调色板中进行更改?我发现这可能有用。不幸的是,我自己没有Matlab来解决这个问题:---您可以通过修改工作簿对象的颜色数组来更改默认调色板中的值。例如,要将ColorIndex值3引用的颜色更改为蓝色,请使用==>
工作簿(“SomeBook.xls”).Colors(3)=RGB(0,0255)
我从未见过Interior.color出现此问题。我猜你的RGB int转换是反向的。这就是我在设置Interior时如何将RGB转换为int的方法代码>。适合您喜欢的任何颜色。我现在已经检查了您的int2rgb
方法。它确实反转了R和B。@Naveh的确,我知道我可以更改我的int2rgb
函数并修复颜色反转,但这不是我要问的(请阅读注释)。问题的根源早在那之前就已经存在了,它可能与Excel的颜色编码有关。这令人惊讶。我认为颜色编码对每个人都是一样的,就像一种标准。
Color Int RGB values from MSDN
-------- -------- --------
Black 0 0
White 16777215 16777215
Red 255 255
Green 65280 65280
Blue 16711680 16711680
Cyan 16776960 16776960
Magenta 16711935 16711935
Yellow 65535 65535