数字序列如何Excel中字母表示的序列——一种特殊的十进制转二十六进制,以matlab调用excel画一幅像素画为例
matlab代码 十进制转二十六进制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==0temp=strcat(char(26+64),temp); n=floor(n/26)-1;elsetemp=strcat(char(yushu+64),temp);n=floor(n/26);endendif n==0elsetemp=strcat(char(n+64),temp);endrange=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; endend
十进制转二十六进制
其中对于行序,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);endend
数字序列如何Excel中字母表示的序列——一种特殊的十进制转二十六进制 以matlab调用excel画一幅像素画为例