Как создать Dropdownlist в Excel, используя Openxml в C#

Есть несколько листов, которые созданы из файла XML.

На втором листе есть некоторые имена.excel создается путем чтения XML-файла и изменения его на набор данных и созданный впоследствии лист, а также все другие строки и столбцы с помощью OPEN-XML .

Поэтому я хочу создать список, используя имена со 2-го листа, и показать список на листе 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 ";
        }            
    }
}

1 ответ

Вам нужно создать валидатор

  • Первый параметр представляет собой рабочий лист, где создать раскрывающийся список
  • Второй параметр - это рабочий лист для получения данных

A1: A1048576 - это ячейки для применения этого валидатора

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);
        }
Другие вопросы по тегам