Редактировать файл таблицы Excel XML из XLSM в PHP - PullRequest
1 голос
/ 17 июня 2020

У меня есть файл XLSM, в котором мне нужно отредактировать некоторые значения ячеек с помощью PHP. Поскольку мне не удалось найти подходящую библиотеку, которая действительно может редактировать файл xlsm (большинство читают excel и создают совершенно новый файл excel, который в этом случае удалит макросы внутри excel или даже вызовет слишком много исключений), я решил чтобы разархивировать файл xlsm и напрямую отредактировать файл xml рабочего листа, изменив значения в ячейках:

<c r="K15" s="52">
   <v>83221.56</v>
</c>

Например, я бы изменил значение внутри тега «v».

Поскольку простой XML не работает, потому что он портит некоторые пространства имен внутри файла, я решил отредактировать его с помощью регулярных выражений.

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

Кто-нибудь знает, как правильно изменить XML Файл и сохранить Excel в такт?

Спасибо!

1 Ответ

0 голосов
/ 19 июня 2020

Поскольку я не мог найти решение в PHP и предыдущих решениях на C ++ ( Есть ли библиотека PHP для анализа / редактирования XLSM (Excel с макросами)? ) где усложнять для Я нашел решение с python, я хочу поделиться.

Моя среда - Ubuntu 16.04, у меня установлено Python. Я установил https://editpyxl.readthedocs.io/en/latest/

Я поместил небольшой сценарий в тот же каталог, что и сценарий PHP, который я вызываю с помощью PHP:

from editpyxl import Workbook
import sys
import logging

logging.basicConfig()

if len(sys.argv) != 4:
    print("Three arguments accepted, got " + (str(len(sys.argv) -1)))
    print("Argument 1: Sheet name, Argument 2: Cell Identifier, Argument 3: New Value")
    sys.exit();

wb = Workbook()
source_filename = r'OriginalFile.xlsm'
wb.open(source_filename)
ws = wb[sys.argv[1]]
ws.cell(sys.argv[2]).value = sys.argv[3]
destination_filename = "NewFile.xlsm"
wb.save(destination_filename)
wb.close()

В PHP я вызываю его через

exec('python excel.py "SheetName" "CellName" "NewValue"')

Кажется, это обходной путь, но он работает (особенно на Linux) и его очень легко реализовать. Однако у этого решения есть ограничение по производительности. Сценарий python читает, изменяет значение и сохраняет файл excel в каждой среде выполнения. Если вам нужно изменить только некоторые значения, это может не быть проблемой, но если вы планируете редактировать файлы Excel большего размера с большим количеством ячеек для редактирования, вы можете написать полный код, который редактирует xlsm в python.

Этот код, однако, у меня работает. Он редактирует Excel, и все формулы / расчеты внутри остаются в порядке, макросы остаются нетронутыми.

...