问题描述
本人用excel(xlsx)做数据源进行读取存储修改数据,添加或修改时时使用EPPlus进行操作,读取时用OleDbConnection类连接excel,使用sql语句查询,目前发现一旦使用EPPlus操作保存后,OleDbConnection类无法读取excel,报错“外部表不是预期的格式”,求大神指点源码:#region连接Excel读取Excel数据并返回DataSet数据集合///<summary>///连接Excel读取Excel数据并返回DataSet数据集合///</summary>///<paramname="filepath">Excel服务器路径</param>///<paramname="strCom">查询语句</param>///<paramname="table">表名</param>///<returns></returns>publicstaticSystem.Data.DataSetSqlConnection(stringfilepath,stringstrCom,stringtable){stringstrCon="Provider=Microsoft.ACE.OLEDB.12.0;DataSource="+filepath+";ExtendedProperties='Excel12.0;HDR=YES;IMEX=1'";OleDbConnectionExcelConn=newOleDbConnection(strCon);try{ExcelConn.Open();OleDbDataAdaptermyCommand=newOleDbDataAdapter(strCom,ExcelConn);DataSetds=newDataSet();myCommand.Fill(ds,table);ExcelConn.Close();returnds;}catch{ExcelConn.Close();returnnull;}}#endregion#region连接维修日志Excel并根据序号修改纪录///<summary>///连接维修日志Excel并根据序号修改纪录///</summary>///<paramname="data">数据字典</param>///<paramname="filepath">Excel服务器路径</param>///<paramname="id">序号</param>///<returns></returns>publicstaticintaddRLog(Dictionary<int,string>data,stringfilepath,intid){objectmissing=System.Reflection.Missing.Value;Microsoft.Office.Interop.Excel.Applicationexcel=newMicrosoft.Office.Interop.Excel.Application();excel.DisplayAlerts=false;excel.Visible=false;excel.UserControl=false;//不以只读的形式打开EXCEL文件stringstrCom=string.Format("SELECTCOUNT(*)FROM[Sheet1$]where序号="+id);DataSetds=SqlConnection(filepath,strCom,"RLog.xlsx");returnadd(data,filepath,1,10,id+1);}#endregion#region连接Excel并修改纪录///<summary>///连接Excel并修改纪录///</summary>///<paramname="data">数据字典</param>///<paramname="filepath">Excel服务器路径</param>///<paramname="index">字典索引</param>///<paramname="column">列索引</param>///<paramname="row">行索引</param>///<returns></returns>publicstaticintadd(Dictionary<int,string>data,stringfilepath,intindex,intcolumn,introw){try{ExcelPackagepackage=newExcelPackage(newFileInfo(filepath));ExcelWorksheetworksheet=package.Workbook.Worksheets[1];for(;index<column;index++)worksheet.Cells[row,index].Value=data[index].ToString();worksheet.Cells[row,1].Formula=data[1].ToString();package.SaveAs(newFileInfo(filepath));return1;}catch{return0;}}#endregion
解决方案
解决方案二:
我也遇到这种情况,处理方法是用另一种方法重新保存一下Excel文件就可以访问了。Microsoft.Office.Interop.Excel.ApplicationExcelApp=newMicrosoft.Office.Interop.Excel.Application();Microsoft.Office.Interop.Excel.WorkbookExcelDoc=ExcelApp.Workbooks.Open(“文件名”);ExcelDoc.Save();ExcelApp.Quit();
解决方案三:
要么都用微软官方插件,要么都用epplus,两者结合不是给自己找麻烦吗?和web结合的情况,尽量不用微软的com组件当某列数据中有混合类型时,在使用Microsoft.Jet.OLEDB.X.0来读取Excel文件造成数据丢失是不可避免的。COM组件读取Excel文件效率低,释放的时候经常碰到不可预知的错误,尤其是Web应用。建议看看EPPlus官方的源代码和例子,有很多和web有关的,效率很好。