用C#填充Excel表格

我的程序结构出错了。 每当我按下Windows窗体应用程序中的button时,我的Excel工作表应该用数据更新单元格。

这是我的代码:

using System; using System.IO; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using Excel = Microsoft.Office.Interop.Excel; namespace Test6attendance { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Excel.Application xlApp; Excel.Workbook xlWorkBook; Excel.Worksheet xlWorkSheet; if (File.Exists("D:\\login.xlscsharp-Excel.xls")) { object misValue = System.Reflection.Missing.Value; xlApp = new Excel.Application(); xlWorkBook = xlApp.Workbooks.Open("D:\\login.xlscsharp-Excel.xls", 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); for (int i = 1; i < 55555; i++) { if (xlWorkSheet.Cells[i, 1] == null) { xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1); xlWorkSheet.Cells[i, 1] = DateTime.Now.ToString("MM/dd/ yyyy, hh:mm:ss tt"); xlWorkBook.SaveAs("D:\\login.xlscsharp-Excel.xls", Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue); xlWorkBook.Close(true, misValue, misValue); xlApp.Quit(); releaseObject(xlWorkSheet); releaseObject(xlWorkBook); releaseObject(xlApp); MessageBox.Show("Excel file updated , you can find the file D:\\csharp-Excel.xls"); } } } else { //Create New Code object misValue = System.Reflection.Missing.Value; xlApp = new Excel.Application(); xlWorkBook = xlApp.Workbooks.Add(misValue); xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1); xlWorkSheet.Cells[1, 1] = DateTime.Now.ToString("MM/dd/ yyyy, hh:mm:ss tt"); xlWorkBook.SaveAs("D:\\login.xlscsharp-Excel.xls", Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue); xlWorkBook.Close(true, misValue, misValue); xlApp.Quit(); releaseObject(xlWorkSheet); releaseObject(xlWorkBook); releaseObject(xlApp); MessageBox.Show("Excel file created , you can find the file D:\\csharp-Excel.xls"); } } private void releaseObject(object obj) { try { System.Runtime.InteropServices.Marshal.ReleaseComObject(obj); obj = null; } catch (Exception ex) { obj = null; MessageBox.Show("Exception Occured while releasing object " + ex.ToString()); } finally { GC.Collect(); } } private void dateTimePicker1_ValueChanged(object sender, EventArgs e) { } } } 

我相信问题是与for循环,似乎并没有工作。 需要一些build议或参考来解决它。

问题在于

 if (xlWorkSheet.Cells[i, 1] == null) 

它应该是

  if (xlWorkSheet.Cells[i, 1] == null) 

由于你的第一个if条件检查文件是否存在if (File.Exists("D:\\login.xlscsharp-Excel.xls")) ,如果不存在,它会创build一个文件并将值赋给单元格[1,1]。 现在,当您单击第二次单元格不为空,您的值不会更新。

试试这个代码

 for (int i = 1; i < 55555; i++) { if (xlWorkSheet.Cells[i, 1] != null) { xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1); xlWorkSheet.Cells[i, 1] = DateTime.Now.ToString("MM/dd/ yyyy, hh:mm:ss tt"); xlWorkBook.SaveAs("D:\\login.xlscsharp-Excel.xls", Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue); xlWorkBook.Close(true, misValue, misValue); xlApp.Quit(); releaseObject(xlWorkSheet); releaseObject(xlWorkBook); releaseObject(xlApp); MessageBox.Show("Excel file updated , you can find the file D:\\csharp-Excel.xls"); break; } } 

你的循环很奇怪。 你应该把所有的代码放在循环之外的循环中。 你应该留下的唯一的东西就是你赋值的那一行。 否则,您保存每个保存的应用程序。 更不用说,在分配第一个值之后释放所有的对象。 我想这只能写一个值,然后在for循环的第一行中引发许多exception(您尝试从已经发布的工作簿对象中获取工作表)。

它应该是这样的:

 for (int i = 1; i < 55555; i++) { if (xlWorkSheet.Cells[i, 1] != null) { xlWorkSheet.Cells[i, 1] = DateTime.Now.ToString("MM/dd/ yyyy, hh:mm:ss tt"); } } xlWorkBook.Save("D:\\login.xlscsharp-Excel.xls", Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue); xlWorkBook.Close(true, misValue, misValue); xlApp.Quit(); releaseObject(xlWorkSheet); releaseObject(xlWorkBook); releaseObject(xlApp); MessageBox.Show("Excel file updated , you can find the file D:\\csharp-Excel.xls");