php - 在 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 完好无损?
谢谢!
解决方案
由于我无法在 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,里面的所有公式/计算都很好,宏也没有改变。
推荐阅读
- android - 如何为android中的自适应图标格式化/调整VectorDrawable的大小
- css - 调整 vuetify 数据表“每页行数”菜单宽度的宽度,因为文本被截断
- python - 更新到最新的 Yocto 版本 sanity.bbclass 问题
- vb.net - 如何将时间输入 hh;mm;ss 转换为 hh:mm:ss
- android - gradle.properties 会被构建时的 Jenkins 环境变量覆盖吗?
- c# - 条件优化/可读性
- c# - 可以写 [Test, OneTimeSetup] 吗?
- java - 如何更新媒体商店中的流派?
- ruby-on-rails - 如何将类添加到 erb 语句(在表单中,而不是在 do 语句中)
- c - 显式前向声明函数后的预标准 C 函数头语法