Проблема EPPlus Создание проверки списка из таблицы в другой электронной таблице - PullRequest
0 голосов
/ 03 декабря 2018

Я создал таблицу на одном листе (список имен состояний) и назвал таблицу "tblStates".Затем на втором листе есть столбец для State, где я хочу проверить список для тех ячеек, в котором у каждой ячейки есть выпадающий список, предлагающий имена состояний из таблицы «tblStates».Поэтому для столбца «Состояние» на втором листе я создал таблицу с именем «tblGeoStates» и добавил проверку списка в столбец, который ссылается на «= tblStates».(Я ссылался на эту статью / видео, хотя у меня нет второго зависимого списка, но я просто хотел сделать первую часть этого: Contexture Video )

Выполнив шаги изПо ссылке выше, я выполнил эти шаги вручную в Excel, и она отлично работает, однако, при кодировании через EPPlus, она не работает.Таблицы в каждом рабочем листе присутствуют и названы правильно.Проверка списка была применена к таблице на втором рабочем листе, и в каждой ячейке в tblGeoStates появляется раскрывающийся список.Но значения не отображаются.

Рабочий лист 1 с таблицей tblStates Worksheet 1 with tblStates table

Рабочий лист 2 с таблицей tblGeoStates с проверкой списка, которая ссылается на первую таблицу Worksheet 2 with tblGeoStates table

Когда я пытаюсь щелкнуть диалоговое окно проверки списка, чтобы закрыть его, я получаю эту ошибку проверки из Excel - в рабочей книге, созданной вручную, ничего этого не происходити все выглядит одинаково

Excel Validation Error

Код с использованием EPPlus, который генерирует каждую таблицу, а затем проверку списка во 2-й таблице.

        // Add Named Table for States column so we can reference it in another sheet
        using (ExcelRange r = ws.Cells[$"B6:B57"])
        {
            ExcelTableCollection tblcollection = ws.Tables;
            ExcelTable table = tblcollection.Add(r, "tblStates");                             
        }

        // Add Named Table for GeoStates column and validation that references tblStates
        using (ExcelRange r = ws.Cells["F:F"]) // also tried "F2:F1048576 so the header isn't included
        {
            ExcelTableCollection tblcollection = ws.Tables;
            ExcelTable table = tblcollection.Add(r, "tblGeoStates");
            table.ShowFilter = false;

            var v1 = r.DataValidation.AddListDataValidation();               
            v1.ShowErrorMessage = true;
            v1.ErrorStyle = ExcelDataValidationWarningStyle.warning;
            v1.ErrorTitle = "An invalid value was entered";
            v1.Error = "Select a value from the list";
            v1.Formula.ExcelFormula = "=tblStates"; // tried w & w/o = sign
        }

Я пробовал несколько разных вещей, таких как включение заголовка или его отсутствие в выбранном диапазоне для таблиц;Разрешены блоки или нет, показан фильтр или нет и т. Д.

Я изучил базовый XML как созданной вручную рабочей книги, так и созданной программно с помощью EPPlus, и они выглядят по-разному.

Это автоматически сгенерированный EPPlus (не работает):

<dataValidation sqref="F1:F1048576" errorStyle="warning" error="Select a value from the list" errorTitle="An invalid value was entered" showErrorMessage="1" type="list">
<formula1>tblStates</formula1>
</dataValidation>

И это тот, который я сделал вручную (и работает):

<dataValidation xr:uid="{895EE9F3-E8D3-45B6-AD98-9A095C448064}" sqref="F1:F1048576" showErrorMessage="1" showInputMessage="1" type="list" allowBlank="1">
<formula1>tblStates</formula1>
</dataValidation>

1 Ответ

0 голосов
/ 04 декабря 2018

Зачем использовать эти таблицы?Вы можете добавить диапазон напрямую.

using (ExcelRange r = worksheet.Cells["F:F"])
{
    var v1 = r.DataValidation.AddListDataValidation();
    v1.ShowErrorMessage = true;
    v1.ErrorStyle = ExcelDataValidationWarningStyle.warning;
    v1.ErrorTitle = "An invalid value was entered";
    v1.Error = "Select a value from the list";

    //reference the cells with the states directly
    v1.Formula.ExcelFormula = "B6:B57";

    //or if the data is in another sheet, you can reference that also
    v1.Formula.ExcelFormula = "'WorkSheet 2'!B:B";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...