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

Я пытаюсь добавить выпадающий список (проверка списка) при создании 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 поврежден.

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

2 ответа

Решение

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

Для демонстрации попробуйте создать лист в Excel вручную со списком проверки и сохранить его (ничего общего с кодом). Установите список val для всех столбцов 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. Так что нет причин, по которым ты не мог бы сделать то же самое.

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);
Другие вопросы по тегам