.Net MVC将Excel导入数据库中的问题

asdcm2009 2014-12-18 11:27:04
最新在用.Net MVC做一个项目,其中有一个模块需要将Excel中的数据批量导入到数据库中。我采用的是Oledb方式,根据网上的提示,我先将Excel中的数据读取到DataTable中,然后将DataTable中的数据插入到数据库中。测试同一份Excel文件导入时偶尔会发生异常(大多数时候成功),先将部分代码发布如下:
(1)将Excel中的数据读取到DataTable中:

public static DataTable GetTableFromExcel(string sheetName, string filePath)
{
string connStrTemplate = "";
filePath = HttpContext.Current.Server.MapPath(filePath);
string fileType = System.IO.Path.GetExtension(filePath);
if (string.IsNullOrEmpty(fileType)) return null;
if (fileType == ".xls")
connStrTemplate = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filePath + ";Extended Properties='Excel 8.0;HDR=YES;IMEX=1'";
else
connStrTemplate = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filePath + ";Extended Properties='Excel 12.0;HDR=YES;IMEX=1'";
DataTable dt = null;
if (!System.IO.File.Exists(filePath))
{
// don't find file
return null;
}
OleDbConnection conn = new OleDbConnection(connStrTemplate);
try
{
conn.Open();
if (sheetName == null || sheetName.Trim().Length == 0)
{
DataTable schemaTable = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
sheetName = schemaTable.Rows[0]["TABLE_NAME"].ToString().Trim();
}
else
{
sheetName += "$";
}

string strSQL = "Select * From [" + sheetName + "]";
OleDbDataAdapter da = new OleDbDataAdapter(strSQL, conn);
DataSet ds = new DataSet();
da.Fill(ds);
dt = ds.Tables[0];
}
catch (Exception ex)
{
throw ex;//这里偶尔会抛出异常,但是对同一份Excel文件,大多数时候是正确的
}
finally
{ // 关闭连接
if (conn.State == ConnectionState.Open)
{
conn.Close();
conn.Dispose();
}
}
return dt;
}


经过多次测试调试发现抛出的异常信息如下:


用户代码未处理 System.Data.OleDb.OleDbException
HResult=-2147467259
Message=外部表不是预期的格式。
Source=Microsoft Access Database Engine
ErrorCode=-2147467259
StackTrace:
在 RecruitProject.Util.ParseXlsx.GetTableFromExcel(String sheetName, String filePath) 位置 f:\workspace\MVCProject\RecruitProject\RecruitProject\Util\ParseXlsx.cs:行号 55
在 RecruitProject.Util.ParseXlsx.NormalToDb(String filePath) 位置 f:\workspace\MVCProject\RecruitProject\RecruitProject\Util\ParseXlsx.cs:行号 76
在 RecruitProject.Controllers.JobController.AutoAdd(Nullable`1 category) 位置 f:\workspace\MVCProject\RecruitProject\RecruitProject\Controllers\JobController.cs:行号 76
在 lambda_method(Closure , ControllerBase , Object[] )
在 System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters)
在 System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters)
在 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters)
在 System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass42.<BeginInvokeSynchronousActionMethod>b__41()
在 System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass8`1.<BeginSynchronous>b__7(IAsyncResult _)
在 System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.End()
在 System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult)
在 System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass37.<>c__DisplayClass39.<BeginInvokeActionMethodWithFilters>b__33()
在 System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass4f.<InvokeActionMethodFilterAsynchronously>b__49()
InnerException:

由于异常并不是每次都出现,所以发布的信息可能有些少。
希望有遇到过这种情况的大侠能给些提示,感激不尽!
...全文
411 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Anymore 2015-08-24
  • 打赏
  • 举报
回复
换NPOI方法试试看看问题重复不,感觉问题还是在excel文件本身。
  • 打赏
  • 举报
回复
我遇到 是列宽不够!把一些内容隐藏了!出现相同的列头,不同的数据就会报错!把列宽双击变宽就ok了!
xinxin_1741694057 2014-12-19
  • 打赏
  • 举报
回复
C#批量将Excel文档导入到数据库中示例 //批量导出Excel数据事件按钮 private void btn_Export_Click(object sender, EventArgs e) { string[] P_str_Names = txt_Path.Text.Split(',');//存储所有选择的Excel文件名 string P_str_Name = "";//存储遍历到的Excel文件名 List<string> P_list_SheetNames = new List<string>();//实例化泛型集合对象,用来存储工作表名称 for (int i = 0; i < P_str_Names.Length - 1; i++)//遍历所有选择的Excel文件名 { P_str_Name = P_str_Names[i];//记录遍历到的Excel文件名 P_list_SheetNames = GetSheetName(P_str_Name);//获取Excel文件中的所有工作表名 for (int j = 0; j < P_list_SheetNames.Count; j++)//遍历所有工作表 { if (rbtn_Access.Checked)//判断Access数据库连接设置单选按钮选中 { ImportDataToAccess(P_str_Name, P_list_SheetNames[j]);//将将工作表内容导出到Access } else if (rbtn_Sql.Checked)//判断Sql Server数据库连接设置单选按钮选中 { if (ckbox_Windows.Checked)//如果用Windows身份验证登录Sql Server ImportDataToSql(P_str_Name, P_list_SheetNames[j], "Data Source=" + txt_Server.Text + ";Initial Catalog =" + cbox_Server.Text + ";Integrated Security=SSPI;");//将工作表内容导出到Sql Server else if (ckbox_SQL.Checked)//如果用Sql Server身份验证登录Sql Server ImportDataToSql(P_str_Name, P_list_SheetNames[j], "Data Source=" + txt_Server.Text + ";Database=" + cbox_Server.Text + ";Uid=" + txt_Name.Text + ";Pwd=" + txt_Pwd.Text + ";");//将工作表内容导出到Sql Server } } } MessageBox.Show("已经将所有选择的Excel工作表导入到了指定的数据库中!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); } //获取工作表名称将其存储到List泛型集合中 private List<string> GetSheetName(string P_str_Excel)//获取所有工作表名称 { List<string> P_list_SheetName = new List<string>();//实例化泛型集合对象 //连接Excel数据库 OleDbConnection olecon = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + P_str_Excel + ";Extended Properties=Excel 8.0"); olecon.Open();//打开数据库连接 System.Data.DataTable DTable = olecon.GetSchema("Tables");//实例化表对象 DataTableReader DTReader = new DataTableReader(DTable);//实例化表读取对象 while (DTReader.Read())//循环读取 { string P_str_Name = DTReader["Table_Name"].ToString().Replace('$', ' ').Trim();//记录工作表名称 if (!P_list_SheetName.Contains(P_str_Name))//判断泛型集合中是否已经存在该工作表名称 P_list_SheetName.Add(P_str_Name);//将工作表名添加到泛型集合中 } DTable = null;//清空表对象 DTReader = null;//清空表读取对象 olecon.Close();//关闭数据库连接 return P_list_SheetName;//返回得到的泛型集合 }
asdcm2009 2014-12-18
  • 打赏
  • 举报
回复
很难进行调试,由于每次是否成功不确定,有时候成功,有时候失败。这个不是连接字符串的问题,Excel是我自己新建的的,没有问题,03和07是根据后缀名进行判断的
jhdxhj 2014-12-18
  • 打赏
  • 举报
回复
能否进行调试呢?
moonwrite 2014-12-18
  • 打赏
  • 举报
回复
搜索: 外部表不是预期的格式 http://www.cnblogs.com/kingkongv/archive/2012/08/26/2657436.html

111,092

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧