如何使用 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