c#读取excel到dataset产生:未指定的错误 异常!
我用单例构造了一个读取excel到dataset的类。CExcelHelper,类里面提供如下读取excel到dataset的方法
/// <summary> /// 将excel中指定sheet内容读入dataset /// </summary> /// <param name="fileName">excel文件路径</param> /// <param name="sheetNames">需从excel中读取的sheet名称</param> /// <returns></returns> public DataSet TransExcelToDataSet(string fileName, List<string> sheetNames) { OleDbConnection objConn = null; DataSet data = new DataSet(); try { //创建读取excel连接 string strConn = "Provider=Microsoft.Jet.OleDb.4.0;" + "data source=" + fileName + ";Extended Properties='Excel 8.0; HDR=YES; IMEX=1'"; objConn = new OleDbConnection(strConn); objConn.Open(); OleDbDataAdapter sqlada = new OleDbDataAdapter(); //遍历从配置文件中读取的sheet名称 foreach (string sheetName in sheetNames) { string strSql = "select * From [" + sheetName.Trim() + "$]"; OleDbCommand objCmd = new OleDbCommand(strSql, objConn); sqlada.SelectCommand = objCmd; //填充dataset sqlada.Fill(data, sheetName); } } catch (Exception e) { throw new Exception("将excel中指定sheet内容读入dataset出错!"+e.Message); } finally { if (objConn != null) { objConn.Dispose(); objConn.Close(); } } return data; }
异常信息如下:
将excel中指定sheet内容读入dataset出错!
未指定的错误
fileName: D:\Project\ReportHBSys资料\Publish\DataReceive\RelationData\ImportRelationData\012\201010\核销报表.xls ; sheetName:
(1)把路径中所有的中文去掉。没看到你的filename怎么来的,如果用户上传的,并通过QueryString这样的URL部分进行传输,要进行编码,以避免#这样的符号以及一些中文不能被正确处理。
(2)在IIS中设置应用程序池用户凭据为System试试,以确认是否权限问题。除了文件权限,使用OLE数据引擎,也需要权限。若IIS没有应用程序池,就将ASPNET账号设为管理员组。
[解决办法]
我遇到过一个问题,我的Excel 是从管家婆软件中导出来的,在导入SQL Server 2005 时,导入失败,必须打开再保存一次。才能够正常导入。不知道对你有没有帮助。
public DataSet GetUserInfoFromExcel(out string ErrMsg) { try { ErrMsg = ""; OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.Filter = "Excel files(*.xls)|*.xls"; string conn = Global.g_SqlConnStr;//数据库联接字符串 if (openFileDialog.ShowDialog() == DialogResult.OK) { FileInfo fileInfo = new FileInfo(openFileDialog.FileName); string filePath = fileInfo.FullName;//获取所打开的文件的全路径 //判断当前Excel是否是员工信息的Excel if (!fileInfo.Name.Contains("内部职员数据")) { MessageBox.Show("当前选择的Excel文件不是员工信息文件"); return; } string connExcel = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filePath + ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=1'"; #region 解决管家导出的excel数据必须打开再保存才能导入的问题 //创建Application对象 Microsoft.Office.Interop.Excel.Application xApp = new Microsoft.Office.Interop.Excel.ApplicationClass(); //xApp.Visible = true; //得到WorkBook对象, 可以用两种方式之一: 下面的是打开已有的文件 Microsoft.Office.Interop.Excel.Workbook xBook = xApp.Workbooks._Open(filePath, Missing.Value, Missing.Value, Missing.Value, Missing.Value , Missing.Value, Missing.Value, Missing.Value, Missing.Value , Missing.Value, Missing.Value, Missing.Value, Missing.Value); Microsoft.Office.Interop.Excel.Worksheet xSheet = (Microsoft.Office.Interop.Excel.Worksheet)xBook.Sheets[1]; //保存方式一:保存WorkBook //xBook.SaveAs(filePath, //Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, //Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, Missing.Value, Missing.Value, Missing.Value, //Missing.Value, Missing.Value); //xSheet = null; string sheetname = ""; sheetname = xSheet.Name.Trim() + "$"; xBook = null; xApp.Quit(); //这一句是非常重要的,否则Excel对象不能从内存中退出 xApp = null; #endregion OleDbConnection oleDbConnection = new OleDbConnection(connExcel); oleDbConnection.Open();//打开数据库连接 //获取excel表 System.Data.DataTable dataTable = oleDbConnection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); //获取sheet名,其中[0][1]...[N]: 按名称排列的表单元素 //string tableName = dataTable.Rows[0][2].ToString().Trim(); string tableName = sheetname.Trim(); tableName = "[" + tableName.Replace("'", "") + "]"; //利用SQL语句从Excel文件里获取数据 string query = "SELECT * FROM " + tableName; DataSet dataSet = new DataSet(); OleDbDataAdapter oleAdapter = new OleDbDataAdapter(query, connExcel); oleAdapter.Fill(dataSet, "Employee_Info");return dataSet;} } catch (Exception ex) { ErrMsg = ex.Message; } }