我有一个带有复选框的Windows窗体应用程序。到目前为止,我能够将我的数据绑定到我的checkListBox,并使用Microsoft.Office.Interop.Excel库创建了一个excel文件。我的代码如下。这部分代码工作得很好。但是,您可以看到我的代码与employeeCheckListBox
链接,如果选中此复选框中的任何一个,则会将员工的Nick Name显示为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();
}
}
}
答案 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"))
}