0

ユーザーがExcelファイルを選択できるWebページを構築しようとしています。ページはページのコンテンツを読み取り、検証後にデータをDBにアップロードします。

実行用のボタンとデータを表示するためのグリッドビューを備えた fileUpload asp コントロールがあります。これは最終目標ではありませんが、スクリプトがファイルを正常に読み取っているかどうかをテストするだけです (そうではありません)。

私が取得し続けるエラーは次のとおりです。

"The Microsoft Office Access database engine could not find the object 'Sheet1'. Make sure the object exists and that you spell its name and the path name correctly."

私がアップロードしたExcelファイルには間違いなくSheet1が含まれているため、何が起こっているのかわかりません。

OleDB がどのように機能するかについて、多くの経験や理解があるふりをするつもりはないので、それは簡単なことだと確信しています。

私のコードは次のとおりです。

Protected Sub Upload_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Upload.Click
    If (testFile.HasFile) Then
        Dim conn As OleDbConnection
        Dim cmd As OleDbCommand
        Dim da As OleDbDataAdapter
        Dim ds As DataSet
        Dim query As String
        Dim connString As String = ""
        Dim strFileType As String = System.IO.Path.GetExtension(testFile.FileName).ToString().ToLower()

        'Check file type
        If strFileType.Trim = ".xls" Or strFileType.Trim = ".xlsx" Then
        Else
            MsgBox("Only excel files allowed")
            Exit Sub
        End If

        Try
            'Connection String to Excel Workbook
            If strFileType.Trim = ".xls" Then
                connString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & testFile.FileName & ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=2"""
            ElseIf strFileType.Trim = ".xlsx" Then
                connString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & testFile.FileName & ";Extended Properties=""Excel 12.0;HDR=Yes;IMEX=2"""
            End If

            query = "SELECT * FROM [Sheet1$]"

            'Create the connection object
            conn = New OleDbConnection(connString)
            'Open connection
            If conn.State = ConnectionState.Closed Then conn.Open()
            'Create the command object
            cmd = New OleDbCommand(query, conn)
            da = New OleDbDataAdapter(cmd)
            ds = New DataSet()
            da.Fill(ds)

            grvExcelData.DataSource = ds.Tables(0)
            grvExcelData.DataBind()

            da.Dispose()
            conn.Close()
            conn.Dispose()
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    Else
        MsgBox("Must have file")
        Exit Sub
    End If
End Sub

また、私のコードの具体的なエラーとともに、OleDB について詳しく知る方法についての優れたリソースもありがたく思います。

ありがとう!

4

1 に答える 1

0

おそらく DropDownList オブジェクトで、ページからシートを表示するための出力を作成する必要があります (このコードは少し醜いですが、正しい方向を示しているはずです)。基本的に、シートが存在することを確認するために最初にシートを返します...

 private void ProcessExcelFile(string fileName, bool isOpenXMLFormat)
    {
        string fn = System.IO.Path.GetFileName(fileName);
        String RelativePath = "YourPath/" + fn;
        string connectionString = String.Empty;
        OleDbConnection con;

        if (isOpenXMLFormat)
            //read a 2007 file  
            connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" +
                fileName + ";Extended Properties=\"Excel 8.0;HDR=YES;\"";
        else
            //read a 97-2003 file  
            connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +
                fileName + ";Extended Properties=Excel 8.0;";

        con = new OleDbConnection(connectionString);
        con.Open();

        //get all the available sheets  
        System.Data.DataTable dataSet = con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);

        //get the number of sheets in the file  
        string[] workSheetNames = new String[dataSet.Rows.Count];
        int i = 0;
        foreach (DataRow row in dataSet.Rows)
        {
            //insert the sheet's name in the current element of the array  
            //and remove the $ sign at the end  
            //workSheetNames[i] = row["TABLE_NAME"].ToString().Trim(new[] { '$' });
            workSheetNames[i] = row["TABLE_NAME"].ToString();
            i++;
        }
        SheetNames.DataSource = workSheetNames;
        SheetNames.DataBind();
于 2013-03-14T15:51:50.110 に答える