经典 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