今天在做一个excle数据导入的时候遇到了一个奇葩问题,项目使用的是MVC,在VS2010里面调试的时候没有问题,可是当发布到本地IIS或服务器上时就出现了问题:
1、excel文件正在被使用;
2、没有安装Microsoft.Jet.OLEDB.4.0。
后来找公司的前辈帮忙,发现这个Bug其实很好解决。
问题1的产生原因是打开的链接忘记关闭了,所以才会导致这个错误提示。
问题2的产生原因可能是因为32位和64位的原因,因为我的机子64位的,IIS的应用池没有允许【启用32位应用程序】,所以最后导致了这个问题。
最后,po段c#导入excel数据的代码:
public string ImportData() { if (Request.Files.Count > 0 && Request.Files[0].ContentLength > 0)
{ HttpPostedFileBase file = Request.Files[0]; string path = AppDomain.CurrentDomain.BaseDirectory + "Content\Upload\ItOperation"; string fileName = Path.GetFileNameWithoutExtension(file.FileName); string extension = Path.GetExtension(file.FileName); string newFileName = CurrentEmpCode + extension;//以当前时间命名另一份文件 if (file.ContentLength > 4194304)//不能超过4m { status = "'status:failed'"; name = "'name':'上传文件大小不能超过4M'"; ret = "{'error':1,'msg':'上传文件不能超过4M!'}"; } else { string otherFilePath = Path.Combine(path, newFileName); file.SaveAs(otherFilePath); DataTable dtSheetName = new ExcelHelper().GetSheetNames(otherFilePath); if (dtSheetName != null && dtSheetName.Rows.Count > 0) { string sheetName = dtSheetName.Rows[0]["TABLE_NAME"].ToString(); if (sheetName != "") { DataTable dt = LoadExcelDataToTable(otherFilePath, sheetName, extension); if (dt != null && dt.Rows.Count > 0) {
//...你的逻辑 } } } } } } public DataTable LoadExcelDataToTable(string path, string sheetName, string fileType) { string strConn = "";
if (fileType == ".xlsx")
{
strConn = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + path + ";" + "Extended Properties='Excel 12.0;HDR=YES;IMEX=1'";
} else if (fileType == ".xls") { strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + path + ";" + "Extended Properties="Excel 8.0;HDR=YES;IMEX=1""; } OleDbConnection conn = new OleDbConnection(strConn); DataTable dt = new DataTable(); try { conn.Open(); string strExcel = ""; OleDbDataAdapter myCommand = null; strExcel = "select * from [" + sheetName + "]"; myCommand = new OleDbDataAdapter(strExcel, strConn); myCommand.Fill(dt); } catch { dt = null; } finally { conn.Close(); } return dt; }