2016-10-11 5 views
0

Есть некоторые листы, созданные из файла XML.Как создать Dropdownlist в Excel с помощью Openxml в C#

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

Так что я хочу создать список, используя имена из 2-го листа, и показать список в листе 1 как выпадающее меню. Использование OPEN-XML Я хочу создать раскрывающийся список с данными, взятыми со 2-й страницы. Я просматриваю много раз, но я не нашел никакого решения. Можно ли создать раскрывающийся список с помощью 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); 
     }