我想编写一个程序,使用循环将文本框中的文本保存到Excel文件中,因为我想在Excel中插入多个文本。我找到了代码,但它只覆盖了单元格中的数据。我希望程序找到最后一行并将新数据插入下一行。我被困在这里,请有人帮我在c#中做到这一点。
object misValue = System.Reflection.Missing.Value;
xlApp = new Excel.ApplicationClass();
xlWorkBook = xlApp.Workbooks.Add(misValue);
xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);
xlWorkSheet.Cells[1, 1] = "FirstName";
xlWorkSheet.Cells[1, 2] = "LastName";
xlWorkSheet.Cells[1, 3] = "JobTitle";
xlWorkSheet.Cells[1, 4] = "Address";
for (int i=2; i<=6; i++)
{
xlWorkSheet.Cells[i, 1] = textBox1.Text;
xlWorkSheet.Cells[i, 2] = textBox2.Text;
xlWorkSheet.Cells[i, 3] = textBox3.Text;
xlWorkSheet.Cells[i, 4] = textBox4.Text;
}
答案 0 :(得分:4)
就像我提到的那样你不需要使用循环。见这个例子
假设您的表单看起来像这样。
代码:(已经过测试和测试)
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Excel = Microsoft.Office.Interop.Excel;
Namespace WindowsFormsApplication2
{
public partial class Form1 : Form
{
Microsoft.Office.Interop.Excel.Application xlexcel;
Microsoft.Office.Interop.Excel.Workbook xlWorkBook;
Microsoft.Office.Interop.Excel.Worksheet xlWorkSheet;
object misValue = System.Reflection.Missing.Value;
Public Form1()
{
InitializeComponent();
}
//~~> Open File
private void button1_Click(object sender, EventArgs e)
{
xlexcel = new Excel.Application();
xlexcel.Visible = true;
// Open a File
xlWorkBook = xlexcel.Workbooks.Open("C:\\MyFile.xlsx", 0, true, 5, "", "", true,
Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);
xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);
xlWorkSheet.Cells[1, 1] = "FirstName";
xlWorkSheet.Cells[1, 2] = "LastName";
xlWorkSheet.Cells[1, 3] = "JobTitle";
xlWorkSheet.Cells[1, 4] = "Address";
}
//~~> Add Data
private void button2_Click(object sender, EventArgs e)
{
int _lastRow = xlWorkSheet.Range["A" + xlWorkSheet.Rows.Count].End[Excel.XlDirection.xlUp].Row + 1 ;
xlWorkSheet.Cells[_lastRow, 1] = textBox1.Text;
xlWorkSheet.Cells[_lastRow, 2] = textBox2.Text;
xlWorkSheet.Cells[_lastRow, 3] = textBox3.Text;
xlWorkSheet.Cells[_lastRow, 4] = textBox4.Text;
}
//~~> Once done close and quit Excel
private void button3_Click(object sender, EventArgs e)
{
xlWorkBook.Close(true, misValue, misValue);
xlexcel.Quit();
releaseObject(xlWorkSheet);
releaseObject(xlWorkBook);
releaseObject(xlexcel);
}
private void releaseObject(object obj)
{
try
{
System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
obj = null;
}
catch (Exception ex)
{
obj = null;
MessageBox.Show("Unable to release the Object " + ex.ToString());
}
finally
{
GC.Collect();
}
}
}
}
从评论中跟进
Range对象是工作表对象的一部分。所以你不应该在那里得到任何错误。就像我上面提到的那样,代码经过了试验和测试。
更多关注(来自评论)
以上代码在VS 2010 Ultimate上进行了测试。如果你有VS 2008,那么替换
行int _lastRow = xlWorkSheet.Cells[xlWorkSheet.Rows.Count,
1].End[Excel.XlDirection.xlUp].Row + 1;
与
int _lastRow = xlWorkSheet.Cells.Find(
"*",
xlWorkSheet.Cells[1,1],
Excel.XlFindLookIn.xlFormulas,
Excel.XlLookAt.xlPart,
Excel.XlSearchOrder.xlByRows,
Excel.XlSearchDirection.xlPrevious,
misValue,
misValue,
misValue
).Row + 1 ;
答案 1 :(得分:0)
您主要关注的是在Excel中找到last used row
。
为此你可以使用
Excel.Range usedRange = xlWorkSheet .UsedRange;
Excel.Range _lastCell= usedRange.SpecialCells(Excel.XlCellType.xlCellTypeLastCell,
Type.Missing);
int _lastRow= lastCell.Row; // Gives you the last used row in your Excel sheet
int _lastCol = lastCell.Column; // Give you the last used column
_lastRow++; // To get the next row
for (int i=_lastRow; i<=_lastrow+6; i++) // Set your i value to _lastRow
{
xlWorkSheet.Cells[i, 1] = textBox1.Text;
xlWorkSheet.Cells[i, 2] = textBox2.Text;
xlWorkSheet.Cells[i, 3] = textBox3.Text;
xlWorkSheet.Cells[i, 4] = textBox4.Text;
}