6

私はstring col= "AB21"Excelセルの場所です。

string column = "AB"&として解析したいint row = 21;

どうやってやるの?

4

4 に答える 4

10
string col = "AB21";
int startIndex = col.IndexOfAny("0123456789".ToCharArray());
string column = col.Substring(0, startIndex);
int row = Int32.Parse(col.Substring(startIndex));

もちろん、入力文字列が正しい形式になることを保証する必要があります。

于 2012-04-09T13:17:55.093 に答える
5

必要なオプションの1つは、正規表現を使用して入力文字列を検証および解析することです。以下のコードを参照してください。

using System;
using System.Text.RegularExpressions;

namespace DemoRegExForStackOverflow
{
    class Program
    {
        static void Main(string[] args)
        {
            var regex = new Regex(@"(?<col>([A-Z]|[a-z])+)(?<row>(\d)+)");
            var input = @"AB12";
            var match = regex.Match(input);

            if( match != null )
            {
                var col = match.Groups["col"];
                var row = match.Groups["row"];

                Console.WriteLine("Input is: {0}", input);
                Console.WriteLine("Column is {0}", col.Value);
                Console.WriteLine("Row is {0}", row.Value);
             }
             else
             {
                 throw new ArgumentException("Invalid input");
             }
        }
    }
}
于 2012-04-09T13:25:57.387 に答える
1

これがExcelの場合、有効な範囲の定義はバージョンによって異なるため、Excelを使用します。前の回答とは異なり、このルーチンは、範囲のように見えるが、Excel 2003の場合、「XB21」や「AB66000」などの有効な範囲ではない文字列を拒否します。以下の関数はC#に変換できると思います。

Sub SplitRangeStg(ByVal RngStg As String, ByRef RowNum As Long, _
                                          ByRef ColNum As Long)

  Dim RngErr As Boolean

  Err.Number = 0
  RngErr = False
  On Error Resume Next
  RowNum = Range(RngStg).Row      ' Sets Err.Number if range invalid
  If Err.Number <> 0 Then
    RngErr = True
    Err.Number = 0
  End If
  ColNum = Range(RngStg).Column   ' Sets Err.Number if range invalid
  If Err.Number <> 0 Then
    RngErr = True
    Err.Number = 0
  End If
  If RngErr Then
    RowNum = 0
    ColNum = 0
    Call MsgBox(RngStg & " not recognised as an Excel range", vbOKOnly)
  End If
  On Error GoTo 0

End Sub
于 2012-04-09T14:41:16.060 に答える
0

主に私自身の将来の参考のために:

        public static void Parse( string address )
        {
           string sheet;
           string col;
           int row;

           int sheetLength = address.IndexOf( '!' );

           if ( sheetLength > 0 )
           {
              sheet = address.Substring( 0, sheetLength );
           }
           else
           {
               sheet = string.Empty;
           }

           ++sheetLength; //skip the ! or start at 0

           int i = sheetLength;
           StringBuilder sb = new StringBuilder( );

           for( ; i < address.Length
                   && ! Char.IsDigit( address[ i ] ) 
                ; ++i )
           {
               sb.Append( address[ i ] );
           }

           col = sb.ToString( );
           sb.Clear( );

           for ( ; i < address.Length
                    && Char.IsDigit( address[ i ] )
                 ; ++i )
           {
               sb.Append( address[ i ] );
           }

           row = Int32.Parse( sb.ToString( ) );
       }

IndexOfAnyを使用したアプローチはあまり効率的ではなく、正規表現ソリューションでもありません。また、どちらのソリューションもシートを無視します。

于 2014-12-10T10:24:24.617 に答える