问题
I'm trying to build a webpage that allows a user to choose an excel file and then the page will read the contents of the page and upload the data to the DB after validation.
I have a fileUpload asp control with a button for execution and a gridview to display the data. This isn't the end-goal, but I have it simply to test if the script is reading the file successfully (which it isn't).
The error I keep getting is:
"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."
The excel file I upload definitely has a Sheet1, so I'm not sure what's going on.
I won't pretend to have a lot of experience or understanding as how OleDB works, so I'm sure it's something simple.
My Code is as follows:
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
I'd also appreciate a good resource on how to learn more about OleDB along with the specifics errors of my code!
Thanks!
回答1:
You need to create an output to view the sheets from the page, perhaps in a DropDownList object (this code is a little ugly, but should point you in the right direction). Basically return your sheets first to verify it exists...
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();
来源:https://stackoverflow.com/questions/15412936/cant-find-referenced-sheet-in-excel-file-while-trying-to-read-from-a-webpage-in