如何在c#中使用Openxml在Excel中创建下拉列表

本文关键字:Excel 下拉列表 创建 Openxml | 更新日期: 2023-09-27 18:12:37

有一些表单是由XML文件创建的。

在第二张表中有一些名称。excel是通过读取XML文件并将其更改为数据集创建的,然后在OPEN-XML的帮助下创建工作表和所有其他行和列。

所以我想用第二个工作表中的名字创建一个列表,并在下拉列表中显示工作表1中的列表。使用OPEN-XML,我想用从第二页获取的数据创建一个下拉列表。我浏览了很多次,但我没有找到任何解决方案,是否有可能使用openxml创建下拉。

这是我的整个代码创建excel从xml文件,所以如果它有解决方案,请帮助我。

 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 ";
        }            
    }
}

如何在c#中使用Openxml在Excel中创建下拉列表

您需要创建一个Validator

  • 第一个参数是一个工作表,其中创建一个下拉
  • 第二个参数是从
  • 获取数据的工作表

A1:A1048576 -是应用此Validator的单元格

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);
        }