如何导出数据以优于checkListBox

我有一个窗体应用程序与一个检查列表框。 到目前为止,我能够将我的数据绑定到我的checkListBox,并使用Microsoft.Office.Interop.Excel库创build了一个excel文件。 我有我的代码在下面。 这部分代码工作正常。 但是你可以看到,我的代码与employeeCheckListBox链接,如果选中任何一个checkbox,员工的昵称显示为excel文件。 这个代码工作正常,如果我只从checkListBox中select一个项目。 但是,如果我从checkListBox中select2个项目,它是行不通的。 我认为这个问题是从我的代码string f_Name = dr.GetString(1)这一行,它从我的数据库中读取其余的f_name。

在excel中显示这样的东西。

出来吧

我真正想要的是这个 欲望来吧

这是我的数据库表 数据库表

我知道如何做到这一点,帮助将不胜感激

这是我创buildExcel文件的代码

  private void exportToExcel() { object missing = Type.Missing; Excel.Application xlApp = new Excel.Application(); xlApp.Visible = false; Excel.Workbook xlwb = xlApp.Workbooks.Add(missing); //first worksheet Excel.Worksheet xlEmployeeDetail = xlwb.ActiveSheet as Excel.Worksheet; //Cell name xlEmployeeDetail.Cells[1, 1] = "Teacher Id"; xlEmployeeDetail.Cells[1, 2] = "First Name"; xlEmployeeDetail.Cells[1, 3] = "Last Name"; xlEmployeeDetail.Cells[1, 4] = "Nick Name"; //Read the data from the SQL database and store its according value to excel while (dr.Read()) { //f_Name is reading from column 5 from my db string f_Name = dr.GetString(1); string l_Name = dr.GetString(2); for (int i = 0; i < employeeCheckListBox.CheckedItems.Count; i++) { string s = (string) employeeCheckListBox.Items[i]; xlEmployeeDetail.Cells[2 + i, 4] = s; xlEmployeeDetail.Cells[2 + i, 2] = f_Name; } } //Delete rows if there are any empty row var LastRow = xlEmployeeDetail.UsedRange.Rows.Count; LastRow = LastRow + xlEmployeeDetail.UsedRange.Row - 1; int c = 0; for (c = 1; c <= LastRow; c++) { if (xlApp.WorksheetFunction.CountA(xlEmployeeDetail.Rows[c]) == 0) (xlEmployeeDetail.Rows[c] as Microsoft.Office.Interop.Excel.Range).Delete(); } } } 

而不是写入每个数据库行的单独行,您的内部循环覆盖最后读取数据的行。

要编写你的表的数据,你只需要写下面的代码:

 int i=1; while (dr.Read()) { i++; //f_Name is reading from column 5 from my db string f_Name = dr.GetString(1); string l_Name = dr.GetString(2); xlEmployeeDetail.Cells[i, 4] = l_Name; xlEmployeeDetail.Cells[i, 2] = f_Name; } 

这假定数据读取器只返回应该实际导出的logging。 如果不是,则应该修改用于加载数据的SQL语句以加载要导出的数据

原始代码写入的方式,对于每个数据库行,内部循环将写入相同的行和列。

更好的解决scheme是使用像EPPlus这样的库直接将数据导出到Excel文件,而不使用Interop或Excel。 EPPlus具有LoadFromDataTable和LoadFromCollection便捷方法,可以将数据表或对象集合中的数据直接导出到工作表,例如:

 using (ExcelPackage pck = new ExcelPackage()) { //Create the worksheet ExcelWorksheet ws = pck.Workbook.Worksheets.Add("Demo"); //Load the datatable into the sheet, starting from cell A1. //Print the column names on row 1 ws.Cells["A1"].LoadFromDataTable(someTable, true); pck.SaveAs(new FileInfo(@"c:\PathTo\File.xlsx")) }