把Excel工作表中数据导入数据库

发布网友 发布时间:2022-04-19 17:42

我来回答

2个回答

懂视网 时间:2022-04-08 02:36

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 using System.Web.UI;
 6 using System.Web.UI.WebControls;
 7 using System.Data;
 8 using System.Data.OleDb;
 9 using System.Configuration;
 10 using System.Data.SqlClient;
 11 
 12 namespace InExcelOutExcel
 13 {
 14 public partial class ExcelToDB : System.Web.UI.Page
 15 {
 16  protected void Page_Load(object sender, EventArgs e)
 17  {
 18  FileSvr fileSvr = new FileSvr();
 19  System.Data.DataTable dt = fileSvr.GetExcelDatatable("C:\Users\NewSpring\Desktop\Demo\InExcelOutExcel\InExcelOutExcel\excel\ExcelToDB.xlsx", "mapTable");
 20  fileSvr.InsetData(dt);
 21  }
 22 }
 23 class FileSvr
 24 {
 25  /// <summary>
 26  /// Excel数据导入Datable
 27  /// </summary>
 28  /// <param name="fileUrl"></param>
 29  /// <param name="table"></param>
 30  /// <returns></returns>
 31  public System.Data.DataTable GetExcelDatatable(string fileUrl, string table)
 32  {
 33  //office2007之前 仅支持.xls
 34  //const string cmdText = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=‘Excel 8.0;IMEX=1‘;";
 35  //支持.xls和.xlsx,即包括office2010等版本的 HDR=Yes代表第一行是标题,不是数据;
 36  const string cmdText = "Provider=Microsoft.Ace.OleDb.12.0;Data Source={0};Extended Properties=‘Excel 12.0; HDR=Yes; IMEX=1‘";
 37 
 38  System.Data.DataTable dt = null;
 39  //建立连接
 40  OleDbConnection conn = new OleDbConnection(string.Format(cmdText, fileUrl));
 41  try
 42  {
 43   //打开连接
 44   if (conn.State == ConnectionState.Broken || conn.State == ConnectionState.Closed)
 45   {
 46   conn.Open();
 47   }
 48 
 49 
 50   System.Data.DataTable schemaTable = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
 51 
 52   //获取Excel的第一个Sheet名称
 53   string sheetName = schemaTable.Rows[0]["TABLE_NAME"].ToString().Trim();
 54 
 55   //查询sheet中的数据
 56   string strSql = "select * from [" + sheetName + "]";
 57   OleDbDataAdapter da = new OleDbDataAdapter(strSql, conn);
 58   DataSet ds = new DataSet();
 59   da.Fill(ds, table);
 60   dt = ds.Tables[0];
 61 
 62   return dt;
 63  }
 64  catch (Exception exc)
 65  {
 66   throw exc;
 67  }
 68  finally
 69  {
 70   conn.Close();
 71   conn.Dispose();
 72  }
 73 
 74  }
 75 
 76  /// <summary>
 77  /// 从System.Data.DataTable导入数据到数据库
 78  /// </summary>
 79  /// <param name="dt"></param>
 80  /// <returns></returns>
 81  public int InsetData(System.Data.DataTable dt)
 82  {
 83  int i = 0;
 84  string lng = "";
 85  string lat = "";
 86  string offsetLNG = "";
 87  string offsetLAT = "";
 88 
 89  foreach (DataRow dr in dt.Rows)
 90  {
 91   lng = dr["LNG"].ToString().Trim();
 92   lat = dr["LAT"].ToString().Trim();
 93   offsetLNG = dr["OFFSET_LNG"].ToString().Trim();
 94   offsetLAT = dr["OFFSET_LAT"].ToString().Trim();
 95 
 96   //sw = string.IsNullOrEmpty(sw) ? "null" : sw;
 97   //kr = string.IsNullOrEmpty(kr) ? "null" : kr;
 98 
 99   string strSql = string.Format("Insert into DBToExcel (LNG,LAT,OFFSET_LNG,OFFSET_LAT) Values (‘{0}‘,‘{1}‘,{2},{3})", lng, lat, offsetLNG, offsetLAT);
100 
101   string strConnection = ConfigurationManager.ConnectionStrings["ConnectionStr"].ToString();
102   SqlConnection sqlConnection = new SqlConnection(strConnection);
103   try
104   {
105   // SqlConnection sqlConnection = new SqlConnection(strConnection);
106   sqlConnection.Open();
107   SqlCommand sqlCmd = new SqlCommand();
108   sqlCmd.CommandText = strSql;
109   sqlCmd.Connection = sqlConnection;
110   SqlDataReader sqlDataReader = sqlCmd.ExecuteReader();
111   i++;
112   sqlDataReader.Close();
113   }
114   catch (Exception ex)
115   {
116   throw ex;
117   }
118   finally
119   {
120   sqlConnection.Close();
121 
122   }
123   //if (opdb.ExcSQL(strSql))
124   // i++;
125  }
126  return i;
127  }
128 }
129 }



运行结果:

技术分享

将Excle数据导入到数据库

标签:

热心网友 时间:2022-04-07 23:44

这是第二次了,市场部那边又来要求改数据。他们要改的是数据库某张表中类似商品价格等的数据,需要改的地方又多,我们上次是靠新来的兄弟一个个给Update进去的,这次老大去教了他们Update语句,把烦人的皮球踢给他们了。但这样一个个更新很明显不是办法,我想通过excel直接把数据导入数据库应该是可行的吧,就开始找方法了。
我想至少有这样两种比较容易实现的方法:
1、直接用Sql语句查询
2、先用excle中的数据生成xml文件,再把xml导入数据库
第一种方法(方法二以后再试),找到联机丛书里实现此功能的Sql语句如下:
SELECT* FROMOpenDataSource('Microsoft.Jet.OLEDB.4.0', 'DataSource="c:Financeaccount.xls";UserID=Admin;Password=;Extendedproperties=Excel5.0')…xactions
语句是有了,但我还是试了很久,因为各个参数具体该怎么设置它没有说。Data Source就是excel文件的路径,这个简单;UserId、Password和Extended properties这三个属性我改成了各种各样的与本机有关的用户名、密码以及excel版本都不对,最后用上面例子里的值“User ID=Admin;Password=;Extended properties=Excel 5.0”才成功了,晕啊;最后个“xactions”更是查了很多资料,其实就仅仅是excel文件里所选的工作表名而已,怪我对excel不够熟悉了,另外注意默认的Sheet1要写成[Sheet1$]
最后,看看我成功的测试
数据库里建好一个表testTable_1,有5个字段id, name, date, money, content,C盘下book1.xls文件的sheet1工作表里写好对应的数据并设好数据类型,执行如下插入语句:
insertintotestTable_1([name],[date],[money],[content]) Select[姓名],[日期],[金额],[内容] FROMOpenDataSource('Microsoft.Jet.OLEDB.4.0', 'DataSource="C:Book1.xls"; UserID=Admin;Password=;Extendedproperties=Excel5.0')…[Sheet1$]
select里的列名我一开始用*代替,但发现输出顺序与我预期的不同,是“金额、内容、日期、姓名”,不知道具体有什么规律,就老老实实写名字了。操作成功
回过头来看看市场部的要求,假设在我这张表里实现,可以先判断如excel里存在与记录相同的name字段(name要唯一非空)时就删除记录,之后再插入,这样简单,但自增的id字段会因为插入而改变,那是不行的了。可行的方法是先读出excel里全部记录,然后用游标一条条分析,如果存在这个name就更新否则就插入。OK,下次就不用让他们再对着文档一条条Update了
声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:11247931@qq.com