Использование OpenXML, как я могу связать список для проверки данных

Я обрабатываю файл .xlsm и должен знать, как использовать список на другом листе для проверки данных с помощью openXML и C #.

Для начала у меня есть файл .xlsm с двумя пустыми листами и макросами. В моей программе я открываю файл: создайте заголовок столбца на Sheet1, затем создайте список проверки на sheet2. Итак, после запуска моей программы Sheet1 «A1» содержит текст «Цвет», а Sheet2 «A1: A4» содержит «Синий», «Зеленый», «Красный», «Желтый». Я добираюсь так далеко.

Я хотел бы сделать так, чтобы во всех ячейках столбца «A» на листе 1 был выпадающий список, который содержит каждый из четырех цветов и применяет их как единственный вход. В Microsoft Excel это делается, перейдя на вкладку «Данные», выбрав «Проверка данных», выбрав «Список» и выделив ячейки, которые вы хотите использовать. Мне нужно сделать эту ассоциацию программно.

XML (желаемый), создаваемый Microsoft Excel, если я делаю это вручную:

<extLst> <ext uri="{CCE6A557-97BC-4b89-ADB6-D9C93CAAB3DF}" xmlns:x14="http://schemas.microsoft.com/office/spreadsheetml/2009/9/main"> <x14:dataValidations count="1" xmlns:xm="http://schemas.microsoft.com/office/excel/2006/main"> <x14:dataValidation type="list" allowBlank="1" showInputMessage="1" showErrorMessage="1"> <x14:formula1> <xm:f>'Validation Data'!$A$1:$A$4</xm:f> </x14:formula1> <xm:sqref>A1:A1048576</xm:sqref> </x14:dataValidation> </x14:dataValidations> </ext> </extLst> 

Следующий метод и результаты – это то, что я пробовал. Это может дать лучшую идею того, что я пытаюсь сделать.

Здесь я перехожу в «Sheet2»! $ A $ 1: $ A $ 4 "как параметр validationListCells. Это представляет ячейки в «Sheet2», которые в этом примере будут содержать названия цветов «Красный», «Зеленый» … и т. Д.

Я передаю «A2: A1048576» как параметр «cellToValidate». Это представляет все ячейки столбца Sheet1 «A», на котором я хочу принудительно выполнить проверку.

Я передаю «Sheet1» в качестве параметра workheetName.

 private void InsertValidation(String worksheetName, String validationListCells, String cellsToValidate) { DataValidations dataValidations1 = new DataValidations() { Count = (UInt32Value)1U }; DataValidation dataValidation1 = new DataValidation() { Formula1 = new Formula1(validationListCells), Type = DataValidationValues.List, ShowInputMessage = true, ShowErrorMessage = true, SequenceOfReferences = new ListValue<StringValue>() { InnerText = cellsToValidate } }; dataValidations1.Append(dataValidation1); using (SpreadsheetDocument spreadSheet = SpreadsheetDocument.Open(_documentPath, true)) { WorksheetPart worksheetPart = GetWorksheetPartByName(spreadSheet, worksheetName); worksheetPart.Worksheet.Append(dataValidations1); worksheetPart.Worksheet.Save(); } } 

Это приводит к этому XML в Sheet1.xml. Что вызывает ошибку в Excel.

 <x:dataValidations count="1"> <x:dataValidation type="list" showInputMessage="1" showErrorMessage="1" sqref="A2: A1048576"> <x:formula1>'Sheet2'!$A$1:$A$5</x:formula1> </x:dataValidation> </x:dataValidations> 

Похоже, что я могу быть на правильном пути, так как он начинает напоминать xml, созданный Excel, но я совершенно новичок в openXML, и я мало разбираюсь в этой теме в сети.

Заранее спасибо!

Для тех, кто нуждается в этом … код ниже работал для меня. Я ввел там имена переменных user3251089.

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

надеюсь, что это кому-то!

 using Excel = DocumentFormat.OpenXml.Office.Excel; using X14 = DocumentFormat.OpenXml.Office2010.Excel; 

…..

 Worksheet worksheet = worksheetPart.Worksheet; WorksheetExtensionList worksheetExtensionList = new WorksheetExtensionList(); WorksheetExtension worksheetExtension = new WorksheetExtension() { Uri = "{CCE6A557-97BC-4b89-ADB6-D9C93CAAB3DF}" }; worksheetExtension.AddNamespaceDeclaration("x14", "http://schemas.microsoft.com/office/spreadsheetml/2009/9/main"); X14.DataValidations dataValidations = new X14.DataValidations() { Count = (UInt32Value)3U }; dataValidations.AddNamespaceDeclaration("xm", "http://schemas.microsoft.com/office/excel/2006/main"); //sites validation dataValidations.Append(new X14.DataValidation() { Type = DataValidationValues.List, AllowBlank = true, ShowInputMessage = true, ShowErrorMessage = true, DataValidationForumla1 = new X14.DataValidationForumla1() { Formula = new Excel.Formula(validationListCells) }, ReferenceSequence = new Excel.ReferenceSequence(cellsToValidate) }); worksheetExtension.Append(dataValidations); worksheetExtensionList.Append(worksheetExtension); worksheet.Append(worksheetExtensionList); worksheet.Save(); 
  • Веб-сайт XML с динамическим ключом
  • Как эффективно буферизировать и очищать поток в Open XML SDK
  • XML-файл в Excel, ошибка при открытии
  • чтение программного файла XML в книгу
  • Анализ XML DOM в VBA Excel - родители и дети
  • Создание XML-файлов Excel из Python
  • c # использование excel для открытия xml-файла
  • Как заставить содержимое ячейки Excel быть встроенной строкой inlineStr iso?
  • Отфильтровать XML для определенной даты из API погоды
  • Как загрузить domDocument в Excel в виде таблицы xml?
  • C # создать файл excel из моего собственного XML-файла
  • Interesting Posts

    Необычная ошибка vba: переменная объекта или переменная блока не задана

    Вставка таблицы Excel в таблицу Oracle с помощью SQL-запроса

    Как скопировать данные из закрытых книг с последовательным именем и объединить ячейки в таблицу с поддержкой макроса

    Проблемы с внедрением двух критериев vlookup substitute (sumproduct или index)

    VBA – печатать строки в файл .txt

    Проверьте значение ячейки, скопируйте

    Как получить ленту приложения excel – скрыть / показать, используя interop C #

    Подсчет уникальных значений в диапазоне дат

    Получить Excel для отображения полных значений

    Нажатие или отправка данных в реальном времени в таблицу Excel

    Добавить выражение формулы вместо значений в VBA Macro excel code

    Выполнение функций из надстроек Excel в vba, есть ли более простой способ, чем использование Run «mySub»?

    VBA / ADO QUERY Работает на моем компьютере и не работает на компьютере

    удалите пустые строки на дно

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

    Давайте будем гением компьютера.