c# 如何使用 OleDbCommand 将指定值添加到指定列名下的 Excel 工作表的下一个可用行
c# How do I add specified values to the next available row of an Excel worksheet under specified column names using OleDbCommand
很抱歉,如果有人回答了这个问题,我搜索了几个小时,而且我也是编程的新手。
目前,我的 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();
}
更新
到目前为止我可以获得下一个可用行的整数,现在我想将指定列下的值添加到该可用行。
为方便起见,假设我有 2 列名为 (column1, column2),我想分别设置的值是 (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;
}
您可能需要 Microsoft.Office.Interop.Excel 或其他 Excel 库。
下面我将一些示例与 Interop 放在一起,您可以根据需要进行调整:
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 并根据需要调整为您的 workbook/worksheet:
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
您只需使用二维数组插入数据即可:
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
请记住,当您将数据从二维数组加载到 Excel 时,您的数组是基于 0 的,但是当您从 Excel 读取数据时,您的 Lower Bound 数组是 1。
我会等一天,也许有人会 post 更好的答案。
这里有几种在特定 column/cell 下添加数据的方法,但是当您使用二维数组添加数据时,速度要快得多,就像我上面展示的那样。对于小条目速度不是问题。
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";
另请阅读此处 以及如何使用 Excel 进行干净退出的简单解决方案。我编辑您的代码的地方将使用 Excel 应用程序的打开实例。如果您只需要更新 excel 并退出它,请使用 Excel 的新实例,当您完成 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();
}
更新
到目前为止我可以获得下一个可用行的整数,现在我想将指定列下的值添加到该可用行。
为方便起见,假设我有 2 列名为 (column1, column2),我想分别设置的值是 (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;
}
您可能需要 Microsoft.Office.Interop.Excel 或其他 Excel 库。 下面我将一些示例与 Interop 放在一起,您可以根据需要进行调整:
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 并根据需要调整为您的 workbook/worksheet:
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
您只需使用二维数组插入数据即可:
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
请记住,当您将数据从二维数组加载到 Excel 时,您的数组是基于 0 的,但是当您从 Excel 读取数据时,您的 Lower Bound 数组是 1。 我会等一天,也许有人会 post 更好的答案。
这里有几种在特定 column/cell 下添加数据的方法,但是当您使用二维数组添加数据时,速度要快得多,就像我上面展示的那样。对于小条目速度不是问题。
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";
另请阅读此处