Я создаю листы Excel в несколько древнем варианте SpreadsheetML 2003 года (в основном потому, что все содержится в одном файле). Попытка реализовать список выбора сводит меня с ума - либо из-за моей глупости, либо из-за отсутствия документации.
Взгляните на это (отлично работает с последними версиями Excel):
<?xml version = "1.0"?>
<?mso-application progid = "Excel.Sheet"?>
<Workbook xmlns = "urn:schemas-microsoft-com:office:spreadsheet" xmlns:x = "urn:schemas-microsoft-com:office:excel" xmlns:ss = "urn:schemas-microsoft-com:office:spreadsheet" xmlns:html = "http://www.w3.org/TR/REC-html40">
<Worksheet ss:Name = "input">
<ss:Table>
<ss:Row>
<ss:Cell><ss:Data ss:Type = "String"/></ss:Cell>
</ss:Row>
<ss:Row>
<ss:Cell><ss:Data ss:Type = "String">Anna</ss:Data></ss:Cell>
<ss:Cell><ss:Data ss:Type = "String">Berta</ss:Data></ss:Cell>
<ss:Cell><ss:Data ss:Type = "String">Claudia</ss:Data></ss:Cell>
</ss:Row>
</ss:Table>
<DataValidation xmlns = "urn:schemas-microsoft-com:office:excel">
<Range>R1C1</Range>
<Type>List</Type>
<Value>input!R2</Value>
</DataValidation>
</Worksheet>
<Worksheet ss:Name = "check">
<ss:Table>
<ss:Row>
<ss:Cell><ss:Data ss:Type = "String"/></ss:Cell>
</ss:Row>
<ss:Row>
<ss:Cell><ss:Data ss:Type = "String">Alfred</ss:Data></ss:Cell>
<ss:Cell><ss:Data ss:Type = "String">Bruno</ss:Data></ss:Cell>
<ss:Cell><ss:Data ss:Type = "String">Clemens</ss:Data></ss:Cell>
</ss:Row>
</ss:Table>
</Worksheet>
</Workbook>
Два листа, содержащие список имен в строке 2, плюс одна ячейка с простым правилом проверки: input! A1 может содержать только одно из имен «Анна», «Берта» или «Клаудиа». Работает как положено.
Но затем я изменяю валидацию на то, чего я действительно хочу достичь (т. Е. Использую список из другого листа):
<Value>check!R2</Value>
Он по-прежнему загружается в Excel, но раскрывающегося списка нет. Если я посмотрю на правила проверки, Excel заявит об «справочной ошибке» (или аналогичной - я использую немецкий язык), хотя я не могу найти никакой ошибки в «check! R2». Я могу исправить это вручную, чтобы проверить! $ 2: $ 2 (способ привязки ячеек к пользовательскому интерфейсу), я могу сохранить результат в XML-файл, и результатом будет именно та «проверка! R2», которую я безуспешно пробовал ...
Но как только я открываю (сохраненный) файл, ссылка снова недействительна.
Это сводит меня с ума - должен быть способ некоторый для проверки значений из другого рабочего листа. К сожалению, документации не так много (и никогда не было); один из моих источников - https://schemas.liquid-technologies.com/Office/2003/?page=excelss_xsd.html, в котором перечислены все доступные теги, но не детали их семантики.
Есть идеи?
Я не думаю, что Рори прав с Excel 2003, особенно с учетом того, что вы можете вручную заставить его работать. Возможно, Рори имеет в виду версии Excel до 2003. В книгах Excel иногда возникают внутренние ошибки, и единственный способ исправить это - открыть новую книгу и затем скопируйте лист из старой книги в новую. Я видел, как это происходило чаще с Excel 2003, чем с новыми версиями Excel. Стоит попробовать.
В 2003 году и ранее вы не могли напрямую использовать источник списка DV на другом листе. Все изменилось в 2007 году.


Этой старой схемы 2003 XML следует избегать. Но если они используются, то можно использовать только те функции, которые были доступны и в 2003 году. Так что @Rory прав в своих комментариях. В 2003 году Excel не мог напрямую получать списки проверки данных с других листов. Должны быть созданы именованные диапазоны, которые относятся к другому листу. И эти Name тогда упоминались в списке проверки данных.
Итак, будет работать следующее:
<?xml version = "1.0"?>
<?mso-application progid = "Excel.Sheet"?>
<Workbook xmlns = "urn:schemas-microsoft-com:office:spreadsheet" xmlns:x = "urn:schemas-microsoft-com:office:excel" xmlns:ss = "urn:schemas-microsoft-com:office:spreadsheet" xmlns:html = "http://www.w3.org/TR/REC-html40">
<Names>
<NamedRange ss:Name = "ceckRow2" ss:RefersTo = "=check!R2"/>
</Names>
<Worksheet ss:Name = "input">
<ss:Table>
<ss:Row>
<ss:Cell><ss:Data ss:Type = "String"/></ss:Cell>
</ss:Row>
<ss:Row>
<ss:Cell><ss:Data ss:Type = "String">Anna</ss:Data></ss:Cell>
<ss:Cell><ss:Data ss:Type = "String">Berta</ss:Data></ss:Cell>
<ss:Cell><ss:Data ss:Type = "String">Claudia</ss:Data></ss:Cell>
</ss:Row>
</ss:Table>
<DataValidation xmlns = "urn:schemas-microsoft-com:office:excel">
<Range>R1C1</Range>
<Type>List</Type>
<Value>ceckRow2</Value>
</DataValidation>
</Worksheet>
<Worksheet ss:Name = "check">
<ss:Table>
<ss:Row>
<ss:Cell><ss:Data ss:Type = "String"/></ss:Cell>
</ss:Row>
<ss:Row>
<ss:Cell><ss:Data ss:Type = "String">Alfred</ss:Data></ss:Cell>
<ss:Cell><ss:Data ss:Type = "String">Bruno</ss:Data></ss:Cell>
<ss:Cell><ss:Data ss:Type = "String">Clemens</ss:Data></ss:Cell>
</ss:Row>
</ss:Table>
</Worksheet>
</Workbook>
Ой ну спасибо. Я не ожидал, что Excel сохранит что-то, что выглядит вполне разумным, но это не так. С NamedRange все работает нормально. Дополнительный вопрос: какой еще формат использовать? Мне ничего не известно о том, чтобы объединять данные, стили и формулы в один файл (что значительно упрощает создание так).
@SlowFox: «Я не ожидал, что Excel сохранит что-то, что выглядит вполне разумным, но это не так»: он предупреждает, что функции могут быть потеряны. Да и тогда так бывает часто. Сделайте сохранение, а затем всегда повторно открывайте текущее сохраненное и проверяйте.
@SlowFox: не существует схемы XML, которая могла бы описать все возможные функции книги Excel. Вот почему Office Open XML (*.xlsx) - это архив ZIP, содержащий файлы несколькоXML, а также другие файлы.
Спасибо, тогда я останусь с этим форматом. Я использую его, чтобы предоставлять клиентам простые, но все же красивые отчеты и формы для ввода данных. Я не мог оправдать усилия по созданию xlsx (не говоря уже о усилиях по пониманию этого монстра).
В более старых версиях Excel вы не могли использовать прямую ссылку на другой рабочий лист в качестве источника списка DV; вам пришлось использовать именованный диапазон. Возможно, это связано?