【发布时间】: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 -
为什么在检查项目上使用内循环?阅读器不是仅加载所需的记录吗?