Добавить проверку списка в столбец, кроме первых двух строк

Я пытаюсь добавить раскрывающийся список (проверка списка) при создании excel, я уже нашел способ добавить его ко всему столбцу, но мой сценарий отличается, потому что я добавляю проверку только ко всему столбцу, кроме первой строки и второй строки.

Это то, что я пробовал до сих пор:

 public MemoryStream GetExcelSheet()
    {
        using (var package = new ExcelPackage())
        {
            ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("Test");

            var val = worksheet.DataValidations.AddListValidation("A:A");

            val.Formula.Values.Add("Male");
            val.Formula.Values.Add("Female");
            val.ShowErrorMessage = true;

            worksheet.Cells["A1"].Formula = null;


            var stream = new MemoryStream(package.GetAsByteArray());
            return stream;
        }
    }

Я пытаюсь аннулировать это:

worksheet.Cells["A1"].Formula = null;

надеясь, что он удалит проверку в определенной ячейке, но это не работает.

я тоже пробовал

var val = worksheet.DataValidations.AddListValidation("A2:A");

указать начальный номер строки, но сгенерированный файл Excel поврежден.

Любая помощь в этом, пожалуйста?


person Vincent Dagpin    schedule 21.04.2015    source источник


Ответы (2)


Насколько я знаю, к сожалению, нет возможности установить диапазон в excel от «Row 2 to Infinity». Так что что-то вроде "A2:A" не сработает.

Для демонстрации попробуйте вручную создать рабочий лист в Excel со списком проверки и сохранить его (ничего общего с кодом). Установите список значений для всего столбца A, а затем нажмите A1 и удалите список только из него. Если вы затем переименуете xlsx в .zip, откроете его и посмотрите на файл sheet1.xml, вы увидите следующее:

<dataValidation type="list" allowBlank="1" showInputMessage="1" showErrorMessage="1" sqref="A2:A1048576">
    <formula1>"Male,Female"</formula1>
</dataValidation>

Обратите внимание на sqref. По сути, Excel устанавливает диапазон от A2 до максимального количества строк в формате Excel 2007, равного 1 048 576. Так что нет причин, по которым вы не могли бы сделать то же самое.

person Ernie S    schedule 21.04.2015
comment
Эрни прав, невозможно сделать то, о чем вы просите. Мой обходной путь состоял в том, чтобы использовать 2 листа. На первом листе я отобразил свои нередактируемые данные, а затем создал второй лист, чтобы мои пользователи могли вводить свои данные. - person Jeff Finn; 21.04.2015
comment
Спасибо за ответ, думаю, я просто воспользуюсь адресом A2:A1048576. 1 048 576 мне достаточно. Спасибо @ernie - person Vincent Dagpin; 22.04.2015

ExcelCellBase имеет соответствующий метод расширения для получения строки адреса из диапазона:

public static string GetAddress(int FromRow, int FromColumn, int ToRow, int ToColumn)

ExcelPackage имеет общедоступную константу MaxRows (1048576), которую можно использовать для параметр ToRow.

Собираем это вместе для вашего случая:

var range = ExcelRange.GetAddress(2, 1, ExcelPackage.MaxRows, 1);
var val = worksheet.DataValidations.AddListValidation(range);
person Philip Bijker    schedule 10.03.2016