2012-11-27 36 views
1

嗨即時通訊Oledb插入數據到多個文本框的Excel工作表。我遇到的問題是,它不會像excel那樣進入excel,而是字符串,所以grpah不能在日期自動執行。 我如何將數值類型插入到Excel中的值?我嘗試將文本框轉換爲int,但沒有運氣。從c#文本框插入數據到excel

我的代碼如下。

string szConn = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=L://Metrics_gen.xlsx;Extended Properties='Excel 8.0;HDR=YES;'"; 
      OleDbConnection conn = new OleDbConnection(szConn); 
      int v1 = Convert.ToInt32(textBox1.Text); 
      int v2 = Convert.ToInt32(textBox2.Text); 
      int v3 = Convert.ToInt32(textBox3.Text); 
      int v4 = Convert.ToInt32(textBox4.Text); 
      int v5 = Convert.ToInt32(textBox5.Text); 


      conn.Open(); 
      OleDbCommand cmd = new OleDbCommand("INSERT INTO [Sheet1$]([Total],[Closed],[Issues],[Cancelled],[Back out]) VALUES('" + v1 + "','" + v2 + "','" + v3 + "','" + v4 + "','" + v5 + "')", conn); 
      cmd.ExecuteNonQuery(); 


      conn.Close(); 
      MessageBox.Show("complete"); 
+0

這可能會幫助你:http://stackoverflow.com/questions/908416/using-oledb-microsoft-jet-driver-causes-number-stored-as-text-in-excel-file –

+0

@stefan你能嗎請檢查我給你的問題的答案,驗證它是否有效,如果有問題,請接受它?乾杯:-) –

回答

1

問題在於,在構建insert命令時將整數轉換爲字符串文字。請看下圖:

OleDbCommand cmd = new OleDbCommand("INSERT INTO [Sheet1$]([Total],[Closed],[Issues],[Cancelled],[Back out]) VALUES('" + v1 + "','" + v2 + "','" + v3 + "','" + v4 + "','" + v5 + "')", conn); 

更改了該行進入:

OleDbCommand cmd = new OleDbCommand("INSERT INTO [Sheet1$]([Total],[Closed],[Issues],[Cancelled],[Back out]) VALUES(" + v1 + "," + v2 + "," + v3 + "," + v4 + "," + v5 + ")", conn); 

這應該解決所有的問題:-)

注:手工構建SQL是容易出錯。整數是你最擔心的問題。想象一下,嘗試插入一個恰好包含單引號字符(')的字符串,當您將文化設置爲逗號作爲小數點分隔符,日期等等時,則爲浮點數。就個人而言,我更喜歡使用諸如EPPlus(XLSX)和ExcelLibrary(XLS)之類的庫。兩者都是LGPL許可的,並且給你比目前使用的方法更大的靈活性。他們不需要在計算機上安裝Excel,這使其成爲服務器端Excel報表生成的理想選擇。而且,它們有助於避免各種內存泄漏問題,這些解決方案通常會使用Microsoft Office Interop。

0

此代碼片段幫助我處理C#中的Excel電子表格,特別是輸入數字行,然後生成該數據的總和。如果您在將數據加載到excel後處理代碼中的行,請確保您忽略了標題行,這應該是顯而易見的,但只是在此提及它,以防出現問題。

以下代碼需要聲明 - 使用Excel = Microsoft.Office.Interop.Excel;

 Excel.Application oXL; 
     Excel.Workbook oWB; 
     Excel.Worksheet oSheet; 
     Excel.Range oRange; 

      var filepath = "/somefilepath"; 


      // Start Excel and get Application object. 
      oXL = new Excel.Application(); 

      // Set some properties 
      oXL.Visible = true; 
      oXL.DisplayAlerts = false; 

      // Get a new workbook. 
      oWB = oXL.Workbooks.Add(Missing.Value); 

      // Get the Active sheet 
      oSheet = (Excel.Worksheet)oWB.ActiveSheet; 
      oSheet.Name = "Data"; 

      int rowCount = 1; 
      string strExpr; 
      string strSort; 


      foreach (DataRow dr in dt.Rows) 
      { 
       rowCount += 1; 
       for (int i = 1; i < dt.Columns.Count + 1; i++) 
       { 
        // Add the header the first time through 
        if (rowCount == 2) 
        { 
         oSheet.Cells[1, i] = dt.Columns[i - 1].ColumnName; 
        } 
        oSheet.Cells[rowCount, i] = dr[i - 1].ToString(); 
       } 
      } 
      //Freze the first row 
      oSheet.Application.ActiveWindow.SplitRow = 1; 
      oSheet.Application.ActiveWindow.FreezePanes = true; 

      // Resize the columns 
      oRange = oSheet.get_Range(oSheet.Cells[1, 1], 
          oSheet.Cells[rowCount, dt.Columns.Count]); 
      oRange.EntireColumn.AutoFit(); 

      // Save the sheet and close 
      oSheet = null; 
      oRange = null; 
      oWB.SaveAs(filepath, Excel.XlFileFormat.xlWorkbookNormal, 
       Missing.Value, Missing.Value, Missing.Value, Missing.Value, 
       Excel.XlSaveAsAccessMode.xlExclusive, 
       Missing.Value, Missing.Value, Missing.Value, 
       Missing.Value, Missing.Value); 
      oWB.Close(Missing.Value, Missing.Value, Missing.Value); 
      oWB = null; 
      oXL.Quit(); 
+0

好的,這並不回答真正的問題,但如果你只是提供了一些關於該代碼工作的先決條件的更多信息,讀者這是Microsoft Office Interop的做事方式,您需要將Microsoft.Office.Interop.Excel程序集添加到項目引用中,並提及此方法的優點和缺點。 –

相關問題