数字序列如何Excel中字母表示的序列——一种特殊的十进制转二十六进制,以matlab调用excel画一幅像素画为例

数字序列如何Excel中字母表示的序列——一种特殊的十进制转二十六进制,以matlab调用excel画一幅像素画为例

matlab代码

原理比较简单,实际上是将JPG图片的RGB3个波段的值分别读到3个矩阵/二维数组,再根据矩阵/数组的值确定颜色,再用程序将excel背景颜色填充即可。需要注意的是excel的单元格不是正方形,须将之重新调一下行高和列宽使之相等,行高和列宽的单位不同,需要换算 。另一个难点是 将数字表示的列序转为excel中的字母表示

clc;
    clear;
    a=imread('C:\Users\csh_g\Pictures\Saved Pictures\test.jpg'); %自己的路径
    a1=a(:,:,1);
    a2=a(:,:,2);
    a3=a(:,:,3);
    % a1=round(rand(533,800)*254)+1 ;
    % a2=round(rand(533,800)*254)+1 ;
    % a3=round(rand(533,800)*254)+1 ;
    hExcel = actxserver('excel.application');   % 创建一个excel实例对象
    hWorkbooks = hExcel.Workbooks;          % 创建一个活动工作本组对象
    hWorkbook = hWorkbooks.invoke('Add');          % 增加一个工作本(簿)对象
    hSheets = hExcel.ActiveWorkBook.Sheets;      % 获得当前工作本句柄
    set(hExcel,'Visible',1);
    hSheet2 = hSheets.Add;
    hSheet2.Activate;
    hSheet2.Cells.RowHeight = 10;        %设置行高
    hSheet2.Cells.ColumnWidth = 1.63;      %设列宽,excel行宽和列高单位不同,绘制成方格需要换算一下
    for i=1:533  %行,
        for j=1:800  %列 ,用列名\
        %-------------序号转算列序字符串-------------------
            n=j;
            count=0;
            temp='';
            while floor(n/26)>0   %取整
                yushu=mod(n,26);
                if yushu==0
                   temp=strcat(char(26+64),temp); 
                   n=floor(n/26)-1;
                else
                    temp=strcat(char(yushu+64),temp);
                    n=floor(n/26);
                end
            end
            if n==0
            else
                temp=strcat(char(n+64),temp);
            end
            range=strcat(temp,num2str(i));
            %--------------序号换算列序字符串,实际上是十进制转26进制---------
                R=a1(i,j);
                G=a2(i,j);
                B=a3(i,j);
                color=double(R)+256*double(G)+65536*double(B);%对应颜色
            hSheet2.Range(range).Interior.Color=color;         
        end
    end

十进制转二十六进制

其中对于行序,excel中可以直接用,但是列序在excel中是字母表示的,这里可以看成是26进制的表达:A,B,C,…,Z,AA,AB,AC,…,AZ,BA,BB,BC,…,BZ,… 特殊地是,与其他进制不同,这里并不是从0开始的,可以看成是从1开始,到26结束的(理论上的26进制应该是从0开始,25结束)。

所以,这里应该如何将数字列序转为字母表达,以便excel参数识别呢。
首先确定每个数对应的字母是什么:1-26分别对应A-Z,char()可将数字转为对应ASCII字符,65是A,依次类推,则某个数字x对应字母为char(64+x)。

十进制转二十六字母进制

因为十进制转其他进制是除以进制数,这里就要考虑一下整除26的特殊情况:整除余数为0,但是0是没有对应字母的,实际上对应的是Z,所以此时应该设定为余数是26。 这一位对应的字母不应该是char(64+0),而是应该是char(64+26),即对应字母Z,代码如下(输入任意正整数数字n):

temp='';                                     %初始化字母列序
while floor(n/26)>0                           %取整,整数不为0一直循环
      yushu=mod(n,26);                        %取余
      if yushu==0                             %余数为0情况,变为余数为26,下一步的取整减1(一单位进制数)
          temp=strcat(char(26+64),temp); 
          n=floor(n/26)-1;
      else                                    %一般情况
          temp=strcat(char(yushu+64),temp);
          n=floor(n/26);
      end
end
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cshgiser

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值