如何在Excel中使用Openxml在C#中创buildDropdownlist

有一些从XML文件创build的工作表。

在第二张表中有一些名字.excel是通过读取XML文件创build的,并且借助于OPEN-XML将其更改为数据集和后来创build的工作表以及所有其他行和列。

所以我想创build一个使用第二张表名称的列表,并将第一张表中的列表显示为下拉列表。使用OPEN-XML我想创build一个从第二页获取数据的下拉列表。 我浏览很多时间,但我没有find任何解决scheme是否可以使用openxml创build下拉菜单。

这是我从xml文件创buildexcel的整个代码,所以如果有解决scheme,请帮助我。

public void ExportDSToExcel(DataSet ds, string dest) { try { using (var workbook = SpreadsheetDocument.Create(dest, DocumentFormat.OpenXml.SpreadsheetDocumentType.Workbook)) { var workbookPart = workbook.AddWorkbookPart(); workbook.WorkbookPart.Workbook = new DocumentFormat.OpenXml.Spreadsheet.Workbook(); workbook.WorkbookPart.Workbook.Sheets = new DocumentFormat.OpenXml.Spreadsheet.Sheets(); uint sheetId = 1; foreach (DataTable table in ds.Tables) { var sheetPart = workbook.WorkbookPart.AddNewPart<WorksheetPart>(); var sheetData = new DocumentFormat.OpenXml.Spreadsheet.SheetData(); sheetPart.Worksheet = new DocumentFormat.OpenXml.Spreadsheet.Worksheet(sheetData); DocumentFormat.OpenXml.Spreadsheet.Sheets sheets = workbook.WorkbookPart.Workbook.GetFirstChild<DocumentFormat.OpenXml.Spreadsheet.Sheets>(); string relationshipId = workbook.WorkbookPart.GetIdOfPart(sheetPart); if (sheets.Elements<DocumentFormat.OpenXml.Spreadsheet.Sheet>().Count() > 0) { sheetId = sheets.Elements<DocumentFormat.OpenXml.Spreadsheet.Sheet>().Select(s => s.SheetId.Value).Max() + 1; } DocumentFormat.OpenXml.Spreadsheet.Sheet sheet = new DocumentFormat.OpenXml.Spreadsheet.Sheet() { Id = relationshipId, SheetId = sheetId, Name = table.TableName }; sheets.Append(sheet); if(sheet.Name=="Customer") { PageMargins pageM = sheetPart.Worksheet.GetFirstChild<PageMargins>(); SheetProtection sheetProtection = new SheetProtection(); sheetProtection.Password = "admin"; sheetProtection.Sheet = true; sheetProtection.Objects = true; sheetProtection.Scenarios = true; ProtectedRanges pRanges = new ProtectedRanges(); ProtectedRange pRange = new ProtectedRange(); ListValue<StringValue> lValue = new ListValue<StringValue>(); lValue.InnerText = ""; //set cell which you want to make it editable pRange.SequenceOfReferences = lValue; pRange.Name = "not allow editing"; pRanges.Append(pRange); sheetPart.Worksheet.InsertBefore(sheetProtection, pageM); sheetPart.Worksheet.InsertBefore(pRanges, pageM); if (cell.CellReference == "B4") { CellFormula cellformula = new CellFormula(); cellformula.Text = "=INDEX(Sheet5!B:B,MATCH(A4,Sheet5!B:B,0))"; CellValue cellValue = new CellValue(); cellValue.Text = "0"; cell.Append(cellformula); cell.Append(cellValue); } } DocumentFormat.OpenXml.Spreadsheet.Row headerRow = new DocumentFormat.OpenXml.Spreadsheet.Row(); if (RadioButtonList1.SelectedItem.Text == "Yes") { PageMargins pageM = sheetPart.Worksheet.GetFirstChild<PageMargins>(); SheetProtection sheetProtection = new SheetProtection(); sheetProtection.Password = "admin"; sheetProtection.Sheet = true; sheetProtection.Objects = true; sheetProtection.Scenarios = true; ProtectedRanges pRanges = new ProtectedRanges(); ProtectedRange pRange = new ProtectedRange(); ListValue<StringValue> lValue = new ListValue<StringValue>(); lValue.InnerText = ""; //set cell which you want to make it editable pRange.SequenceOfReferences = lValue; pRange.Name = "not allow editing"; pRanges.Append(pRange); sheetPart.Worksheet.InsertBefore(sheetProtection, pageM); sheetPart.Worksheet.InsertBefore(pRanges, pageM); } else { } List<String> columns = new List<string>(); foreach (DataColumn column in table.Columns) { columns.Add(column.ColumnName); DocumentFormat.OpenXml.Spreadsheet.Cell cell = new DocumentFormat.OpenXml.Spreadsheet.Cell(); cell.DataType = DocumentFormat.OpenXml.Spreadsheet.CellValues.String; cell.CellValue = new DocumentFormat.OpenXml.Spreadsheet.CellValue(column.ColumnName); headerRow.AppendChild(cell); } sheetData.AppendChild(headerRow); foreach (DataRow dsrow in table.Rows) { DocumentFormat.OpenXml.Spreadsheet.Row newRow = new DocumentFormat.OpenXml.Spreadsheet.Row(); foreach (String col in columns) { DocumentFormat.OpenXml.Spreadsheet.Cell cell = new DocumentFormat.OpenXml.Spreadsheet.Cell(); cell.DataType = DocumentFormat.OpenXml.Spreadsheet.CellValues.String; cell.CellValue = new DocumentFormat.OpenXml.Spreadsheet.CellValue(dsrow[col].ToString()); // newRow.AppendChild(cell); } sheetData.AppendChild(newRow); } } } } catch { lblstatus.Text = "File Upload Not Succesfull "; } lblstatus.Text = "File Upload Succesfull "; } protected void Button1_Click(object sender, EventArgs e) { if(txtname.Text != null) { if (FileUpload1.HasFile == true) { string myXMLfile = "/uploads/" + FileUpload1.FileName; FileUpload1.SaveAs(Server.MapPath(myXMLfile)); string dest = "D:/uploads/" + txtname.Text+".xlsx"; DataSet ds = new DataSet(); try { ds.ReadXml(Server.MapPath(myXMLfile)); } catch (Exception ex) { lblstatus.Text=(ex.ToString()); } ExportDSToExcel(ds, dest); } else { lblstatus.Text = "Please Upload the file "; } } else { lblstatus.Text = "Please enter the name "; } } } 

你需要创build一个Validator

  • 第一个参数是创build下拉菜单的工作表
  • 第二个参数是从中取数据的工作表

A1:A1048576 – 是应用此validation器的单元格

 public void CreateValidator(Worksheet ws, string dataContainingSheet) { /*** DATA VALIDATION CODE ***/ DataValidations dataValidations = new DataValidations(); DataValidation dataValidation = new DataValidation { Type = DataValidationValues.List, AllowBlank = true, SequenceOfReferences = new ListValue<StringValue> { InnerText = "A1:A1048576" } }; dataValidation.Append( //new Formula1 { Text = "\"FirstChoice,SecondChoice,ThirdChoice\"" } new Formula1(string.Format("'{0}'!$A:$A", dataContainingSheet)) ); dataValidations.Append(dataValidation); var wsp = ws.WorksheetPart; wsp.Worksheet.AppendChild(dataValidations); }