Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 内饰。颜色属性反转颜色?_Excel_Matlab - Fatal编程技术网

Excel 内饰。颜色属性反转颜色?

Excel 内饰。颜色属性反转颜色?,excel,matlab,Excel,Matlab,我已经编写了一段代码,允许我检索excel工作簿工作表中特定单元格的着色颜色。通过使用MATLAB启动COM服务器,然后访问特定单元格对象的内部对象,我成功地检索了RGB整数值。然后我得到该整数的等效RGB三元组,以便稍后在MATLAB中绘制 为了测试我的代码是否正常工作,我设计了以下测试:我创建了一个名为colorTest.xlsx的Excel工作簿,使用8种不同的颜色: 然后我运行我的MATLAB代码,它提取B列每个单元格的颜色信息。我应该得到一个具有相同垂直顺序的颜色的绘图,以及一个具有

我已经编写了一段代码,允许我检索excel工作簿工作表中特定单元格的着色颜色。通过使用MATLAB启动COM服务器,然后访问特定单元格对象的内部对象,我成功地检索了RGB整数值。然后我得到该整数的等效RGB三元组,以便稍后在MATLAB中绘制

为了测试我的代码是否正常工作,我设计了以下测试:我创建了一个名为
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=16711680
Selection.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