maltab下xlswrite时提示服务器出现意外情况的解决

转载

---------------------

问题描述:在Matlab中使用xlswrite函数时,如果excel文件存在是,则程序能够正常运行;当excel文件不存在时,则会出现错误:Error using xlswrite (line 220) Error: 服务器出现意外情况。

问题解决:xlswrite函数在调用时会占用excel的com端口,所以要保证在调用时这个端口是开放的,也就是没有被其他程序占用。打开任意一个excel(我的是13版)文档,点击文件--选项,弹出excel选项卡,在加载项中可以看到,活动应用程序加载项,以及非活动应用程序加载项;

由于我的系统中装了一个福昕阅读器,该程序占用了excel的com端口,所以当Matlab再去调用这个端口时就会出现异常​。具体解决方法:点击管理旁边的下拉菜单,选择COM加载项,点击转到,把福昕阅读器的前面的勾去掉,然后确定。

你是一名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
最新发布
09-04
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值