Электронная таблица Excel 2002 XML - проблема проверки

Я создаю листы 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 вы не могли использовать прямую ссылку на другой рабочий лист в качестве источника списка DV; вам пришлось использовать именованный диапазон. Возможно, это связано?

Rory 30.03.2021 00:46

Я не думаю, что Рори прав с Excel 2003, особенно с учетом того, что вы можете вручную заставить его работать. Возможно, Рори имеет в виду версии Excel до 2003. В книгах Excel иногда возникают внутренние ошибки, и единственный способ исправить это - открыть новую книгу и затем скопируйте лист из старой книги в новую. Я видел, как это происходило чаще с Excel 2003, чем с новыми версиями Excel. Стоит попробовать.

jdweng 30.03.2021 00:51

В 2003 году и ранее вы не могли напрямую использовать источник списка DV на другом листе. Все изменилось в 2007 году.

Rory 30.03.2021 01:09
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
0
3
30
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Этой старой схемы 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 30.03.2021 13:35

@SlowFox: «Я не ожидал, что Excel сохранит что-то, что выглядит вполне разумным, но это не так»: он предупреждает, что функции могут быть потеряны. Да и тогда так бывает часто. Сделайте сохранение, а затем всегда повторно открывайте текущее сохраненное и проверяйте.

Axel Richter 30.03.2021 13:42

@SlowFox: не существует схемы XML, которая могла бы описать все возможные функции книги Excel. Вот почему Office Open XML (*.xlsx) - это архив ZIP, содержащий файлы несколькоXML, а также другие файлы.

Axel Richter 30.03.2021 13:55

Спасибо, тогда я останусь с этим форматом. Я использую его, чтобы предоставлять клиентам простые, но все же красивые отчеты и формы для ввода данных. Я не мог оправдать усилия по созданию xlsx (не говоря уже о усилиях по пониманию этого монстра).

SlowFox 30.03.2021 14:04

Другие вопросы по теме