簡體   English   中英

如何在 C# 中使用 Openxml 在 Excel 中創建下拉列表

[英]How to Create Dropdownlist in Excel using Openxml in C#

有一些工作表是從 XML 文件創建的。

第二張表中有一些名稱 .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 ";
        }            
    }
}

您需要創建一個驗證器

  • 第一個參數是一個工作表,其中創建一個下拉列表
  • 第二個參數是要從中獲取數據的工作表

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM