需求
使用COM技术读写Excel时,使用索引访问单元格是比较常用的一个操作,GetRange需要传入一个字符串范围参数,如"A1:B1", "C5:C10"等。这里的列使用的是字母,同Excel界面上看到的是一致的。所以在代码中需要将列的数字索引转换成字符索引。
思路
通过查看EXCEL中列的编码规律,总结成一句话就是:excel中列字母实际上可理解为一个由A-Z组成26进制数,此处即将整数转换成此26进制数。
实现代码
#include <iostream>
/*
* @brief excel列索引到列名
* @details excel中列字母实际上可理解为一个由A-Z组成26进制数,此处即将整数转换成此26进制数
* @param nCol 列索引,从1开始
*/
std::string ExcelColName(unsigned int nCol)
{
std::string strColName;
while (nCol > 0)
{
strColName.insert(strColName.begin(), ('A' + (nCol - 1) % 26));
nCol = (nCol - 1) / 26;
}
return strColName;
}
//测试函数
void Test(unsigned int nCol, const std::string& strExpected)
{
std::string strResult = ExcelColName(nCol);
std::cout << "nCol:" << nCol << ", result: " << strResult.c_str()
<< ", expected: " << strExpected.c_str();
if (strExpected != strResult)
{
std::cout << "--test failed." << std::endl;
}
else
{
std::cout << "--test successed." << std::endl;
}
}
int main()
{
//简单测试下
Test(0, "");
Test(1, "A");
Test(26, "Z");
Test(27, "AA");
Test(52, "AZ");
Test(53, "BA");
Test(16384, "XFD");
}