如何使用 checkListBox 将数据导出到 Excel

Posted

技术标签:

【中文标题】如何使用 checkListBox 将数据导出到 Excel【英文标题】:How to export data to excel with checkListBox 【发布时间】:2015-12-20 10:49:02 【问题描述】:

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

它在 excel 中显示类似的内容。

我真正想要的是这个

这是我的数据库表

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

这是我创建 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();
    


【问题讨论】:

不应该xlEmployeeDetail.Cells[2 + i, 4]xlEmployeeDetail.Cells[2 + numberOfRow, 4] 吗?其中numberOfRow 是每次执行dr.Read() 时递增的int 为什么在检查项目上使用内循环?阅读器不是加载所需的记录吗? 【参考方案1】:

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

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

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

【讨论】:

您好,感谢您的回复。我想知道我的 for 循环应该在哪里检查检查项目。 ?这是因为我不希望用户导出他们没有检查的数据 我想说的是我应该把上面的 for 循环放在哪里? 谢谢,我试试看:) 你为什么需要它?它应该做什么?如果要加载特定记录,则应更改 SQL 查询以仅返回这些记录。还是您想用复选框值替换姓氏? 嗨,Panagioties,我只是想知道,如果我真的想使用循环仅从 checkListbox 导出选中的项目,我还能这样做吗?

以上是关于如何使用 checkListBox 将数据导出到 Excel的主要内容,如果未能解决你的问题,请参考以下文章

无法使用MVVM通过Xceed CheckListBox获取SelectedItems

delphi中 checklistbox怎样根据数据值做出选中或没选中

c# checklistbox 如何取选择的值?例如:我选择了第1、3、5的选项,如何获取它的值?

如何使用 asp.net 将 gridview 图像和数据导出到 PDF 或使用 asp.net 将 gridview 数据导出到 PDF

如何将数据表导出到 xls,在导出前先询问密码

如何使用python将大量数据导出到Excel中的小技巧