16进制 dat matlab_MATLAB造轮子8_获取EXCEL单元格范围的相关操作

77eb3695ce4332fb94dfd059e7c17909.png

0 前言

上一篇文章,讲到使用Matlab读写Excel的各种方式,比如xlsread和xlswrite,还有actxserver,Matlab调用Excel宏,Excel调用Matlab,simulink处理excel的模块等等。

不了解的可以看下这篇文章:

szyyy:MATLAB造轮子7_MATLAB读写EXCEL的相关操作​zhuanlan.zhihu.com
1487810760d663febaa233f1d0883782.png
MATLAB造轮子7_MATLAB读写EXCEL的相关操作​mp.weixin.qq.com
4d9951fdb72fb35f3a41a6757ab7623a.png

在使用Matlab处理Excel数据的时候,有时常常需要先获取Excel单元格的位置,然后再执行读取或写入的操作,比如xlsread和xlswrite两个函数中的xlRange,还有actxserver函数。

在使用Matlab处理Excel数据的时候,有时常常需要先获取Excel单元格的位置,然后再执行读取或写入的操作,比如xlsread和xlswrite两个函数中的xlRange,还有actxserver函数。

86bd6ed6413ccabe2e142f68f7b679ed.png

a371087edcbd1cd26e1be3678f4b1c0a.png

90d2bbdeac9a4867e47298ea2dc81b49.png

以前的做法,通常是先对要处理的数据做个初步统计,记录下要读取或者写入的单元格地址范围,做个宏定义,然后在读取或写入的代码中,调用这个宏定义。

这种方式,对于数据格式确定,或者不频繁读取写入的数据,可能还不是太麻烦,但遇上需要批量读取或写入不同范围大小的数据时,就无法执行自动化操作了,怎么能够自动识别单元格的位置或范围?下面就讲讲大概的思路和代码。

1 主要思路

一种情况是,在向excel文件写入数据时,我们先知道数据的长度或大小,然后想把长度或大小直接转换成单元格的范围值xlRange。

比如一个16个数据的行向量,想写入到第一行,B 列为起始位置,则xlRange="B1:M16"。

另一种情况是,知道了单元格的范围或者位置,想把字符转换为数字。

比如"AA1",代表的是第一行,第27列的位置。

所以,以上主要会用到的函数有:

abs(str)和char(num),分别是将字符转化为数字,数字转化为字符。

其实主要就是ASCII码的转化,可以简单测试下功能:

abs('Z') = 90 = 26 + 64;
abs('ABC') = [65 66 67];
char(1+64) = 'A';
char([65 66 67]) = ‘ABC’;

转换多个字符串或数字的思路,可以先判断字符或数字计算长度,然后使用循环,一个个转换,最后再对字符或数字进行拼接就行了。另外,A到Z的字母排列,每隔26个就有一定的规律,类似26进制。

% 26进制法
% AB: 26进制可以表示为
(abs('A')-64)*26^1 + (abs('B')-64)*26^0 = 1*26^1+2*26^0 = 28
% ABC: 26进制可以表示为
(abs('A')-64)*26^2+(abs('B')-64)*26^1+(abs('C')-64)*26^1 
= 1*26^2+2*26^1 + 3*26^1 = 731 

这样,数字转字符串时,就可以使用除法或mod,不断地计算除以26之后的余数获得对应的字符,然后再拼接各个字符就可以了。

同样地,字符串转数字时,不断地对每一位,进行26的幂运算,然后累加,就可以获得最终的数字了。

具体可以看以下代码。

2 代码实现

提供了思路后,具体的代码实现,并不太复杂了,只要再做些防错的检测等,确保输入是数字或者字符,就可以执行数字或字符的转换了。(另外,要注意判断整除为0时,其实是Z)检测输入的是否为数字,可以使用:

ifisa(InputNum,'numeric');

检测输入的是否为数字,可以使用:

ischar(InputStr);

另外,数字或字符的翻转,可以使用:

InputStr_2 = InputStr(end:-1:1);

或者InputStr_2= rot90(InputStr,2);

具体可以参考以下代码,大部分已经做了注释。

Excel单元格_数字转字符串:

% Func1: Excel_Num2Str
% Author: qcgcsrc
% Date: 20200419
​
%% TestCase
% A = Excel_Num2Str(1);
% AZ =  Excel_Num2Str(52);
% Z = Excel_Num2Str(26); 
% ZA = Excel_Num2Str(677);   
% 1-A, 2-B, ...,26-Z,27-AA
function [OutStr] = Excel_Num2Str(InputNum)    
    ifisa(InputNum,'numeric')  % 判断输入的是否为数字
        x = InputNum;       
        x2_char = '';
        while x > 0
            x1 = mod(x, 26); % 不断对x执行取模(取余数)
            if x1==0         % 如果余数0,则能被26整除,代表Z
                x1 = 26;
            end           
            x1_char = char(x1 + 64); % 得到对应数字的字符(1:A),加上64
            x = (x - x1)/26;         % 得到一个新的x ()
            x2_char = [x2_char x1_char];           
        end       
        OutStr = rot90(x2_char,2);
    end   
end

Excel单元格_字符串转数字:

% Func2: Excel_Str2Num
% Author: qcgcsrc
% Date: 20200419
​
%% TestCase
% Excel_Str2Num('ABCD'): 19010
% Excel_Str2Num('ABC'): 731
% Excel_Str2Num('AA'): 27
% Excel_Str2Num('Z'): 26
% A-1, B-2, ...,Z-26,AA-27 
function [OutNum] = Excel_Str2Num(InputStr)       
    OutNum = 0;
    if ischar(InputStr) % 判断输入的是否为字符   
        lens_Str = length(InputStr);    %  计算字符长度
        InputStr_2 = InputStr(end:-1:1); % 将字符翻转(ABC->CBA)
        %InputStr_2 = rot90(InputStr,2); % 将字符翻转2(ABC->CBA) 
       
        for N1 = 1 : 1 : lens_Str  % 从字符最后一个开始转换
            strNum = abs(InputStr_2(N1)) - 64;     % 'A'-> 65-> 1   
            OutNum = OutNum +  strNum * 26^(N1-1); % ABC
        end   
    end   
end

3 总结

有了以上函数代码,就可以在获取数据的长度后,直接拼接出写入xls单元格范围的字符串。

针对数据长度变化或者单元格地址范围变化,只要再加些代码,就能自动化的计算出新的范围地址,再也不用一个个手动计算了。

如下所示为示例代码:

%% 或者数据长度后,计算xls单元格的范围地址
lens_SpdRow = length(Table_Spd);
lens_TrqCol = length(Table_Trq3);
% B20:Q20
strRange_SpdRow = strcat(Excel_Num2Str(2), num2str(lens_TrqCol+1),':',...
    Excel_Num2Str(2+lens_SpdRow-1), num2str(lens_TrqCol+1));   
% A1:A19
strRange_TrqCol = strcat(Excel_Num2Str(1),num2str(1),':',...
    Excel_Num2Str(1), num2str(lens_TrqCol));
 
sheet2.Range(strRange_SpdRow).Value = Table_Spd;   % 
sheet2.Range(strRange_TrqCol).Value = Table_Trq3;   % 
 
% sheet.Range(strRange).Value = data;
% sheet.Range(strcat('A', num2str(lens_Trq)).Value = Table_Spd;   % 
% sheet.Range('B20: Q20').Value = Table_Spd;   % 
% sheet.Range('A19: A1').Value = Table_Trq3;   % 360:20

好了,本期就先分享到这,下次有机会再分享MATLAB和Excel相关的一些操作。

本文相关的代码已经基本都在文章里了,如需要源码的朋友,可以到后台留言,或者回复"Excel单元格地址范围" 获取。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值