2017-08-01 74 views
0

對不起,如果已經回答了這個問題,我搜索了幾個小時,而且我也是編程的新手。c#如何使用OleDbCommand將指定值添加到指定列名下的Excel工作表的下一個可用行

目前,我有我的Excel電子表格15行數據,下面的代碼將值插入行40,並再次按下導出按鈕將插入一個新行的值入行41等等

我的問題是我怎樣才能得到它插入一個新的行,直接在我現有的數據下面的值(第16行)等等與每個正在進行的導出按鈕點擊。我期待保持命令程序。

private void exportBtn_Click(object sender, EventArgs e) 
{ 
    OleDbCommand newRow = new OleDbCommand(); 
    newRow.CommandType = CommandType.Text; 
    newRow.CommandText = "INSERT INTO [Sheet1$] ([Company:], [County:], [State:], [Notes:], [User:], [Email:], [Username:], [Password:], [SMMM PWD:], [CAD:]) VALUES (1,2,3,4,5,6,7,8,9,10)"; 
    newRow.Connection = connectionExl; 

    connectionExl.Open(); 
    newRow.ExecuteNonQuery(); 
    connectionExl.Close(); 
} 

UPDATE

到目前爲止,我可以得到下一個可用行的INT,現在我要指定列下添加值到一個可用行。

爲了便於讓我們說我有2列,名稱爲(列1,列2)和值我想是(1,2)

如何做到這一點,分別設置?

我迄今爲止代碼:

private void exportBtn_Click(object sender, EventArgs e) 
    { 
     Excel.Application xlApp = StartExcel(); 
//Excel.Application xlApp = new Excel.Application(); // instead of above line you can open new instance of Excel application and at the end of procedure xlApp.Application.Quit(); 
     Excel.Workbook myBook = xlApp.Workbooks.Open(@"C:\Users\path\path\excel.xlsx"); 

     Excel.Worksheet mySheet = myBook.Sheets[1]; 
     xlApp.Visible = true; // by default excel is invisible leave it invisible if you just like to add data and save it (also use new instance of Excel in this case) 
     int lastRow = mySheet.Cells.SpecialCells(Excel.XlCellType.xlCellTypeLastCell).Row; 
     int openRow = lastRow + 1; 
     mySheet.Cells[openRow, 1].Value = "your value for column A"; 
     mySheet.Cells[openRow, 2].Value = "your value for column B"; 

     myBook.Save(); 
     myBook.Close(); 

    } 

    private static Excel.Application StartExcel() // would be better to make it public somewhere in your module 
    { 
     Excel.Application instance = null; 
     try { instance = (Excel.Application)Marshal.GetActiveObject("Excel.Application"); } 
     catch (System.Runtime.InteropServices.COMException ex) { instance = new Excel.Application(); } 
     return instance; 
    } 
+0

您正在尋找[excel interop](https://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel.aspx)熟悉MSDN文檔,因爲它將成爲您的單曲最大的資源。 –

回答

0

你可能需要的Microsoft.Office.Interop.Excel或其他Excel庫。 下面我把連同互操作的一些示例,可以根據需要調整:

public int getLastRow(Excel.Worksheet ws) 
{ 
    object[,] arData = ws.UsedRange.FormulaR1C1; // FormulaR1C1 returns only string in 2 dimensional array 
    for (int iRow = arData.GetUpperBound(0); iRow > 0; iRow--) { 
     for (int iCol = 1; iCol <= arData.GetUpperBound(1); iCol++) { 
      if (arData[iRow, iCol].ToString() != "") { return iRow; } 
     } 
    } 
    return 0; 
} 

如果工作表未格式化超出數據範圍,下面會給你的最後一排。

int lastRow = ws.Cells.SpecialCells(Excel.XlCellType.xlCellTypeLastCell).Row; 

您就可以開始您的Excel,並根據需要設置爲您的工作簿/工作表調整:

using System.Runtime.InteropServices; 
using Excel = Microsoft.Office.Interop.Excel; 

void test() 
{ 
    Excel.Application xlApp = csXL.StartExcel(); 
    Excel.Worksheet ws = xlApp.ActiveSheet; 
    int irow = getLastRow(ws); 
} 

public static Excel.Application StartExcel() 
{ 
    Excel.Application instance = null; 
    try { instance = (Excel.Application)Marshal.GetActiveObject("Excel.Application"); } 
    catch (System.Runtime.InteropServices.COMException ex) { instance = new Excel.Application(); } 
    return instance; 
} 

在這種情況下,你不會需要OleDbCommand你可以只用2維數組中插入數據:

object[,] arLoad = new object[0, 9]; arLoad[0, 0] = 1; arLoad[0, 1] = 2; 
ws.Range["A" + irow + ":J" + irow].FormulaR1C1 = arLoad; // or use Value instead of FormulaR1C1 

請記住,當你從2維數組的數組是基於0數據加載到Excel中,但是當你從Excel讀取您的下界的數組爲1 我會等待一天,也許有人會發布更好的答案。

以下是在特定列/單元格下添加數據的幾種方法,但是當您使用2維數組添加數據時,速度要快很多,如上所示。對於小型條目速度不是問題。

Excel.Worksheet ws; 
Excel.Range rngXL = ws.Cells[3, 2]; // Set range to cell B3 
rngXL.Value = "Sample Test"; 
rngXL.FormulaR1C1 = "= 3 + 2"; 
ws.Cells[4,2].FormulaR1C1 = "5"; 
ws.Cells[5, 3].Value = "2"; // Cell E3 
ws.Range["B5:D5"].Value = "Same text for cells B5,C5,D5"; 
ws.Range["E5"].Value = "This cell is"; 

也讀這裏Unable to open another excel file (when one excel is opened by .net)與簡單的解決方案如何使用EXCEL乾淨退出。我編輯過的代碼將使用Excel應用程序的打開實例。如果您只需要更新excel並退出,請使用新的Excel實例,並在完成excel應用程序時完成。

+0

是的我猜這可以被關閉,因爲它似乎沒有人知道如何做到這一點與OleDbCommand和你和Bender綁定提到我只需要熟悉Excel Interop – RobertJRu

+0

隨着班德彎曲還記得在路上你會有更多無論如何都可以調整輸出。 OleDbCommand不像Excel庫那樣控制Excel。要完成這個特定的任務,只需要添加幾行代碼即可添加到上面。讓我知道你是否需要任何幫助。 –

+0

請如果你可以看看我的問題下面更新到我原來的帖子 – RobertJRu

相關問題