MS Access OLEDBПодключение к Excel Проблема

Итак, я искал около 2 дней, и хотя я могу найти много примеров того, как получить рабочий лист Excel в gridView, ни один из них не работает для меня.

Это цель: мне нужно прочитать файл Excel, в нем есть один рабочий лист и всегда должен быть один рабочий лист в нем, в GridView на веб-сайте ASP.NET, и я использую VB.Net в коде за файлом.

Я попробовал один способ, пытаясь использовать схему имени таблицы (чтобы получить имена листов), но независимо от того, какое имя листа было, оно всегда возвращалось как «Algrip», из которых НЕТ листа с таким именем ни в одной из книг. Я тестирую с.

Поэтому я отказался от этого и теперь использую этот код: (который вроде как выполняет свою работу)

    'Setup Variables
    Dim xlConnStr As String = ""
    Dim FileName As String = Path.GetFileName(FileUpload1.PostedFile.FileName)
    Dim Extension As String = Path.GetExtension(FileUpload1.PostedFile.FileName)
    Dim FolderPath As String = ConfigurationManager.AppSettings("FolderPath")
    Dim sheetname As String = InputBox("Enter Sheetname: ", "Excel Worksheet name")

    'Adjust Sheetname
    sheetname = sheetname + "$"

    'Set Connection based on Excel File Extension
    Select Case Extension
        Case ".xls"
            'Excel  97-03
            xlConnStr = ConfigurationManager.ConnectionStrings("Excel03ConString").ConnectionString
        Case ".xlsx"
            'Excel 07-Forward
            xlConnStr = ConfigurationManager.ConnectionStrings("Excel07ConString").ConnectionString
    End Select

    xlConnStr = String.Format(xlConnStr, FolderPath & FileName)
    Dim connXL As New OleDb.OleDbConnection(xlConnStr)
    pnlFileInfo.Visible = True
    connXL.Open()
    Using xlCmd As New OleDbCommand
        xlCmd.CommandType = CommandType.Text
        xlCmd.CommandText = ("Select * From [" + sheetname + "]")
        xlCmd.Connection = connXL
        Using xlDS As New DataSet()
            Using xlDA As New OleDbDataAdapter(xlCmd)
                xlDA.Fill(xlDS)
                gvExcelFile.DataSource = xlDS
                gvExcelFile.DataBind()
            End Using
        End Using
    End Using
    connXL.Close()

Теперь моя проблема заключается в следующем; В следующей строке:

xlCmd.CommandText = ("Select * From [" + sheetname + "]")

Если у меня нет левой и правой скобок, потому что в именах некоторых листов есть пробелы, я получаю ошибку запроса. Но если я добавлю скобки, он дважды предложит мне имя листа. В жизни не могу понять почему.

Я поставил точку останова в строке, указанной выше, и проверил значение переменной имя листа, и оно правильное, но по какой-то причине я снова получаю приглашение.

Кто-нибудь знает, почему он это делает? Что мне не хватает? В идеале я хотел иметь возможность прочитать имя листа и передать его в строку с оператором select, чтобы не требовалось никаких действий пользователя, но все, что я когда-либо получал таким образом, было тем же плохим именем листа «Algrip».

Лист Excel представляет собой файл xls, но его можно сохранить как xlsx, если это поможет.

Я готов переделать код, если смогу заставить его динамически читать имя листа.

Спасибо за любую помощь!!


person mbcharney    schedule 05.04.2017    source источник


Ответы (1)


попробуйте сохранить всю команду в переменной, а затем назначьте ее xlCmd.CommandText с помощью конструктора OleDbCommand

Dim sheetname As String = InputBox("Enter Sheetname: ", "Excel Worksheet name")
sheetname = sheetname & "$"
Dim strQuery As String = "Select * From [" & sheetname & "]"

...

Using xlCmd As New OleDbCommand(strQuery ,connXL)

    Using xlDS As New DataSet()
        Using xlDA As New OleDbDataAdapter(xlCmd)
            xlDA.Fill(xlDS)
            gvExcelFile.DataSource = xlDS
            gvExcelFile.DataBind()
        End Using
    End Using

End Using
connXL.Close()
person Hadi    schedule 05.04.2017
comment
Это то, что я уже делаю. Я запрашиваю имя листа, а затем добавляю $ к ответу, а затем использую его как переменную. Если я добавлю скобки [ ], то он снова запрашивает меня, без них он говорит, что строка запроса неверна. - person mbcharney; 05.04.2017
comment
что я пытаюсь сказать, так это сохранить команду в переменной, а затем назначить ее SQLCommand, я обновил, чтобы быть более понятным - person Hadi; 05.04.2017
comment
Я собираюсь попробовать это, но я не смогу сделать это до завтра. Я буду обновлять соответственно. - person mbcharney; 05.04.2017
comment
Я изменил код так, что теперь он помещает запрос в строку. Теперь у меня есть строка, в которой говорится: «qryStr = Select * From [ + имя_листа +], и я изменяю строку command.text, чтобы она выглядела следующим образом: «xlCmd.CommandText = qryStr», но он все еще дважды запрашивает имя листа, и я понятия не имею, почему. Может ли кто-нибудь объяснить, почему он это делает? - person mbcharney; 06.04.2017
comment
@mbcharney передает строку конструктору, как показано в моем ответе. - person Hadi; 06.04.2017
comment
Хорошо, я изменил его на «Использование xlCmd As New OleDbCommand (qryStr, connXL)», где qryStr представляет собой «qryStr = Select * From [ + имя_листа +]», и он по-прежнему дважды запрашивает имя листа. Я думаю, что мне придется отказаться от всей этой подлодки и начать сначала. Спасибо за всю помощь. - person mbcharney; 06.04.2017
comment
@mbcharney.. у меня есть похожий код, я предоставлю его через некоторое время - person Hadi; 06.04.2017
comment
Итак, я наконец понял проблему. Лист предоставлен сторонним клиентом, и в нем содержится более дюжины именованных диапазонов. Сотрудник, который готовил листы, не удалял все диапазоны имен. После того, как они были удалены, код работает нормально. Спасибо за помощь. - person mbcharney; 06.04.2017
comment
Рад был помочь :) - person Hadi; 06.04.2017