之前的项目中要频繁的读取Excel中某行某列的数据, 如果每次都是从下标0开始进行字符串的拼接, 这实在不是我等懒人的一贯作风.为此, 写了部分代码,来通过行和列的值直接读取Excel中对应单元格的数据.
读取Excel到DataTable中的方法, 传送门: https://blog.youkuaiyun.com/a33130317/article/details/90018777
// 转换excel的列名为数字的字典
private Dictionary<string, int> columnNameConvertInt = new Dictionary<string, int>();
#region 读取excel中某一个单元格的数据
// 输入excel实际的行列, 则读取DataTable中对应的数据
private string getExcelData(DataTable dt, int x, string y) {
int column = this.columnNameConvertInt[y.ToLower()];
if(dt.Rows[x - 1][column].ToString().Equals("")) {
return "";
}
return dt.Rows[x - 1][column].ToString();
}
// 设置columnNameConvertInt属性: 将excel的列名转成int
private void setColumnNameConvertInt() {
columnNameConvertInt.Add("a", 0);
columnNameConvertInt.Add("b", 1);
columnNameConvertInt.Add("c", 2);
columnNameConvertInt.Add("d", 3);
columnNameConvertInt.Add("e", 4);
columnNameConvertInt.Add("f", 5);
columnNameConvertInt.Add("g", 6);
columnNameConvertInt.Add("h", 7);
columnNameConvertInt.Add("i", 8);
columnNameConvertInt.Add("j", 9);
columnNameConvertInt.Add("k", 10);
columnNameConvertInt.Add("l", 11);
columnNameConvertInt.Add("m", 12);
columnNameConvertInt.Add("n", 13);
columnNameConvertInt.Add("o", 14);
columnNameConvertInt.Add("p", 15);
columnNameConvertInt.Add("q", 16);
columnNameConvertInt.Add("r", 17);
columnNameConvertInt.Add("s", 18);
columnNameConvertInt.Add("t", 19);
columnNameConvertInt.Add("u", 20);
columnNameConvertInt.Add("v", 21);
columnNameConvertInt.Add("w", 22);
columnNameConvertInt.Add("x", 23);
columnNameConvertInt.Add("y", 24);
columnNameConvertInt.Add("z", 25);
columnNameConvertInt.Add("aa", 26);
columnNameConvertInt.Add("ab", 27);
columnNameConvertInt.Add("ac", 28);
columnNameConvertInt.Add("ad", 29);
columnNameConvertInt.Add("ae", 30);
columnNameConvertInt.Add("af", 31);
columnNameConvertInt.Add("ag", 32);
columnNameConvertInt.Add("ah", 33);
columnNameConvertInt.Add("ai", 34);
columnNameConvertInt.Add("aj", 35);
columnNameConvertInt.Add("ak", 36);
columnNameConvertInt.Add("al", 37);
columnNameConvertInt.Add("am", 38);
columnNameConvertInt.Add("an", 39);
columnNameConvertInt.Add("ao", 40);
columnNameConvertInt.Add("ap", 41);
columnNameConvertInt.Add("aq", 42);
columnNameConvertInt.Add("ar", 43);
columnNameConvertInt.Add("as", 44);
columnNameConvertInt.Add("at", 45);
columnNameConvertInt.Add("au", 46);
columnNameConvertInt.Add("av", 47);
columnNameConvertInt.Add("aw", 48);
columnNameConvertInt.Add("ax", 49);
columnNameConvertInt.Add("ay", 50);
columnNameConvertInt.Add("az", 51);
}
#endregion
读取第2行,第A列的数据的方法(列名大小写均可):
getExcelData(dt, 2, "a")
2019年6月21日, 将setColumnNameConvertInt()方法重新修改如下:
// 设置columnNameConvertInt属性: 将excel的列名转成int
private void setColumnNameConvertInt() {
int endNum = 260; // 需要读取多少个列
char startChar = 'a'; // 初始的列名
int preNum = 0; // 列名的前一个计数
// 循环赋值列名的前一个字母
Dictionary<int, string> preString = new Dictionary<int, string>();
for(int i = 0;i < 27;i++) {
if(i == 0) {
preString.Add(i, "");
} else {
preString.Add(i, startChar.ToString());
startChar++;
}
}
// 循环赋值列名和对应的int
startChar = 'a';
for(int i = 0; i < endNum; i++) {
preNum = i / 26;
columnNameConvertInt.Add(preString[preNum] + startChar.ToString(), i);
startChar++;
if((i+1)%26 == 0) {
startChar = 'a';
}
}
}
说明:
1. endNum 是需要读取的列数, 可以事先声明, 也可以读取TextBox中输入的数值
2. 如果已在程序中声明了要读取的列数, 就可以将setColumnNameConvertInt()方法放入构造函数内, 使其在构造函数内执行.