如何使用checkListBox

时间:2015-09-23 08:05:14

标签: c# excel

我有一个带有复选框的Windows窗体应用程序。到目前为止,我能够将我的数据绑定到我的checkListBox,并使用Microsoft.Office.Interop.Excel库创建了一个excel文件。我的代码如下。这部分代码工作得很好。但是,您可以看到我的代码与employeeCheckListBox链接,如果选中此复选框中的任何一个,则会将员工的Nick Name显示为excel文件。如果我只从checkListBox中选择一个项目,此代码可以正常工作。但是如果我从checkListBox中选择2个项目,它就不起作用。我认为问题出在我的代码string f_Name = dr.GetString(1)的这一行,它确实从我的数据库中读取了f_name的其余部分。

在excel中显示类似的内容。

Out Come

我真正想要的是这个 Desire Out Come

这是我的数据库表 Database table

我知道怎么做,帮助将不胜感激

这是我创建Excel文件的代码

    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();
    }
}
}

1 个答案:

答案 0 :(得分:2)

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

要编写表格的数据,您只需编写以下代码:

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;
}

这假定数据读取器仅返回实际应导出的记录。如果没有,则应修改用于加载数据的SQL语句,以仅加载 要导出的数据

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

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

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"))
}