gpt4 book ai didi

excel - Interior.Color 属性反转颜色?

转载 作者:太空宇宙 更新时间:2023-11-03 19:38:00 29 4
gpt4 key购买 nike

我编写了一段代码,允许我检索 Excel 工作簿工作表中特定单元格的底纹颜色。通过使用 MATLAB 的 actxserver 启动 COM 服务器,我已成功检索到 RGB 整数值。 , 然后访问 Color Property该特定单元格对象的内部对象。然后我获得了该整数的等效 RGB 三元组,因此我可以稍后在 MATLAB 中使用它进行绘图。

为了测试我的代码是否正常工作,我设计了以下测试:我创建了一个名为 colorTest.xlsx 的 Excel 工作簿,其中包含 8 种不同的颜色:

enter image description here

然后我运行我的 MATLAB 代码,它提取 B 列每个单元格的颜色信息。我应该得到一个颜色按相同垂直顺序排列的图,以及一个包含 int 值和每种颜色的 RGB 三元组的表格。

然而意想不到的事情发生了!查看结果:

enter image description here

请注意,从颜色属性获得的整数值并不总是与原始单元格的颜色匹配,对于黑色、白色、绿色和品红色,整数值是正确的,但对于所有其他颜色并非如此.例如,您可以看到,对于 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

我使用 this RGB Int Calculator 获得了每种颜色的正确整数值.

如果我们比较这两个表,我们可以推断出红色和蓝色 channel 是倒置的

代码:

我执行以运行测试的函数称为 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

(*) 该指令负责恢复颜色整数。


注意:接下来描述的函数不会导致问题因为它们不参与颜色整数的获取(它们仅用于次要任务).我包含此信息只是为了完整性。

在此过程中,我使用了 MATLAB 的 iofun 文件夹中的三个 private 函数,它们是:validpathxlsCleanupopenExcelWorkbook。我只是将它们复制到项目文件夹内名为 private 的文件夹中。

最后,为了从颜色整数中获取 RGB 三元组,我使用了一个改编自 this other function 的函数我在网上找到的。

这是我的 int2rgb 函数的代码:

function[RGB] = int2rgb(colorInt)
% Returns RGB triplet of an RGB integer.

if colorInt > 16777215 || colorInt < 0
error ('Invalid int value. Valid range: 0 <= value <= 16777215')
end
R = floor(colorInt / (256*256));
G = floor((colorInt - R*256*256)/256);
B = colorInt - R*256*256 - G*256;

RGB = [R, G, B]/255;
end

我想从中弄明白一些道理,但我真的不知道发生了什么。我做了一些研究,运气不佳,但是 this postthis other post吸引了我的注意力。也许这与我的问题有关。

那么 Interior.Color 属性真的会反转颜色吗?

如果是这种情况,我应该将其视为正常行为还是这是一个错误?


下载链接:

我已将整个项目打包成一个 .zip 文件并上传,因此您可以立即在您的机器上运行此测试。下载文件并解压。

getCellColor.zip

最佳答案

这里没有“对”或“错”之分,Matlab 和 Excel 只是编码颜色不同。您需要在代码中考虑到这一点。

我能找到的最接近官方来源的是这篇 MSDN 文章,大约一半的地方看到了“蓝色”的编码示例

MSDN article

The following examples set the interior of a selection of cells to the color blue. Selection.Interior.Color = 16711680
Selection.Interior.Color = &HFF0000
Selection.Interior.Color = &O77600000
Selection.Interior.Color = RGB(0, 0, 255)

关于excel - Interior.Color 属性反转颜色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35241610/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com