如何在导出到 Excel 时将列表分配给 closedXML 中的单元格(下拉格式)
How to assign a list to a Cell(Dropdown format) in closedXML while Exporting to Excel
我只是想导出一个 Datatable
(Datatable
没有任何数据 - 只有 header)。此外,我有一个 List<String>
,我想将其附加到该列,这样,在导出到 excel 之后,该列(除 header 之外的所有单元格)应该包含列表数据作为 Dropdown
格式。
我用谷歌搜索了很多,但找不到任何解决方案。
以下是我访问过但没有成功的链接。
Whosebug
下面是我目前尝试过的方法。
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);
请求您提供如何实现所需功能的解决方案。
谢谢
我得到了解决方案。它并没有那么简单,但我们需要做一些技巧来实现这个功能。在此处发布 - 可能对专门使用 ClosedXML
库的其他开发人员有所帮助。
所以我们需要做的是:我们需要创建一个单独的(第二个)sheet,申请
DataValidation
到要显示下拉列表的第 sheet 列。
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 确实给出了正确的答案。我发布了一个独立的解决方案代码片段,它将 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 中创建下拉列表,如下所示:
我只是想导出一个 Datatable
(Datatable
没有任何数据 - 只有 header)。此外,我有一个 List<String>
,我想将其附加到该列,这样,在导出到 excel 之后,该列(除 header 之外的所有单元格)应该包含列表数据作为 Dropdown
格式。
我用谷歌搜索了很多,但找不到任何解决方案。 以下是我访问过但没有成功的链接。
Whosebug
下面是我目前尝试过的方法。
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);
请求您提供如何实现所需功能的解决方案。
谢谢
我得到了解决方案。它并没有那么简单,但我们需要做一些技巧来实现这个功能。在此处发布 - 可能对专门使用 ClosedXML
库的其他开发人员有所帮助。
所以我们需要做的是:我们需要创建一个单独的(第二个)sheet,申请
DataValidation
到要显示下拉列表的第 sheet 列。
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 确实给出了正确的答案。我发布了一个独立的解决方案代码片段,它将 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 中创建下拉列表,如下所示: