2013-03-29 60 views
1

我一直在試圖上傳和讀取Excel文件(.xls或.xlsx)格式問題在VB.net

我使用此代碼upploading成功地讀取Excel文件:

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 

它上傳OK,不過嘗試讀取文件時,我得到這個錯誤:

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. 

我使用代碼來讀取與此類似:

vb.net traversing an xls/xlsx file?

因此連接如下:

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 

所以它似乎是uplpoading和打開文件確定,但不能讀取行....

我不確定爲什麼會發生這種情況!

任何幫助將不勝感激!

+0

如果你想讀'xlsx'文件,您需要使用ACE OLEDB提供程序。試試這個連接字符串'Provider = Microsoft.ACE.OLEDB.12.0; Data Source = myFile.xlsx; Extended Properties =「」Excel 12.0 Xml; IMEX = 1; HDR = YES;「」'對於xls文件,提供者= Microsoft.ACE.OLEDB.12.0;數據源= myFile.xls;擴展屬性=「」Excel 8.0; IMEX = 1; HDR = YES;「」' –

+0

好吧,試過了,我正在創建'微軟'。 ACE.OLEDB.12.0'提供程序沒有在本地計算機上註冊,這是我無法控制的共享服務器,我不能用這個做很多事情嗎?我找不到要下載的.dll文件,只有Microsoft提供的EXE文件,我只能在本地安裝。 –

回答

0

ACE是殘酷的,一直有問題,它不能同時存在於32位和64位版本的系統中。因此我根本不使用它。

要閱讀Excel XLSX文件,我使用「EPPlus」,這已被證明是非常容易處理和extreamly高效。

它只適用於XLSX作品( XLS)

例...(簡單剛剛掏出第一張爲一個DataTable)

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