C# 将数据从Excel插入数据库
我有一个excel工作表,我想要的是我想上传到数据库表的excel工作表记录。但在这方面C# 将数据从Excel插入数据库,c#,asp.net,excel,C#,Asp.net,Excel,我有一个excel工作表,我想要的是我想上传到数据库表的excel工作表记录。但在这方面 Emp\u代码是标识 Qns是身份 我试着像下面一样 protected void btnUpload_Click(object sender, EventArgs e) { DataTable dtExcel = new DataTable(); dtExcel.Clear(); string StrCount = String.Empty; string connStri
Emp\u代码
是标识Qns
是身份protected void btnUpload_Click(object sender, EventArgs e)
{
DataTable dtExcel = new DataTable();
dtExcel.Clear();
string StrCount = String.Empty;
string connString = "";
HttpPostedFile File = FileUpload1.PostedFile;
string strFileType = Path.GetExtension(FileUpload1.FileName).ToLower();
string path = FileUpload1.PostedFile.FileName;
string Filename = path.Substring(path.LastIndexOf("\\") + 1, path.Length - path.LastIndexOf("\\") - 1);
path = Server.MapPath(@"~/Excels/" + "/" + Filename.ToString());
File.SaveAs(path);
if (strFileType.Trim() == ".xls")
{
connString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + path + ";Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=2\"";
// connString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties=\"Excel 12.0;HDR=Yes;IMEX=2\"";
}
else if (strFileType.Trim() == ".xlsx")
{
connString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties=\"Excel 12.0;HDR=Yes;IMEX=2\"";
}
string query = "SELECT * FROM [Sheet 1$]";
OleDbConnection conn = new OleDbConnection(connString);
conn.Close();
if (conn.State == System.Data.ConnectionState.Closed)
conn.Open();
OleDbCommand cmd = new OleDbCommand(query, conn);
OleDbDataAdapter daExcel = new OleDbDataAdapter(cmd);
StringBuilder StrPubBldg = new System.Text.StringBuilder();
XmlWriter xw = XmlWriter.Create(StrPubBldg);
string ExcelfileName = Path.GetFileName(FileUpload1.PostedFile.FileName);
xw.WriteStartElement("DocumentElement");
{
xw.WriteStartElement("Emp_Eval_Proc_hdr");
xw.WriteElementString("mkey", (0 + 1).ToString());
xw.WriteElementString("Emp_Code", dtExcel.Rows[1][("Emp Code")].ToString()); // Identity
xw.WriteElementString("Emp_Name", dtExcel.Rows[2][("Emp Name")].ToString());
xw.WriteElementString("Qns_No", dtExcel.Rows[3][("Qns No")].ToString()); // Identity
xw.WriteElementString("Self", dtExcel.Rows[0][("Self")].ToString());
xw.WriteElementString("AS1", dtExcel.Rows[0][("AS1")].ToString());
}
但得到的错误是
位置1处没有行
如何做???dtExcel,您创建了一个新的数据表,然后立即清除它,然后尝试访问数据。你应该遵循这个概念模型。它不必精确,原则是将数据加载到最小的容器中,对于这个容器,它是一个DataTable,检查是否有行,然后根据需要进行迭代 根据海报要求,移除第一个代码样本,替换为新样本
using System.Data;
using System.Data.OleDb;
using System.Text;
using System.Xml;
namespace Example
{
/// <summary>
/// Create instance of this class,
/// pass in file name and if excel sheet has headers e.g. YES or NO
/// execute Work method, is currently incomplete
/// </summary>
public class StackOverFlowDemo
{
private string CreateConnectionString(string FileName, string Header)
{
OleDbConnectionStringBuilder Builder = new OleDbConnectionStringBuilder();
if (System.IO.Path.GetExtension(FileName).ToUpper() == ".XLS")
{
Builder.Provider = "Microsoft.Jet.OLEDB.4.0";
Builder.Add("Extended Properties", string.Format("Excel 8.0;IMEX=2;HDR={0};", Header));
}
else
{
Builder.Provider = "Microsoft.ACE.OLEDB.12.0";
Builder.Add("Extended Properties", string.Format("Excel 12.0;IMEX=2;HDR={0};", Header));
}
Builder.DataSource = FileName;
return Builder.ConnectionString;
}
public string ConnectionString { get; set; }
public StackOverFlowDemo(string FileName, string Header)
{
ExcelTable = new DataTable();
CreateConnectionString(FileName, Header);
LoadData();
}
public DataTable ExcelTable { get; set; }
public void LoadData()
{
using (OleDbConnection cn = new OleDbConnection { ConnectionString = ConnectionString })
{
cn.Open();
using (OleDbCommand cmd = new OleDbCommand { CommandText = "SELECT * FROM [Sheet 1$]", Connection = cn })
{
OleDbDataReader dr = cmd.ExecuteReader();
ExcelTable.Load(dr);
}
}
}
public void Work()
{
StringBuilder StrPubBldg = new System.Text.StringBuilder();
XmlWriter xw = XmlWriter.Create(StrPubBldg);
// continue logic
}
}
}
使用系统数据;
使用System.Data.OleDb;
使用系统文本;
使用System.Xml;
名称空间示例
{
///
///创建该类的实例,
///输入文件名以及excel工作表是否有标题,例如是或否
///执行工作方法,当前不完整
///
公共类StackOverFlowDemo
{
私有字符串CreateConnectionString(字符串文件名、字符串头)
{
OleDbConnectionStringBuilder=新的OleDbConnectionStringBuilder();
if(System.IO.Path.GetExtension(FileName.ToUpper()=“.XLS”)
{
Builder.Provider=“Microsoft.Jet.OLEDB.4.0”;
Add(“扩展属性”,string.Format(“Excel8.0;IMEX=2;HDR={0};”,标头));
}
其他的
{
Builder.Provider=“Microsoft.ACE.OLEDB.12.0”;
Add(“扩展属性”,string.Format(“Excel12.0;IMEX=2;HDR={0};”,标头));
}
Builder.DataSource=文件名;
返回Builder.ConnectionString;
}
公共字符串连接字符串{get;set;}
公共StackOverFlowDemo(字符串文件名、字符串头)
{
ExcelTable=新数据表();
CreateConnectionString(文件名、标题);
LoadData();
}
公共数据表ExcelTable{get;set;}
公共void LoadData()
{
使用(OleDbConnection cn=new-OleDbConnection{ConnectionString=ConnectionString})
{
cn.Open();
使用(OleDbCommand cmd=new-OleDbCommand{CommandText=“SELECT*FROM[Sheet 1$]”,Connection=cn})
{
OleDbDataReader dr=cmd.ExecuteReader();
卓越负荷(dr);
}
}
}
公共工程()
{
StringBuilder StrPubBldg=new System.Text.StringBuilder();
XmlWriter xw=XmlWriter.Create(strpubldg);
//继续逻辑
}
}
}
这是一项重复性任务还是仅仅一次?这将是一项重复性任务。。!!如果某些数据存在的记录可能为,则该记录将被更新。如果excel工作表只有一行,则您将获得该记录error@RachitPatel:我有很多行,但目前数据是3列的数据。我只是想测试数据是否被插入。你能根据我的代码修改一下吗?对不起