首页 > 解决方案 > 在 PHP 中从 XLSM 编辑 Excel XML 工作表文件

问题描述

我有一个 XLSM 文件,我需要在其中使用 PHP 编辑一些单元格值。由于我找不到合适的库,它实际上可以编辑 xlsm 文件(大多数读取 excel 并创建一个全新的 excel 文件,在这种情况下会删除 excel 中的宏甚至抛出太多异常),我决定解压缩 xlsm 文件并通过更改单元格中的值直接编辑工作表 xml 文件:

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

例如,我会更改“v”标签内的值。

由于简单 XML 不起作用,因为它弄乱了文件中的一些命名空间,我决定使用正则表达式对其进行编辑。

到目前为止一切顺利 - 我在文件中得到了更改。但是 Excel 文件中的公式(取决于我刚刚更改值的单元格)不会识别我的更改。当您打开 Excel 文件时,它会正确显示正确的值,但在公式中使用该更改值的其他单元格不会更新。

有谁知道如何正确更改 XML 文件并保持 excel 完好无损?

谢谢!

标签: phpexcelxlsxlsm

解决方案


由于我无法在 PHP 和以前使用 C++ 的解决方案中找到解决方案(Is there a PHP library for XLSM(Excel with Macro) parsing/editing?)对我来说在哪里复杂,我找到了一个使用 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 文件,您可以编写在 python 中编辑 xlsm 的完整代码。

但是,此代码对我有用。它编辑 Excel,里面的所有公式/计算都很好,宏也没有改变。


推荐阅读