1

Excel ファイル (.xls、または .xlsx) をアップロードして読み取ろうとしています。

このコードを使用して正常にアップロードしています:

Protected Sub btnUpload_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles    btnUpload.Click
    Dim filepath As String = ""
    If FileUpload1.HasFile Then
        Try
            Dim filename As String = FileUpload1.PostedFile.FileName
            Dim extension = (filename.Substring(filename.LastIndexOf("."), (filename.Length() - filename.LastIndexOf("."))))
            If extension = ".xlsx" Or extension = ".xls" Then
                filepath = "\" & Common.toUnix(Now) & "_" & filename
                FileUpload1.SaveAs(Server.MapPath("~/") & filepath)
                  ' ====   NOW READ THE FILE
            Else
                StatusLabel.InnerText = "Only Excel file types are accepted (.xls/.xlsx)<br> File Uploaded had extension: " & extension
            End If

        Catch ex As Exception
            StatusLabel.InnerText = "Upload status: The file could not be uploaded. The following error occured: " + ex.ToString()
        End Try

    End If
End Sub

アップロードは問題ありませんが、ファイルを読み込もうとすると、次のエラーが発生します。

System.Data.OleDb.OleDbException (0x80004005): The Microsoft Jet database engine cannot open the file ''. It is already opened exclusively by another user, or you need permission to view its data.

次のようなコードを使用して読み取ります。

xls / xlsxファイルをトラバースするvb.net?

したがって、接続は次のようになります。

 Dim connString As String = "Provider=Microsoft.Jet.OLEDB.4.0" & _
                           ";Data Source=" & ExcelFile & _
                           ";Extended Properties=Excel 8.0;"

    Dim conn As OleDbConnection = Nothing
    Dim dt As System.Data.DataTable = Nothing
    Dim excelDataSet As New DataSet()

    Try

        conn = New OleDbConnection(connString)

        conn.Open()  '<<< ERROR IS RAISED ON THIS LINE
        dt = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, Nothing)
        If dt Is Nothing Then
            Return Nothing
        End If

        Dim excelSheets(dt.Rows.Count) As String
        Dim i As Integer = 0
        For Each row As DataRow In dt.Rows
            excelSheets(i) = row("payments").ToString
            System.Math.Min(System.Threading.Interlocked.Increment(i), i - 1)
            If i = SheetNumber Then
                Exit For
            End If
        Next

     ..................

共有サーバーにアップロードしているため、権限自体を制御することはできませんが、読み取り/書き込み権限があり、画像のアップロードは問題なく機能しますが、このファイルを読み取っているため、作業できません。

ノート

このエラーは .xls ファイルで発生します。.xlsx を使用すると、次のエラーが発生します。

System.Data.OleDb.OleDbException (0x80004005): Cannot update. Database or object is read-only. at System.Data.OleDb.OleDbConnectionInternal

このエラーは次の行で発生します。

 For Each row As DataRow In dt.Rows

したがって、ファイルをアップロードして開いているようですが、行を読み取っていないようです....

なぜそれが起こっているのか私にもわかりません!

どんな助けでも大歓迎です!

4

1 に答える 1

0

ACE は残忍で、常に問題を抱えており、同時に 32 ビット バージョンと 64 ビット バージョンの両方のシステムに存在することはできません。その結果、私はそれをまったく使用しません。

Excel XLSX ファイルを読み取るには、「EPPlus」を使用します。これは、非常に扱いやすく、非常に効率的であることが証明されています。

XLSX でのみ動作します ( XLSではありません)。

例...(最初のシートをデータテーブルとして引き出すだけです)

    Public Function XlsxToDataTable(byteStream As IO.MemoryStream) As DataTable
        Using pac As New OfficeOpenXml.ExcelPackage(byteStream)
            Dim wb As OfficeOpenXml.ExcelWorkbook = pac.Workbook
            Dim ws As OfficeOpenXml.ExcelWorksheet = wb.Worksheets(1) '1 based
            Dim out As New DataTable
            For iC As Integer = 1 To ws.Dimension.End.Column
                out.Columns.Add(ws.Cells(1, iC).Value.ToString)
            Next
            For iR As Integer = 2 To ws.Dimension.End.Row
                Dim nr As DataRow = out.NewRow
                For iC As Integer = 1 To ws.Dimension.End.Column
                    nr(iC - 1) = ws.Cells(iR, iC).Value
                Next
                out.Rows.Add(nr)
            Next
            Return out
        End Using
    End Function
于 2013-04-15T00:16:59.720 に答える