如何在导出到Excel时将列表分配给closedXML中的单元格(下拉格式)

我只是试图导出DatatableDatatable没有任何数据 – 只有标题)。 另外,我有一个List<String> ,我想追加到列,这样,导出到Excel后,该列(除标题外的所有单元格)应包含列表数据作为Dropdown格式。

我GOOGLE了很多,无法find任何解决scheme。 以下是我所访问的链接,但没有运气。

堆栈溢出

Codeplex – ClosedXML

下面是我到目前为止所尝试的。

  private void ExcelExport(DataTable dt, GridView Template) { bool isListRequired = false; List<string> groupCodeList = new List<string>(); ; Template.DataBind(); if (Template.HeaderRow != null) { foreach (TableCell cell in Template.HeaderRow.Cells) { if (cell.Text == "ActivityGroup_Code") { isListRequired = true; groupCodeList = db.PMS_M_ActivityGroup.Select(a => a.ActivityGroup_Code).ToList(); } dt.Columns.Add(cell.Text); } var workbook = new XLWorkbook(); var returnValue = workbook.AddWorksheet(dt); var worksheet = workbook.Worksheet(1); if (isListRequired) { //worksheet.Cell("E2").DataValidation.List(string.Join("",groupCodeList.ToArray())); //worksheet.Cell(2,5).InsertData(groupCodeList); // Trying to add a list to the Cell (E2) - and applying datavalidation to the Column (5th column - E Range) // Dropdown is created in excel(with blank) but data is not population to that dropdown worksheet.Cell(2, 5).InsertData(groupCodeList); worksheet.Column(5).SetDataValidation().List(string.Join("", groupCodeList.ToArray())); } Response.ClearContent(); Response.Buffer = true; Response.AddHeader("content-disposition", "attachment; filename=ExcelFormat.xlsx"); Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; Response.Charset = ""; using (MemoryStream MyMemoryStream = new MemoryStream()) { workbook.SaveAs(MyMemoryStream); MyMemoryStream.WriteTo(Response.OutputStream); Response.Flush(); Response.End(); } } } 

而我打电话给这个方法的代码是

  List<PMS_M_ActivityGroup> activitygroup = new List<PMS_M_ActivityGroup>(); activitygroup = db.PMS_M_ActivityGroup.Select(a => a).ToList(); DataTable dt2 = new DataTable("Excel Template"); GridView Template2 = new GridView(); Template2.DataSource = activitygroup; ExcelExport(dt2, Template2); 

请求您为我提供解决scheme如何实现所需的function。

谢谢

我得到了解决scheme。 这不是那么简单,但我们需要做一些棘手的实现这个function。 在这里发帖 – 可能对正在使用特定的ClosedXML库的其他开发人员有所帮助。

所以我们需要做的是:我们需要创build一个单独的(第二个)工作表,将datavalidation应用到要显示下拉列表的第一个工作表列。

 private void ExcelExportValidation(DataTable dt, GridView Template) { try { bool isListRequired = false; List<string> groupCodeList = new List<string>(); ; Template.DataBind(); if (Template.HeaderRow != null) { foreach (TableCell cell in Template.HeaderRow.Cells) { if (cell.Text == "ActivityGroup_Code") { isListRequired = true; groupCodeList = db.PMS_M_ActivityGroup.Select(a => a.ActivityGroup_Code).ToList(); } dt.Columns.Add(cell.Text); } var workbook = new XLWorkbook(); var returnValue = workbook.AddWorksheet(dt); var worksheet = workbook.Worksheet(1); if (isListRequired) { var tempDt = Helper.ConvertListToDataTable(groupCodeList); tempDt.TableName = "Sheet1"; var returnValue2 = workbook.AddWorksheet(tempDt); var worksheet2 = workbook.Worksheet(2); int lastCellNo = groupCodeList.Count + 1; worksheet.Column(5).SetDataValidation().List(worksheet2.Range("A2:A" + lastCellNo), true); } Response.ClearContent(); Response.Buffer = true; Response.AddHeader("content-disposition", "attachment; filename=ExcelFormat.xlsx"); Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; Response.Charset = ""; using (MemoryStream MyMemoryStream = new MemoryStream()) { workbook.SaveAs(MyMemoryStream); MyMemoryStream.WriteTo(Response.OutputStream); Response.Flush(); Response.End(); } } } catch (Exception ex) { ExceptionLogging.SendErrorToText(ex); } } 

@Chandan肯定给出了正确的答案。 我发布了一个独立的解决scheme代码片段,将excel文件保存在磁盘上:

 var workbook = new XLWorkbook(); DataTable userData = new DataTable("Sheet1"); userData.Columns.Add("Master Column"); workbook.AddWorksheet(userData); var worksheet = workbook.Worksheet(1); DataTable validationTable = new DataTable(); validationTable.Columns.Add("DropDownItems"); validationTable.TableName = "Sheet2"; DataRow dr = validationTable.NewRow(); dr["DropDownItems"] = "Item1"; validationTable.Rows.Add(dr); dr = validationTable.NewRow(); dr["DropDownItems"] = "Item2"; validationTable.Rows.Add(dr); dr = validationTable.NewRow(); dr["DropDownItems"] = "Item3"; validationTable.Rows.Add(dr); var worksheet2 = workbook.AddWorksheet(validationTable); worksheet.Column(1).SetDataValidation().List(worksheet2.Range("A2:A4"), true); //optional: you can hide the data validation sheet from your users if you want //worksheet2.Hide(); workbook.SaveAs(@"C:\myworkbook.xlsx"); 

它在Sheet1中创build下拉菜单,如下所示:

在这里输入图像说明