Arvind
Arvind

Reputation: 75

Create all the rows of a column as a dropdownlist in excel using c#

My requirement is to export a blank excel sheet with 5 columns in which 3rd columns of all rows as a dropdownlist, so that user can use this work sheet to modify the data as per their need. I am using c# to exporting file.

I already worked on it but that at the moment, it only creates a dropdown list in a particular cell but I want to make all the rows of first column as a dropdown list .

Am using gembox spreadsheet to create an excel file.

Below is the code I am using:

        SpreadsheetInfo.SetLicense("FREE-LIMITED-KEY");
        ExcelFile ef = new ExcelFile();
        ExcelWorksheet ws = ef.Worksheets.Add("Journal Entry Format");

        ws.Columns[0].Width = 30 * 256;
        ws.Columns[1].Width = 30 * 256;
        ws.Columns[2].Width = 30 * 256;
        ws.Columns[3].Width = 30 * 256;
        ws.Columns[4].Width = 30 * 256;
        ws.Columns[5].Width = 30 * 256;
        ws.Columns[6].Width = 30 * 256;

        CellStyle tmpStyle2 = new CellStyle();
        tmpStyle2.HorizontalAlignment = HorizontalAlignmentStyle.Center;
        tmpStyle2.VerticalAlignment = VerticalAlignmentStyle.Center;
        tmpStyle2.FillPattern.SetSolid(System.Drawing.Color.Yellow);
        ws.Cells.GetSubrangeAbsolute(0, 0, 1, 5).Style = tmpStyle2;
        ws.Cells[1, 0].Value = "Last";
        ws.Cells.GetSubrangeAbsolute(1, 0, 1, 5).Merged = true;

        CellStyle tmpStyle1 = new CellStyle();
        tmpStyle1.HorizontalAlignment = HorizontalAlignmentStyle.Center;
        tmpStyle1.VerticalAlignment = VerticalAlignmentStyle.Center;
        tmpStyle1.FillPattern.SetSolid(System.Drawing.Color.Blue);
        tmpStyle1.Font.Weight = ExcelFont.BoldWeight;
        tmpStyle1.Font.Color = System.Drawing.Color.White;
        tmpStyle1.WrapText = true;

        ws.Cells[3, 0].Value = "Voucher Date";
        ws.Cells[3, 1].Value = "Voucher No.";
        ws.Cells[3, 2].Value = "Select Ledger";
        ws.Cells[3, 3].Value = "Debit/Credit";
        ws.Cells[3, 4].Value = "Amount";
        ws.Cells[3, 5].Value = "Narration";
        ws.Cells.GetSubrangeAbsolute(3, 0, 3, 5).Style = tmpStyle1;

        var list = new List<string>();
        foreach (var led in ledgers)
        {
            list.Add(led.AccountHead);
        }

        var flatList = string.Join(",", list.ToArray());

        for (int i = 3; i < 100; ++i)
        {
            DataValidation dv = new DataValidation();
            dv.InCellDropdown = true;
            dv.InputMessage = "Select Ledger";
            dv.Formula1 = flatList;
            ws.DataValidations.Add(dv);
            
            ws.Columns[2].Cells[i + 1].Value = dv.Formula1;
        }

        ws.PrintOptions.FitWorksheetWidthToPages = 1;
        ef.Save(this.Response, "JournalEntry Format" + ".xlsx");

Upvotes: 2

Views: 3266

Answers (2)

user2853220
user2853220

Reputation: 1

I don't know if anyone will read this but I've found an answer. You need to insert the reference data somewhere else then reference it in the formula.

It's also important to clear any existing data filter on your spreadsheet because gembox will not overwrite it.

var hiddenSheet = template.Worksheets["hiddenSheet"];
var arr = list.ToArray();

for (int i = 0; i < arr).Length; i++)
{
    hiddenSheet.Cells[i, 1].Value = arr[i]; 
}
var flatList = string.Join(",", arr);

DataValidation dv = new DataValidation(ws.Columns[2].Cells);
dv.Type = DataValidationType.List;
dv.InputMessage = "Select Ledger";
dv.Formula1 = $"=hiddenSheet!$A$1:$A${arr.Length}";

ws.DataValidations.Add(dv);

Upvotes: 0

GemBox Dev Team
GemBox Dev Team

Reputation: 669

Here is how you can set 3rd columns cells as a dropdownlist:

var flatList = string.Join(",", list.ToArray());

DataValidation dv = new DataValidation(ws.Columns[2].Cells);
dv.Type = DataValidationType.List;
dv.InputMessage = "Select Ledger";
dv.Formula1 = flatList;

ws.DataValidations.Add(dv);

Upvotes: 0

Related Questions