Excel XLSX XML-манипулирование: избежать «числа, хранящегося в виде текста» и неисчислимых формул при непосредственном изменении кишок XLSX? - PullRequest
4 голосов
/ 03 апреля 2012

Я автоматизирую процесс создания пакета отчетов в Excel. Файлы Excel используются в качестве шаблонов отчетов, а заполнители, такие как ^SOME_DATA^, заменяются скриптом Python, который распаковывает файл .XLSX, выполняет базовый поиск и замену в файлах sharedStrings.xml и sheet1.xml, а затем повторно упаковывает готовый файл. , Эта часть работает (наконец-то).

Однако при открытии нового файла в Excel все числа, заменившие заполнители, помечаются Excel как «Число, хранимое как текст» (что, конечно, приводит к сбою как формул, так и форматирования на листе). Большинство заполнителей были сохранены в Excel в sharedStrings.xml, и с учетом «строковой» части я не удивлен, что они все еще рассматриваются как строки.

Пока ...

  • Я попытался привести с =VALUE(A1) (и т. Д.), Чтобы преобразовать текстовые числа в фактические числа ... это работает в интерактивном режиме, но не удается, когда файл создается программно: ячейка формулы отображается как #VALUE! (Всплывающее окно: «Ошибка в значении»), если вы не отредактируете его и не нажмете Enter.

  • Я предпочитаю Python, так как он подходит к остальной части автоматизации, но мог бы переделать код поиска / замены / сохранения в VBA, чтобы «вытащить его из двери» в менее автоматизированном состоянии. Однако лично мне не очень повезло с надежностью и надежностью решений VBA.

  • openpyxl хорошо (разумно) хорошо подходит для чтения или написания Excel, но не поддерживает внесение изменений в существующий отформатированный файл.

Ответы [ 3 ]

1 голос
/ 18 мая 2013

Правильная конструкция, вероятно, такова:

<c ... t="inlineStr"><is>Inline text</is>

Это & hellip;

<c ... t="str">Inline text</c>

& hellip; для формул.

См. " В чем разница между и в Office Open XML? ".

1 голос
/ 04 апреля 2012

Я не специалист по Open XML, но я полагаю, что вы можете решить эту проблему, записав числовое значение непосредственно в xml-файл листа (sheet1.xml). Сначала вам нужно будет найти xml-файл листа, чтобы найти ячейки, содержащие строки. Эти ячейки имеют атрибут t = "s". Значение узла v является индексом указанной строки в файле sharedStrings.xml.

    <row r="8" spans="1:6" x14ac:dyDescent="0.25">
        <c r="F8" t="s">
            <v>2</v>
        </c>
    </row>

Вы можете проверить, ссылается ли ячейка на строку заполнителя (индекс ^ SOME_DATA ^ в sharedStrings.xml). Если это так, то вы можете заменить строковый индекс числовым значением и удалить атрибут t:

        <c r="F8" t="s">
            <v>2</v>
        </c>

становится

        <c r="F8">
            <v>812397568</v>
        </c>

Надеюсь, это поможет.

0 голосов
/ 06 апреля 2012

Альтернативный подход к шаблону таблицы sharedStrings заключается в шаблонировании строк / чисел в самих ячейках.

Например, вот запись общей строки, созданная в Excel:

<!-- Value 0 refers to a string in sharedStrings table -->
<c r="A1" t="s"> 
    <v>0</v> 
</c>

Замените это строчной строкой:

<!-- Replace the type with str for an inlined string -->
<c r="A1" t="str"> 
    <v>Some new text here</v> 
</c>

или числом:

<!-- Drop the t type for numbers -->
<c r="A1"> 
    <v>12345</v> 
</c>

Подробнее об этом см. Создание простых таблиц SpreadsheetML при создании электронных таблиц в OpenXML Developer.

Обратите внимание, строго говоря, это не встроенная строка, поскольку в стандарте это имеет особое значение, другой тип t и чуть более сложную структуру.Эта строка t ="str" на самом деле является частью строки формулы.Тем не менее, это удобный обходной путь.

...