将 行:1,4-5,8,11 列:a,c-e,f
这种写法转换成单元格地址的方法。
- public static Tuple
int>, List<string>> ConvertRowColumn(string rowRep, string colRep)
- {
- List<int> rowIdxs = new List<int>();
-
- rowRep = rowRep.Replace(" ", "");
- colRep = colRep.Replace(" ", "");
-
- foreach (string item in rowRep.Split(','))
- {
- Match singleValM = Regex.Match(item, @"^(\d+)$");
- Match rangeValM = Regex.Match(item, @"^(\d+)-(\d+)$");
- if (singleValM.Success)
- {
- int rowIdx = int.Parse(singleValM.Groups[1].Value);
- rowIdxs.Add(rowIdx);
- }
- else if (rangeValM.Success)
- {
- int a = int.Parse(rangeValM.Groups[1].Value);
- int b = int.Parse(rangeValM.Groups[2].Value);
-
- int start = Math.Min(a, b);
- int end = Math.Max(a, b);
-
- for (int i = start; i <= end; i++)
- {
- rowIdxs.Add(i);
- }
- }
- else
- {
- //报错,不能识别
- }
- }
-
- List<int> colIdxs = new List<int>();
- foreach (string item in colRep.Split(','))
- {
- Match singleValM = Regex.Match(item, @"^([a-z]+)$", RegexOptions.IgnoreCase);
- Match rangeValM = Regex.Match(item, @"^([a-z]+)-([a-z]+)$", RegexOptions.IgnoreCase);
- if (singleValM.Success)
- {
- int colIdx = ColumnTitleToNumber(singleValM.Groups[1].Value);
- colIdxs.Add(colIdx);
- }
- else if (rangeValM.Success)
- {
- int a = ColumnTitleToNumber(rangeValM.Groups[1].Value);
- int b = ColumnTitleToNumber(rangeValM.Groups[2].Value);
-
- int start = Math.Min(a, b);
- int end = Math.Max(a, b);
-
- for (int i = start; i <= end; i++)
- {
- colIdxs.Add(i);
- }
- }
- else
- {
- //报错,不能识别
- }
- }
- rowIdxs.Sort();
- colIdxs.Sort();
-
-
- List<string> colTitles = new List<string>();
- foreach (int colIdx in colIdxs)
- {
- colTitles.Add(ColumnNumberToTitle(colIdx));
- }
-
- Tuple
int>, List<string>> rowsCols = new Tupleint>, List<string>>(rowIdxs, colTitles);
- return rowsCols;
- }
-
- private static int ColumnTitleToNumber(string columnTitle)
- {
- columnTitle = columnTitle.ToUpper();
- int result = 0;
- for (int i = 0; i < columnTitle.Length; i++)
- {
- result *= 26;
- result += columnTitle[i] - 'A' + 1;
- }
- return result;
- }
-
- private static string ColumnNumberToTitle(int columnNumber)
- {
- string result = "";
- while (columnNumber > 0)
- {
- int remainder = (columnNumber - 1) % 26;
- result = (char)(remainder + 'A') + result;
- columnNumber = (columnNumber - 1) / 26;
- }
- return result;
- }