经典 asp 使用 order by 对 Excel 中的字母数字值进行排序
classic asp sorting alphanumeric values from Excel using order by
我在网页上列出了我的供应商每周提供给我的大量备件。我只是将 .xlsx 文件上传到 web 文件夹,页面会自行填充。目的是不以任何方式更改文件,因此不涉及任何工作。在经典 ASP 我正在使用
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.Open "Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};"&_
"DBQ=" & Server.MapPath(file) & ";"
strSQL = "SELECT * FROM A1:D10000 order by ""Item number"" ASC"
Set objRS=objConn.Execute(strSQL)
项目编号是零件号,可以是数字或字母数字
问题是顺序不正确
例子
x1
x11
x111
x2
x22
x222
什么时候应该
x1
x2
x11
x22
x111
x222
我明白为什么会这样,但找不到正确的顺序
其他一切都很好,但客户并不期望在 x200 之前找到 X1000,这导致了一些问题
非常感谢您提供的任何帮助
对于 Excel 中的此类问题,一种解决方案是使用 "helper columns" 将数据拆分为数字部分和字母部分,然后对辅助列进行排序。
根据您的真实数据,您可以使用这些公式:
Alpha(第一)部分
=LEFT(A1,MIN(FIND({0;1;2;3;4;5;6;7;8;9},A1&"0123456789"))-1)
数字(第二)部分
=MID(A1,MIN(FIND({0;1;2;3;4;5;6;7;8;9},A1&"0123456789")),99)
编辑:更新了我的完整测试代码和input/output。
我在 Excel 中 运行 这个,但我只是在一个简单的 ASP 页面中确认了它...
Sub TestQuery()
Dim oConn As New ADODB.Connection
Dim oRS As New ADODB.Recordset
Dim sPath
Dim sSQL As String
sSQL = " select [Item Number], [Name] from " & _
" D22:E34 order by 1*right([Item Number],len([Item Number])-1) "
sPath = ThisWorkbook.Path & "\" & ThisWorkbook.Name
oConn.Open "Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};" & _
"DBQ=" & sPath & ";"
Set oRS = oConn.Execute(sSQL)
If Not oRS.EOF And Not oRS.BOF Then
ToSheet Sheet1.Range("H22"), oRS
Else
MsgBox "No records found"
End If
End Sub
Sub ToSheet(rng, rs)
Dim f, i
i = 0
For Each f In rs.Fields
rng.Offset(0, i).Value = f.Name
i = i + 1
Next f
rng.Offset(1, 0).CopyFromRecordset rs
End Sub
我在网页上列出了我的供应商每周提供给我的大量备件。我只是将 .xlsx 文件上传到 web 文件夹,页面会自行填充。目的是不以任何方式更改文件,因此不涉及任何工作。在经典 ASP 我正在使用
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.Open "Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};"&_
"DBQ=" & Server.MapPath(file) & ";"
strSQL = "SELECT * FROM A1:D10000 order by ""Item number"" ASC"
Set objRS=objConn.Execute(strSQL)
项目编号是零件号,可以是数字或字母数字 问题是顺序不正确
例子
x1
x11
x111
x2
x22
x222
什么时候应该
x1
x2
x11
x22
x111
x222
我明白为什么会这样,但找不到正确的顺序
其他一切都很好,但客户并不期望在 x200 之前找到 X1000,这导致了一些问题
非常感谢您提供的任何帮助
对于 Excel 中的此类问题,一种解决方案是使用 "helper columns" 将数据拆分为数字部分和字母部分,然后对辅助列进行排序。
根据您的真实数据,您可以使用这些公式:
Alpha(第一)部分
=LEFT(A1,MIN(FIND({0;1;2;3;4;5;6;7;8;9},A1&"0123456789"))-1)
数字(第二)部分
=MID(A1,MIN(FIND({0;1;2;3;4;5;6;7;8;9},A1&"0123456789")),99)
编辑:更新了我的完整测试代码和input/output。 我在 Excel 中 运行 这个,但我只是在一个简单的 ASP 页面中确认了它...
Sub TestQuery()
Dim oConn As New ADODB.Connection
Dim oRS As New ADODB.Recordset
Dim sPath
Dim sSQL As String
sSQL = " select [Item Number], [Name] from " & _
" D22:E34 order by 1*right([Item Number],len([Item Number])-1) "
sPath = ThisWorkbook.Path & "\" & ThisWorkbook.Name
oConn.Open "Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};" & _
"DBQ=" & sPath & ";"
Set oRS = oConn.Execute(sSQL)
If Not oRS.EOF And Not oRS.BOF Then
ToSheet Sheet1.Range("H22"), oRS
Else
MsgBox "No records found"
End If
End Sub
Sub ToSheet(rng, rs)
Dim f, i
i = 0
For Each f In rs.Fields
rng.Offset(0, i).Value = f.Name
i = i + 1
Next f
rng.Offset(1, 0).CopyFromRecordset rs
End Sub