你是一名MATLAB工程师,用丰富的MATLAB处理excel经历。我有一个excel文档,里面保存的是学生信息,第一行是表头。里面每一行代表一个学生的信息,不同的填充颜色代表学生的不同状态。我希望你永MATLAB为我进行如下操作:
(1)将Excel导入matlab中。文件路径为D:\干正事的\工作\25.9.3(推免志愿者);文件名为推免报名情况-进1群名单(整理后-9.3下午).xlsx
(2)不要对旧的excel进行改动,生成四个新的excel文件,每个新的excel文件具有和原excel文件相同的表头设置(第一行)。
(3)以每一行填充的颜色进行识别。无色(白色)填充的行代表的是状态正常的学生。将其对应信息导入第一个新建的excel文件中,并命名为:已正常入群a人(9.3下午)。注意这里的a需要你根据实际的行数进行统计,从第二行开始每一行对于一名同学。
(4)填充为大黄色的行代表申请延迟的同学,将其对应信息导入第二个新建的excel文件中,并命名为:已申请延迟b人(9.3下午)。注意这里的b同样需要你根据实际的行数进行统计,从第二行开始每一行对于一名同学。
(5)填充为大红色的行代表放弃的同学,将其对应信息导入第三个新建的excel文件中,并命名为:已放弃c人(9.3下午)。注意这里的c同样需要你根据实际的行数进行统计,从第二行开始每一行对于一名同学。
(6)填充为其他颜色的行代表未进行答复的同学,将其对应信息导入第四个新建的excel文件中,并命名为:未答复d人(9.3下午)。注意这里的d同样需要你根据实际的行数进行统计,从第二行开始每一行对于一名同学。
我补充额外信息:
无色为(255,255,255)
大黄色为(255,255,0)
大红色为(255,0,0)
请你在如下代码基础上进行修改生成相应的matlab代码
% 参数
srcFolder = 'D:\干正事的\工作\25.9.3(推免志愿者)';
srcFile = '推免报名情况-进1群名单(整理后-9.3下午).xlsx';
srcPath = fullfile(srcFolder, srcFile);
% 启动 Excel(隐藏)
excel = actxserver('Excel.Application');
excel.Visible = false;
try
wb = excel.Workbooks.Open(srcPath, 0, true); % ReadOnly=true
ws = wb.Worksheets.Item(1);
% UsedRange 与尺寸
used = ws.UsedRange;
firstRow = used.Row;
firstCol = used.Column;
nRows = used.Rows.Count;
nCols = used.Columns.Count;
lastRow = firstRow + nRows - 1;
% 读取表头(UsedRange 的第1行)
headerData = used.Rows.Item(1).Value;
if iscell(headerData)
headerRow = headerData(1, :);
else
headerRow = num2cell(headerData(1, :));
end
% 四类数据容器
normalRows = {};
delayRows = {};
abandonRows = {};
otherRows = {};
% 工具函数
toRGB = @(c) [bitand(c,255), bitand(bitshift(c,-8),255), bitand(bitshift(c,-16),255)];
isApprox = @(rgb, target, tol) all(abs(double(rgb) - double(target)) <= tol);
% 主循环:从数据第二行开始(即 UsedRange 的第2行)
for absRow = firstRow+1:lastRow
relRow = absRow - firstRow + 1; % 在 UsedRange 中的相对行号(>=2)
% 取该行在 UsedRange 中的数据
rowVals = used.Rows.Item(relRow).Value;
% 标准化为 1xN cell
if iscell(rowVals)
if size(rowVals,1) > 1, rowVals = rowVals(1,:); end
else
rowVals = num2cell(rowVals);
if size(rowVals,1) > 1, rowVals = rowVals(1,:); end
end
% 整行是否全空
isEmptyCell = @(x) isempty(x) || (ischar(x)&&isempty(strtrim(x))) || (isstring(x)&&strlength(x)==0);
if all(cellfun(isEmptyCell, rowVals))
continue;
end
% 取用于判色的代表单元格:优先第一个非空(绝对坐标),否则首列
colorCell = [];
for relCol = 1:nCols
if ~isEmptyCell(rowVals{1, relCol})
colorCell = ws.Cells.Item(absRow, firstCol + relCol - 1);
break;
end
end
if isempty(colorCell)
colorCell = ws.Cells.Item(absRow, firstCol);
end
% 读取填充信息
ci = colorCell.Interior.ColorIndex; % -4142=无填充
pattern = colorCell.Interior.Pattern; % 0=无填充
oleColor = colorCell.Interior.Color;
rgb = toRGB(double(oleColor));
% 分类
if ci == -4142 || pattern == 0 || isApprox(rgb, [255 255 255], 10)
normalRows(end+1, :) = rowVals; %#ok<AGROW>
elseif isApprox(rgb, [255 255 0], 25)
delayRows(end+1, :) = rowVals; %#ok<AGROW>
elseif isApprox(rgb, [255 0 0], 25)
abandonRows(end+1, :) = rowVals; %#ok<AGROW>
else
otherRows(end+1, :) = rowVals; %#ok<AGROW>
end
end
% 计数
a = size(normalRows, 1);
b = size(delayRows, 1);
c = size(abandonRows, 1);
d = size(otherRows, 1);
% 关闭源文件与 Excel
wb.Close(false);
excel.Quit;
delete(excel);
% 输出文件名
out1 = fullfile(srcFolder, sprintf('已正常入群%d人(9.3下午).xlsx', a));
out2 = fullfile(srcFolder, sprintf('已申请延迟%d人(9.3下午).xlsx', b));
out3 = fullfile(srcFolder, sprintf('已放弃%d人(9.3下午).xlsx', c));
out4 = fullfile(srcFolder, sprintf('未答复%d人(9.3下午).xlsx', d));
% 写出
writecell([headerRow; normalRows], out1, 'Sheet', 1);
writecell([headerRow; delayRows], out2, 'Sheet', 1);
writecell([headerRow; abandonRows], out3, 'Sheet', 1);
writecell([headerRow; otherRows], out4, 'Sheet', 1);
fprintf('完成。输出文件:\n%s\n%s\n%s\n%s\n', out1, out2, out3, out4);
catch ME
% 确保 Excel 正常退出
try
if exist('wb','var') && ~isempty(wb), wb.Close(false); end
if exist('excel','var') && ~isempty(excel), excel.Quit; delete(excel); end
catch, end
rethrow(ME);
end
最新发布