2016-10-11 2 views
0

XML 파일에서 생성되는 일부 시트가 있습니다.C에서 Openxml을 사용하여 Excel에서 드롭 다운 목록을 만드는 방법

두 번째 시트에 몇 가지 이름이 있습니다 .excel은 XML 파일을 읽고 OPEN-XML의 도움을 받아 데이터 세트로 변경 한 다음 나중에 워크 시트와 다른 모든 행과 열로 변경합니다.

두 번째 시트의 이름을 사용하여 목록을 만들고 시트 1의 목록을 드롭 다운으로 표시하고 싶습니다. OPEN-XML을 사용하여 두 번째 페이지에서 가져온 데이터로 드롭 다운 목록을 만들고 싶습니다. 많은 시간을 탐색하지만 어떤 해결책도 찾지 못했습니다. openxml을 사용하여 드롭 다운을 만들 수 있습니까?

이것은 XML 파일에서 Excel을 만드는 데 필요한 전체 코드이므로 해결 방법을 알려주십시오.

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를 - 이 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); 
         } 
    
  • 관련 문제