Используя OpenXmlSDK, как я могу выбрать / обновить значение в ячейке, которая является контролем диапазона?

Я даже не уверен, использую ли я правильную терминологию; Я буду обновлять вопрос и заголовок по мере необходимости.

Я использую OpenXmlSDK для заполнения ранее существующего файла Excel .xlsm Excel 2010. – лист с поддержкой макросов.

Я могу получить доступ к рабочим таблицам и ячейкам достаточно хорошо.

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

Он обозначен как «H13» на листе, и нажмите правой кнопкой мыши >> управление форматом.

 Input range: 'anotherWorksheet'!$N$3:$N$54 Cell link: 'anotherWorksheet'!$M$3 

Всякий раз, когда я пытаюсь получить ссылку на эту ячейку, я не могу ее найти – я получаю null значение

Я пробовал два метода доступа:

Я даже не уверен, использую ли я правильную терминологию; Я буду обновлять вопрос и заголовок по мере необходимости.

Я использую OpenXmlSDK для заполнения ранее существующего файла Excel .xlsm Excel 2010. – лист с поддержкой макросов.

Я могу получить доступ к рабочим таблицам и ячейкам достаточно хорошо.

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

Он обозначен как «H13» на листе, и нажмите правой кнопкой мыши >> управление форматом.

 Input range: 'anotherWorksheet'!$N$3:$N$54 Cell link: 'anotherWorksheet'!$M$3 

Всякий раз, когда я пытаюсь получить ссылку на эту ячейку, я не могу ее найти – я получаю null значение

Я пробовал два метода доступа:

  // http://msdn.microsoft.com/en-us/library/ff921204.aspx private static Cell GetCell(Worksheet worksheet, string addressName) { return worksheet.Descendants<Cell>().Where( c => c.CellReference == addressName).FirstOrDefault(); } 

а также:

  // Given a worksheet, a column name, and a row index, // gets the cell at the specified column and // http://stackoverflow.com/questions/527028/open-xml-sdk-2-0-how-to-update-a-cell-in-a-spreadsheet private static Cell GetCell(Worksheet worksheet, string columnName, uint rowIndex) { Row row = GetRow(worksheet, rowIndex); if (row == null) return null; return row.Elements<Cell>().Where(c => string.Compare (c.CellReference.Value, columnName + rowIndex, true) == 0).FirstOrDefault(); } // Given a worksheet and a row index, return the row. private static Row GetRow(Worksheet worksheet, uint rowIndex) { return worksheet.GetFirstChild<SheetData>(). Elements<Row>().Where(r => r.RowIndex == rowIndex).First(); } 

Оба дают null для целевой ячейки H13 , но предоставляют ссылки на окружающие клетки (то есть, H12, H14, G13)

На самом деле, I13 также дает null , но эта ячейка не заполнена чем-либо. Однако, если я не могу получить ссылку, как я могу заполнить ее с помощью SDK? Не мое главное, здесь.

Я получаю данные, которые будут соответствовать одной из записей в раскрывающемся списке; Мне просто нужно фактически заполнить / выбрать эту конкретную запись в целевой таблице.

Как я могу сделать это с помощью OpenXmlSDK? Я пытался использовать различные библиотеки с открытым исходным кодом, но ни один из них не поддерживает файлы .xslm (файл, предоставленный клиентом, и не может использоваться в другом формате, макросы должны выполняться при запуске и т. Д.).

Хотя я использую C #, так как мой вопрос касается OpenXmlSDK, я бы принял ответы на других языках, используя эту структуру.

Короткий ответ: ячейки не существует, поэтому null ссылка.

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

Отражая файл с помощью Инструмента производительности Open XML SDK 2.0, я увидел, что вместо создания ячейки и добавления ее на рабочий лист вместо этого была создана DataValidation (с CellReference, приравниваемая к цели).

     используя X14 = DocumentFormat.OpenXml.Office2010.Excel;

     [....]

     X14.DataValidations dataValidations1 = new X14.DataValidations () {Count = (UInt32Value) 1U};
     dataValidations1.AddNamespaceDeclaration ("xm", "http://schemas.microsoft.com/office/excel/2006/main");

     X14.DataValidation dataValidation1 = new X14.DataValidation () {Type = DataValidationValues.List, AllowBlank = true, ShowInputMessage = true, ShowErrorMessage = true};

     X14.DataValidationForumla1 dataValidationForumla11 = новый X14.DataValidationForumla1 ();
     Excel.Formula formula1 = новый Excel.Formula ();
     formula1.Text = "Списки! $ A $ 1: $ A $ 51";

     dataValidationForumla11.Append (формула1);
     Excel.ReferenceSequence referenceSequence1 = новый Excel.ReferenceSequence ();
     referenceSequence1.Text = "A1";

     dataValidation1.Append (dataValidationForumla11);
     dataValidation1.Append (referenceSequence1);

     dataValidations1.Append (dataValidation1);

Если в рабочем листе не указано заданное значение, оно не будет «быть» «ячейкой» при доступе во время выполнения.

Оглядываясь назад, это имеет смысл. Но визуально это похоже на камеру, так что это не очевидно ….

НЕ КЛЕТКА: ceci n'est pas un cell

ПРИМЕЧАНИЕ. Если выбор сделан из DataValidation и сохранен, ячейка теперь имеет значение, и поэтому она существует:

IS A CELL: c'est причудливый, не?

Это можно обойти, создав и добавив новую ячейку в целевую строку, когда возвращается нулевая ссылка.

Трудность теперь заключается в проверке, требующей ссылки на таблицу разделяемых строк, и не будет принимать raw-текст в качестве значения ячейки ….

UPDATE: мне удалось найти DataValidation, связанную с ячейкой, найти целевой лист и диапазон, найти целевое значение в этом диапазоне и получить ссылку SharedStringsTable, связанную с этим значением. Но независимо от значения, которое я подключил к целевой соте, все это считалось плохими данными Excel при открытии.

В конце концов, я сдался, вернулся в Excel Interop и нашел способ выбрать поле выпадающего изнутри (ugh) Interop.

  • Минимальная таблица стилей для Excel Open XML с датами?
  • Создание рабочей книги только с MVC-контроллера с OpenXML
  • Добавление строк в конец документа excel с использованием OpenXmlSDK c #
  • чтение формулы из таблицы с помощью openxml
  • Используйте SSIS для заполнения книги Excel, созданной с использованием OOXML
  • Как выводить таблицу Excel с изображениями из ASP.net
  • Как перейти из рабочего листа в таблицу документов?
  • Как создать несколько листов в Excel?
  • Вставить графику Excel в документ Word с OpenXML, работающим с Word 2010 и 2003
  • DocumentFormat.openxml Проблема чтения файлов Excel
  • Открыть xml sdk читать значения Number и datetime / number
  • Interesting Posts

    VBA для сохранения рабочего листа с определенным именем

    Использование Microsoft.Office.Interop для сохранения созданного файла с помощью C #

    Код VBA для изменения формата даты в слайде PPT внутри текстового поля

    excel 2007 XY lookup

    Могу ли я копировать таблицы запросов (и соединения?) В другие книги?

    Excel – найдите верхние значения «Х» на основе критериев

    Как объединить несколько рабочих листов Excel в одну книгу с помощью Perl?

    Ошибка Weird Excel при удалении листа с именованными диапазонами?

    Заполнять весь столбец на основе выбора из выпадающего списка в excel

    Как получить значение ячейки после ввода значения?

    Как читать xlsx-файлы в Java 1.4?

    Как скопировать диапазон в рабочую книгу temp и вернуть ссылку на него с помощью функции vba?

    Excel VBA обратный результат запроса ado

    Excel сбой иногда при закрытии из общего сетевого расположения

    Автозаполнение макроса, возникла ошибка при объединении ячейки в столбце

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