关于本站
1、基于Django+Bootstrap开发
2、主要发表本人的技术原创博客
3、本站于 2015-12-01 开始建站
Excel的列名是字母。但有时候,需要通过数字得到列名或者通过列名得到第几列。
这里有两种方法。一种是通过列名或数字计算;一种通过Range对象转换。
方法1:
Excel列名命名是用字母命名。从A到Z,Z之后是AA,变成两个字母。一共有26个字母,相当于26进制。
我们使用的数字是10进制,数字和列名转换相当于10进制和26进制互转。
不过,这里的26进制有点奇怪。不是普通意义上的26进制。
假如A代表0,而AA应该对应10。这里两个A代表的数字不同。十位上的A是1,个位上的A是0。这个对计算造成不少麻烦。我看过网上其他代码,对这个问题处理不是很好,计算繁琐。
需要对可以整数的部分进行处理,看如下代码:
//数字转列名
public string GetColumnNameByNum(int intColNum, string col = "")
{
if(intColNum > 26)
{
int mod = intColNum % 26; //余数
int rel = intColNum / 26; //除数结果
//处理整除的数字
if(mod == 0)
{
mod = 26; //0对应26,即为Z
rel -= 1; //高位的数字退1位
}
//递归转换
return GetColumnNameByNum(rel, ((char)(mod + 64).ToString() + col);
}
else
{
return ((char)(intColNum + 64).ToString() + col;
}
}测试的时候,测试1,26,27,52,53能否转成对应的A,Z,AA,AZ,BA等列名。
列名转数字就相对简单很多,直接利用进制转换原理计算即可。
//列名转数字
public int GetColumnNumByName(string strColumnName)
{
strColumnName = strColumnName.ToUpper();
int length = strColumnName.Length;
int colNum = 0;
for (int i = 0; i < length; i++)
{
colNum += (strColumnName[i] - 64) * 26 ^ (length - i - 1);
}
return colNum;
}其中,字符串索引得到char字符。char字符可以直接参与计算。
同样再测试A,Z,AA,AZ,BA等列名能否转成对应的1,26,27,52,53。
方法2:
还有一种方法可以直接通过Range对象的Address属性和Column属性获取。
先导入引用:
using Excel = Microsoft.Office.Interop.Excel;
数字转列名相互转换的代码如下:
//数字转列名
public string GetColumnNameByNum(int intColNum)
{
//获取单元格
string address = Globals.ThisAddIn.Application.Cells.get_Address(1, intColNum);
//找到第2个$的位置
int find = address.IndexOf('$', 1);
return address.Substring(1, find - 1);
}
//列名转数字
public int GetColumnNumByName(string strColumnName)
{
Excel.Range rng = Globals.ThisAddIn.Application.Range[strColumnName + "1"];
return rng.Column; //直接返回对应列
}这两种方法看起来第2中方法代码比较少。
建议用第1种,因为第1种方法计算比较快。第2种方法,需要当前工作簿有打开一个文件才可以使用,且计算慢。
○⊙◎◐◑。。。°ºoO.·
不错
2019-04-25 11:06 回复
○⊙◎◐◑。。。°ºoO.·
厉害
2019-04-25 11:06 回复