2015-12-29 4 views
0

У меня есть лист Excel, я хочу, чтобы я загрузил запись листа excel в таблицу базы данных. Но в этомВставьте данные из Excel в базу данных

  1. Emp_Code является удостоверением

  2. 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.

Как это сделать ??

+0

это повторяющиеся задачи или только один раз? –

+0

будет повторяющейся задачей .. !! он будет обновлен, если запись для некоторых данных существует – BNN

+0

может быть, Если у вас на листе листа есть только строка, вы получите эту ошибку. –

ответ

0

dtExcel, вы создали новый DataTable, а затем сразу же очистили его, а затем попытались получить доступ к данным. Вам следует следовать этой концептуальной модели. Это не должно быть точным, принцип заключается в том, чтобы загрузить данные в самый маленький контейнер, который для этого является 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 
     } 
    } 
} 
+0

Можете ли вы изменить немного в соответствии с моим кодом? простите за это – BNN

Смежные вопросы