Introduction
Generally, most of the time, we work on Excel import functionality in our web application. As per our requirement, we import data from an Excel (.xls or .xlsx) file and read the data from Excel file through OLEDB connection and assign in a datatable. So when I developed the application in my local machine and implemented the Excel import functionality, I did not get any issue in debug time. But when I hosted my application in IIS, I got an error message like "The 'Microsoft.Jet.OLEDB.4.0' provider is not registered on the local machine". I Googled it, but I did not get the exact solution and most of the solutions are related to changing the application build target platform from any CPU to 86. Yes, I also tried a lot with the above solutions, but does not work for me. But when I changed some IIS level configuration, the issue was resolved. Let me explain it briefly.
Using the Code
In the below code, I am just trying to upload one .xls file and trying to fetch the tabular data from Excel file and assigning to a datatable. Let me share my code here.
try
{
string FileToConvert = Server.MapPath(".") + "MyImportFile.xls";
if (fuUploadFile.HasFile)
{
fuUploadFile.SaveAs(FileToConvert);
dtExcelData = new DataTable();
HDR = hasHeaders ? "Yes" : "No";
if (filePath.Substring(filePath.LastIndexOf('.')).ToLower() == ".xlsx")
{
strCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" +
filePath + ";Extended Properties=\"Excel 12.0;HDR=" +
HDR + ";IMEX=0\"";
}
else
{
strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +
filePath + ";Extended Properties=\"Excel 8.0;HDR=" +
HDR + ";IMEX=0\"";
}
using(OleDbConnection conn = new OleDbConnection(strCon))
{
conn.Open();
DataTable schemaTable = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables,
new object[] { null, null, null, "TABLE" });
DataRow schemaRow = schemaTable.Rows[0];
string sheet = schemaRow["TABLE_NAME"].ToString();
if (!sheet.EndsWith("_"))
{
string query = "SELECT * FROM [" + sheet + "]";
OleDbDataAdapter daexcel = new OleDbDataAdapter(query, conn);
dtExcelData.Locale = CultureInfo.CurrentCulture;
daexcel.Fill(dtExcelData);
}
dtExcelData = dtExcelData.AsEnumerable().Where(row =>
!row.ItemArray.All(f => f is System.DBNull || String.IsNullOrEmpty(f.ToString())))
.CopyToDataTable();
}
}
else
{
Trace.Write("ReadFromExcelFile", "No file was uploaded");
}
}
catch (Exception ex)
{
}
Let Me Share My Error As Well
When I deployed my application in IIS and tried to import a .xls file, I got the below error:
Unhandled Exception in /MyWeb/ExportWeb:
Type: InvalidOperationException
Message: The 'Microsoft.Jet.OLEDB.4.0' provider is not registered on the local machine.
Exception stack trace(s):
at System.Data.OleDb.OleDbServicesWrapper.GetDataSource
(OleDbConnectionString constr, DataSourceWrapper& datasrcWrapper)
at System.Data.OleDb.OleDbConnectionInternal..ctor
(OleDbConnectionString constr, OleDbConnection connection)
at System.Data.OleDb.OleDbConnectionFactory.CreateConnection
(DbConnectionOptions options,
Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningObject)
at System.Data.ProviderBase.DbConnectionFactory.CreateNonPooledConnection
(DbConnection owningConnection, DbConnectionPoolGroup poolGroup)
at System.Data.ProviderBase.DbConnectionFactory.GetConnection
(DbConnection owningConnection)
at System.Data.ProviderBase.DbConnectionClosed.OpenConnection
(DbConnection outerConnection, DbConnectionFactory connectionFactory)
at System.Data.OleDb.OleDbConnection.Open()
Event information:
Event code: 106660
Event message: The 'Microsoft.Jet.OLEDB.4.0' provider is not registered on the local machine.
Event time: 09/11/2015 10:25:07
Event ID: 7eba2342sdfdf3423423
So Here is the Solution
- Just go to the IIS and check your application pool.
- Select the application pool and click on the "Advanced Settings" of the selected application pool.
- Then change the property "Enable 32-Bit Applications" to True.
So after changing it, my import functionality works fine for me.