C++ 将Excel列字母转换为相应的列号
我正在创建一个类来帮助创建excel文件(第二个问题)。我有一个成员函数,它在特定的行和列位置创建一个单元格,并将其保存到数组中C++ 将Excel列字母转换为相应的列号,c++,excel,visual-c++,C++,Excel,Visual C++,我正在创建一个类来帮助创建excel文件(第二个问题)。我有一个成员函数,它在特定的行和列位置创建一个单元格,并将其保存到数组中 ExcelSheet::SetValue(int row, int column, std::string szValue) { myWorksheet[row][column] = szValue; } 但是,我重载了这个函数,可以选择将列指定为字母/数字组合,就像在Excel中一样。我希望能够将“A3”之类的输入转换为第3行第1列,或将AB19转换为第1
ExcelSheet::SetValue(int row, int column, std::string szValue) {
myWorksheet[row][column] = szValue;
}
但是,我重载了这个函数,可以选择将列指定为字母/数字组合,就像在Excel中一样。我希望能够将“A3”之类的输入转换为第3行第1列,或将AB19转换为第19行第28列。即
ExcelSheet::SetValue(std::string szCell, std::string value) {
// search for the alphabetical part of szCell using regex and
// convert it to a column number
myWorksheet[row][column] = szValue;
}
Excel列模式如下所示:
A, B, C, D, E... Z (1-26)
AA, AB, AC, AD, AE... AZ (27-52)
BA, BB, BC, BD, BE... BZ (53-78)
...
ZA, ZB, ZC... ZZ
AAA, AAB, AAC... AAZ
ABA, ABB, ABC... ABZ
...
AZA, AZB, AZC... AZZ
BAA, BAB, BAC... BAZ
...
因此,我认为某种基于26的循环会起作用,但我甚至不确定在实现它时从哪里开始
更新:
我几乎可以工作的代码:它可以编译,但由于某些不清楚的原因无法正确获取行
#include <vector>
#include <string>
#include <iostream>
#include <regex>
class VectorClass {
std::vector<std::string> vectorString;
public:
void PrintVector(std::string szValue) {
std::string str = "space";
vectorString.push_back(szValue);
vectorString.push_back(str);
std::cout << "Loop:" << std::endl;
for(int i=0; i < vectorString.size(); i++) {
std::cout << vectorString[i] << std::endl;
}
}
int GetColumn(std::string szValue) {
std::regex rgx("^([a-zA-Z]+)");
std::smatch result;
if( regex_search(szValue, result, rgx) ) {
std::string szResult = result[0];
int numletters = szResult.length();
const char * colstr = szResult.c_str();
//char colstr[5];
//int numofletters = 0;
//for(int n=0;n<szResult.length();n++) {
// colstr[n] = szResult.substr(n,1);
// numofletters++;
//}
//char colstr[]="AEF";
int col=0;
for(int i=0; i<numletters; i++) {
col = 26*col + colstr[i] - 'A' + 1;
}
return col;
//return atoi(szResult.c_str());
}
else
return -1;
}
int GetRow(std::string szValue) {
std::regex rgx("^[a-zA-Z]+(\d+)$");
std::smatch result;
if( regex_search(szValue, result, rgx) ) {
std::cout << "test: " << result.size() << std::endl;
for(size_t i=0; i<result.size(); ++i) {
std::cout << result[i] << std::endl;
}
std::string szResult = result[0];
return atoi(szResult.c_str());
}
else
return -1;
}
};
int main () {
VectorClass myclass;
//myclass.PrintVector("ship");
std::cout << "A1 = Column " << myclass.GetColumn("A1") << ", Row " << myclass.GetRow("A1") << std::endl;
std::cout << "B32 = Column " << myclass.GetColumn("B32") << ", Row " << myclass.GetRow("B32") << std::endl;
std::cout << "Z65 = Column " << myclass.GetColumn("Z65") << ", Row " << myclass.GetRow("Z65") << std::endl;
std::cout << "AA12 = Column " << myclass.GetColumn("AA12") << ", Row " << myclass.GetRow("AA12") << std::endl;
std::cout << "AB366 = Column " << myclass.GetColumn("AB366") << ", Row " << myclass.GetRow("AB366") << std::endl;
std::cout << "FAB43 = Column " << myclass.GetColumn("ZAB43") << ", Row " << myclass.GetRow("ZAB43") << std::endl;
std::cout << "ZZZ43456 = Column " << myclass.GetColumn("XDE43456") << ", Row " << myclass.GetRow("XDE43456") << std::endl;
std::cin.get();
return 0;
}
#包括
#包括
#包括
#包括
类向量类{
std::向量字符串;
公众:
void PrintVector(标准::字符串值){
std::string str=“space”;
矢量字符串。推回(szValue);
向量字符串。推回(str);
std::cout注意,字符有一个ASCII值,您可以从以下内容获取该列:
char colstr[]="AEF";
int ii, col=0;
for(ii=0; ii<3; ii++) {
col = 26*col + colstr[ii] - 'A' + 1;
}
这给我的输出是:
for A123 the row is 123 and the column is 1
for aB321 the row is 321 and the column is 28
for ABCA6543 the row is 6543 and the column is 19007
请注意,字符具有ASCII值,您可以从以下内容获取该列:
char colstr[]="AEF";
int ii, col=0;
for(ii=0; ii<3; ii++) {
col = 26*col + colstr[ii] - 'A' + 1;
}
这给我的输出是:
for A123 the row is 123 and the column is 1
for aB321 the row is 321 and the column is 28
for ABCA6543 the row is 6543 and the column is 19007
在Java中,以防有人想要Java版本
import java.util.*;
import java.lang.*;
import java.io.*;
class Ideone
{
public static void main (String[] args) throws java.lang.Exception
{
rowColFromA1("C5");
rowColFromA1("$AB123456789");
rowColFromA1("$C$5");
rowColFromA1("C$5");
rowColFromA1("$C5");
rowColFromA1("$D5");
rowColFromA1("$aC$5");
rowColFromA1("$c$5");
rowColFromA1("cBa$99");
rowColFromA1("cBa$");
rowColFromA1("99");
rowColFromA1("$K$34");
}
public static int[] rowColFromA1(String a1ref) {
int ii=0, jj, colVal=0;
char[] cellAddr = a1ref.toCharArray();
int[] rowCol = new int[2];
int endOfCol;
try {
while(cellAddr[ii] >= 'A' || cellAddr[ii] == '$' ) { ii++;};
endOfCol = (cellAddr[ii-1] == '$') ? ii-1 : ii;
} catch (ArrayIndexOutOfBoundsException aiobe)
{ rowCol[0] = 1; rowCol[1] = 1; return rowCol;}
// skip $ of col, if any
jj = (cellAddr[0] == '$') ? 1 : 0;
// ii now points to first character of row address
for(;jj<endOfCol;jj++) colVal = 26*colVal + Character.toUpperCase(cellAddr[jj]) -'A' + 1;
rowCol[1] = (colVal > 0) ? colVal : 1;
int rowVal = 0;
for (;ii < cellAddr.length; ii++)
rowVal = rowVal * 10 + cellAddr[ii] - '0';
rowCol[0] = (rowVal > 0) ? rowVal : 1;
System.out.println("R"+ rowCol[0]+"C"+rowCol[1]);
return rowCol;
}
}
import java.util.*;
导入java.lang.*;
导入java.io.*;
表意文字
{
公共静态void main(字符串[]args)引发java.lang.Exception
{
rowColFromA1(“C5”);
rowColFromA1($AB123456789”);
rowColFromA1(“C$5”);
第1行(“C$5”);
第1行(“C5美元”);
第1行(“D5美元”);
rowColFromA1($aC$5”);
rowColFromA1(“c$5”);
rowColFromA1(“cBa$99”);
rowColFromA1(“cBa$”);
rowColFromA1(“99”);
rowColFromA1(“K$34”);
}
公共静态int[]rowColFromA1(字符串a1ref){
intⅡ=0,jj,colVal=0;
char[]cellAddr=a1ref.toCharArray();
int[]rowCol=新int[2];
int endOfCol;
试试{
而(cellAddr[ii]>='A'| | cellAddr[ii]='$'){ii++};
endOfCol=(cellAddr[ii-1]='$)?ii-1:ii;
}捕获(阵列索引边界外异常aiobe)
{rowCol[0]=1;rowCol[1]=1;返回rowCol;}
//跳过$col(如果有)
jj=(cellAddr[0]='$')?1:0;
//现在指向行地址的第一个字符
对于(;jj0)?colVal:1;
int-rowVal=0;
对于(;ii0)?rowVal:1;
System.out.println(“R”+rowCol[0]+“C”+rowCol[1]);
返回rowCol;
}
}
在线java ide:在java中,以防有人想要java版本
import java.util.*;
import java.lang.*;
import java.io.*;
class Ideone
{
public static void main (String[] args) throws java.lang.Exception
{
rowColFromA1("C5");
rowColFromA1("$AB123456789");
rowColFromA1("$C$5");
rowColFromA1("C$5");
rowColFromA1("$C5");
rowColFromA1("$D5");
rowColFromA1("$aC$5");
rowColFromA1("$c$5");
rowColFromA1("cBa$99");
rowColFromA1("cBa$");
rowColFromA1("99");
rowColFromA1("$K$34");
}
public static int[] rowColFromA1(String a1ref) {
int ii=0, jj, colVal=0;
char[] cellAddr = a1ref.toCharArray();
int[] rowCol = new int[2];
int endOfCol;
try {
while(cellAddr[ii] >= 'A' || cellAddr[ii] == '$' ) { ii++;};
endOfCol = (cellAddr[ii-1] == '$') ? ii-1 : ii;
} catch (ArrayIndexOutOfBoundsException aiobe)
{ rowCol[0] = 1; rowCol[1] = 1; return rowCol;}
// skip $ of col, if any
jj = (cellAddr[0] == '$') ? 1 : 0;
// ii now points to first character of row address
for(;jj<endOfCol;jj++) colVal = 26*colVal + Character.toUpperCase(cellAddr[jj]) -'A' + 1;
rowCol[1] = (colVal > 0) ? colVal : 1;
int rowVal = 0;
for (;ii < cellAddr.length; ii++)
rowVal = rowVal * 10 + cellAddr[ii] - '0';
rowCol[0] = (rowVal > 0) ? rowVal : 1;
System.out.println("R"+ rowCol[0]+"C"+rowCol[1]);
return rowCol;
}
}
import java.util.*;
导入java.lang.*;
导入java.io.*;
表意文字
{
公共静态void main(字符串[]args)引发java.lang.Exception
{
rowColFromA1(“C5”);
rowColFromA1($AB123456789”);
rowColFromA1(“C$5”);
第1行(“C$5”);
第1行(“C5美元”);
第1行(“D5美元”);
rowColFromA1($aC$5”);
rowColFromA1(“c$5”);
rowColFromA1(“cBa$99”);
rowColFromA1(“cBa$”);
rowColFromA1(“99”);
rowColFromA1(“K$34”);
}
公共静态int[]rowColFromA1(字符串a1ref){
intⅡ=0,jj,colVal=0;
char[]cellAddr=a1ref.toCharArray();
int[]rowCol=新int[2];
int endOfCol;
试试{
而(cellAddr[ii]>='A'| | cellAddr[ii]='$'){ii++};
endOfCol=(cellAddr[ii-1]='$)?ii-1:ii;
}捕获(阵列索引边界外异常aiobe)
{rowCol[0]=1;rowCol[1]=1;返回rowCol;}
//跳过$col(如果有)
jj=(cellAddr[0]='$')?1:0;
//现在指向行地址的第一个字符
对于(;jj0)?colVal:1;
int-rowVal=0;
对于(;ii0)?rowVal:1;
System.out.println(“R”+rowCol[0]+“C”+rowCol[1]);
返回rowCol;
}
}
在线java ide:基本上是通过字符串反向工作,对每个字母的[ASCII值-64]*[26^[position-1]]求和(其中位置是左右位置)在C++中,你是如何得到ASCII值的?不知道,但我知道Google的几分钟就能回答这个问题。当你分配给<代码> char < />代码时,那是一个字节,它的数值是ASCII码。谢谢。我能让你的代码工作,但由于某种原因,我很难做我认为很简单的事情:GETIN。g行。将我的代码添加到我的问题中。基本上,向后遍历字符串,对每个字母的[ASCII值-64]*[26^[position-1]]求和(其中position为左右位置)在C++中,你是如何得到ASCII值的?不知道,但我知道Google的几分钟就能回答这个问题。当你分配给<代码> char < />代码时,那是一个字节,它的数值是ASCII码。谢谢。我能让你的代码工作,但由于某种原因,我很难做我认为很简单的事情:GETIN。g行。将我的代码添加到我的问题中。