I have an Excel file that the customer is pulling from their financial software and uploading to my web app. I need to connect to the file through ADO and read its contents into a SQL database.
The problem is that the file that comes from the financial software is a standalone Excel Worksheet, not Workbook, so no piece of software (besides Excel) that I've found can connect to/open it. No matter what connection string I use in the OleDB connector, I can't get it to work.
If I open the file in Excel, then simply save it, I can connect and read it fine. I wrote some code to automate Excel, using the Office interop, that opens/saves the file, and it works, but I've concluded this is bad practice to do on a server, based on testing and reading.
Does anyone know of a way I can get around this problem? I've seen some third party libraries, but they are very expensive.
Thanks in advance.
HttpPostedFile jvFile = FileUpload1.PostedFile;
string jvPath = Path.Combine(Server.MapPath("~"), Path.GetFileName(jvFile.FileName));
jvFile.SaveAs(jvPath);
string[] begins = {
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=",
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=",
"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=",
"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=",
"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=",
"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=",
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=",
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
};
string[] ends = {
";Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=1;\"",
";Extended Properties=\"Excel 8.0;HDR=Yes;\"",
";Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=1\"",
";Extended Properties=\"Excel 12.0 Xml;HDR=YES\"",
";Extended Properties=\"Excel 12.0 Xml;HDR=YES;IMEX=1\"",
";Extended Properties=\"Excel 12.0;HDR=YES\"",
";Extended Properties=\"Excel 12.0 Macro;HDR=YES\"",
";Extended Properties=\"text;HDR=Yes;FMT=Delimited\"",
";Extended Properties=\"text;HDR=Yes;FMT=Fixed\";"
};
for(int i = 0; i < begins.Length; i++)
{
StringBuilder sbExcelFileConnStr = new StringBuilder();
sbExcelFileConnStr.Append(begins[i]);
sbExcelFileConnStr.Append(jvPath);
sbExcelFileConnStr.Append(ends[i]);
OleDbConnection dbConn = new OleDbConnection(sbExcelFileConnStr.ToString());
string[] excelSheets = { };
try
{
dbConn.Open();
}
catch (Exception ex)
{
// fails here with "System.Data.OleDb.OleDbException:
// External table is not in the expected format."
//
//
}
}
I can't put the problem file anywhere b/c it contains sensitive data.
I've used the Excel Data Reader for reading Excel files. It's free.
Related
I am at a crossroads here and I need input from some people with experience with this. I want to be able to read and write from Excel for my WPF application (C#), but the options that I am seeing online are either clunky and messy (Interop) or won't work on a x64 bit application (OleDb). Are there other options for me to look at? Thanks
edit: here are my connection strings for OleDB
if (Path.GetExtension(filePath) == ".xls")
{
connectionString = #"Provider=Microsoft.ACE.OLEDB.12.0;
Data Source = '" + filePath +
"';Extended Properties=\"Excel 8.0;HDR=YES;\"";
}
else if(Path.GetExtension(filePath) == ".xlsx")
{
connectionString = #"Provider=Microsoft.ACE.OLEDB.12.0;
Data Source='" + filePath +
"';Extended Properties=\"Excel 12.0 Xml;HDR=YES;\"";
}
This question already has answers here:
Excel "External table is not in the expected format."
(25 answers)
Closed 7 years ago.
I want to read excell file with this code:
var fileName = #"d:\1.xlsx";
var connectionString = string.Format(
"Provider=Microsoft.Jet.OLEDB.4.0; data source="+fileName+
"; Extended Properties=Excel 8.0;", fileName);
var adapter = new OleDbDataAdapter("SELECT * FROM [sheet1$]", connectionString);
var ds = new DataSet();
adapter.Fill(ds, "anyNameHere");
DataTable data = ds.Tables["anyNameHere"];
But when run the program I get this error:
An unhandled exception of type 'System.Data.OleDb.OleDbException'
occurred in System.Data.dll
Additional information: External table is not in the expected format.
How can i solve that?
Your excel file is 2007 version, *.xlsx and you are using the wrong provider(Microsoft.Jet.OLEDB.4.0).
Try this approach:
var fileName = #"d:\1.xlsx";
var connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + fileName + ";Extended Properties=Excel 12.0;";
Its already answer the question in the past post Please follow the below link
Answer link
The answer is very simple
sConnection = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Test.xlsx;Extended Properties=\"Excel 12.0;HDR=No;IMEX=1\"";
you have diff version of Excel file, get the file name, if its extension is .xlsx, use this
var fileName = #"d:\1.xlsx";
var connectionString = string.Format(
"Provider=Microsoft.ACE.OLEDB.12.0;Data Source="{0}";Extended Properties=Excel 12.0;", fileName);
I would suggest this Libary called FileHelpers. Since discovering it i have never written the plumbing code myself. It lets you concentrate on the actual business logic.
I am trying to update some data in an Excel sheet of the format "xlsx" using OLEDB connection, but I am unable to make out the connection establishment.
Here is my code:
String sConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source='" + "D:\abc1.xlsx" + "';Extended Properties='Excel 8.0;HDR=Yes'";
OleDbConnection con = new OleDbConnection(sConnectionString);
con.Open();
OleDbCommand com = new OleDbCommand("select * from Sheet1",con);
OleDbDataReader reader = null;
reader = com.ExecuteReader();
while (reader.Read())
{
Console.WriteLine(reader[0]);
}
con.Open();
Console.ReadLine();
}
When I run the code, I'm facing the following exception:
The 'Microsoft.ACE.OLEDB.12.0' provider is not registered on the local
machine.
Any idea how to recover from this exception or any other suggestions from which i can update my data in excel is advisable.
This could be the provider you have stated try changing it to the one which matches the Excel version on your machine
Try
Provider=Microsoft.ACE.OLEDB.12.0;Data Source='D:\abc1.xlsx';Extended Properties="Excel 12.0 Xml;HDR=YES";
Instead
Could also be that excel isnt installed
Also check that you have referenced the OLEDB library for your project
Change your PlatformTarget Type from AnyCPU to X86.
Steps:
Goto Project Properties.
Select Build tab.
Select X86 from PlatformTarget options.
It is possible that there are multiple reasons for this exception.
1) You could use the OleDbEnumerator class to find out what providers are available.
Accordingly you set your connection string.
2) Before that just try out below connection string.
String sConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source='" + "D:\abc1.xlsx" + "';Extended Properties='Excel 8.0;HDR=Yes'";
3) If you have a 64 bit OS, there is no 64-bit version of the JET provider available and there's no alternative. As long as you want to support JET, you'll need to set the build target to x86.
first save as your excel workbook as Excel 97-2003 Workbook
It will work in my project...
string filepath = Server.MapPath("~/ImportData/") + fileUpload.FileName;
OleDbConnection oconn = new OleDbConnection
(#"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filepath + ";
Extended Properties=Excel 8.0");`
oconn.Open();
OleDbDataAdapter adp = new OleDbDataAdapter("select * from Sheet1", oconn);
DataSet ds = new DataSet();
adp.Fill(ds);
oconn.Close();`
When I try this code OleDBConnection.open() not work and didn't throw any error, just open windows form and say anything I see messageBox try1 but program didn't show try2 what is the wrong in my connection string please help I've tried also excel 12.0 but it looks in reference Excel 14.0 in References (Microsoft Excel 14.0 Object Library) and the file is exist in c:\product.xlsx
OleDbConnection conn_exel = new OleDbConnection(#"provider=Microsoft.Jet.OLEDB.12.0; Data Source=C:\product.xlsx; Extended Properties=""Excel 14.0;HDR=Yes;""");
conn_exel.Open();
MessageBox.Show("try2");
OleDbCommand command_exel = new OleDbCommand(#"SELECT * FROM [Sayfa1$] WHERE id = 1",conn_exel);
OleDbDataReader reader_exel = command_exel.ExecuteReader();
MessageBox.Show("try3");
while (reader_exel.Read())
{
MessageBox.Show(reader_exel.GetString(1));
}
conn_exel.Close();
Try like this
Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\myFolder\myExcel2007file.xlsx;
Extended Properties="Excel 12.0 Xml;HDR=YES";
"HDR=Yes;" indicates that the first row contains columnnames, not data. "HDR=No;" indicates the opposite.
reference
Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + PathNam + ";
Extended Properties=\"Excel 12.0;HDR=Yes;IMEX=2\"
http://www.nullskull.com/q/10173180/hello-would-you-explain-imex-option-when-import-excel.aspx
for IMEX usage
I need to programmatically read Microsoft Excel file from a specific path. The following code results in an error message I have never seen before
string sConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + Server.MapPath("Book1.xls") + ";" + "Extended Properties=Excel 12.0 Xml;HDR=Yes";
OleDbConnection con = new OleDbConnection(sConnectionString);
con.Open();
While opening the connection, the following error message is shown:
Could not find installable ISAM.
Does anybody have a solution related to this error? I would appreciate your help in this.
According to this question, you have to enclose the properties in quotes and make sure the path doesn't contain spaces.
Change your code to
string sConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + Server.MapPath("Book1.xls") + ";" + "Extended Properties='Excel 12.0 Xml;HDR=Yes'";