|
楼主 |
发表于 2024-4-27 17:55
|
显示全部楼层
- Private Shared ReadOnly RADIX As Integer = 26 ' 转换26进制
- Private Shared ReadOnly CODEBASE As Integer = 64 '编码差值 字符 与 值差 64
- ''' <summary>
- ''' 编码: A--Z 表示 0-25 基数,26个数 从 1 开始,也就是说 A-Z ,N+1 表1-26<br/>
- ''' AA--ZZ 表示00到25*26,一共26*26个数,MN ,(M+1)*26+N+1,如AB, 值: (0+1)*26+1+1 = 28<br/>
- ''' AAA--ZZZ 表示000到25*26*26,一共26*26*26个数,PMN (P+1)*26*26+(M+1)*26+N+1<br/>
- ''' AAAA--ZZZZ 表示0000到25*26*26*26,一共26*26*26*26个数,QPMN: (Q+1)*26*26*26+(P+1)*26*26+(M+1)*26+N+1<br/>
- ''' 整数转编码: <see cref="GetCellColName"/> <br/>
- ''' V表示一个整数<br/>
- ''' 1. N =(V-1) mod 26 ; V=(V-1)/26 = (Q+1)*26*26+(P+1)*26+(M+1) ;<br/>
- ''' 2. M=(V-1) mod 26 ; V=(V-1)/26 = (Q+1)*26+(P+1);<br/>
- ''' 3. P=(V-1) mod 26 ; V=(V-1)/26 = (Q+1);<br/>
- ''' 4. Q=(V-1) mod 26 ; V=(V-1)/26 = 0;<br/>
- ''' 5. V=0 退出计算,转换完成<br/>
- ''' </summary>
- ''' <param name="ColName"></param>
- ''' <returns></returns>
- Public Shared Function GetCellColIndex(ColName As String) As Integer
- Dim charArr As Char() = ColName.ToCharArray()
- Dim ret As Integer = 0
- For Each c As Char In charArr
- ret = ret * RADIX + Strings.Asc(c) - CODEBASE ' N+1
- Next
- Return ret
- End Function
- Public Shared Function GetCellColName(ColIndex As Integer) As String
- Dim sb As New StringBuilder
- Dim modvalue As Integer
- If ColIndex < 1 Or ColIndex >= &H4000 Then Return String.Empty
- While ColIndex > 0
- ColIndex -= 1
- modvalue = ColIndex Mod RADIX
- sb.Append(Chr(modvalue + CODEBASE + 1))
- ColIndex \= RADIX
- End While
- Return Strings.StrReverse(sb.ToString)
- End Function
复制代码 |
|