【发布时间】:2018-08-08 08:47:25
【问题描述】:
我正在编写一个 python 脚本来在xls 文件中添加一个新工作表,并且我正在使用xlrd、xlutils.copy 和xlwt 来执行此操作。这是我的代码的样子:
wb=xlwt.Workbook()
rb=xlrd.open_workbook(MY_FILE_PATH, formatting_info=True)
wb = copy(rb)
sht1 = wb.add_sheet('newSheet')
-- add some data
wb.save(MY_FILE_PATH)
问题是,我在现有工作表中未触及的某些单元格的格式(您可以看到我只添加了一个新工作表)已更改。具体来说,我有两个变化:
一些原本格式为日期的单元格(默认为 格式为
yyyy/m/d)现在自定义格式(和格式 字符串为m/d/yy)。我丢失了我在
conditional formatting中设置的所有格式。
有人能告诉我如何在不需要修改的单元格中保留格式吗?我在windows 和xlrd version 1.1.0、xlutils 2.0.0、xlwt 1.3.0 上使用python 3.5.5 64 bits。非常感谢!
更新:
我通过将上次调用 wb.save(MY_FILE_PATH) 更改为 wb.save(MY_FILE_PATH_2) 进行了更多测试,即我用新名称保存了文件。我可以看到,只有在 save 调用后文件才被更改(在这种情况下,原始 MY_FILE_PATH 保持不变)。实际上,新保存的文件的大小比原始文件小,即使新文件添加了一张纸。这表明在save 调用中丢失了一些格式信息。至少从我所看到的情况来看,conditional formatting 丢失了,从而减小了大小(我假设日期格式的更改不会对文件大小影响太大)。
【问题讨论】:
-
您是否尝试使用 excel 和 libre office calc 打开它,看看它是来自 excel 还是您的代码
-
@KostadinSlavov 你指的是哪一步?当我在
open_workbook调用之前打开文件时,该文件没有被触及,并且符合要求。下一次调用copy在内存中制作了原始文件的单独副本,并且在此之后直到最后一行save的所有操作都是针对此副本进行的,而不是直接针对原始文件(换句话说,当我在 Excel 中打开它并检查),只有在save调用之后,我描述的更改才被添加并保存到磁盘中的文件中。 -
听起来您正在使用的模块正在阅读整个工作表,但缺少条件格式。这可以解释我的他们没有正确地将它们再次写出来。您是否考虑过尝试 xlsxwriter ?见xlsxwriter.readthedocs.io
-
@DavidGaertner 它是否也适用于
xls格式?因为我需要处理旧格式的遗留电子表格。当我在网上搜索时,我发现openpyxl仅适用于xlsx,据我了解,从您的链接中了解xlsxwriter也是如此? -
xls 格式是一个有趣的转折。我想知道使用 xlrd 阅读和使用 xlsxwriter 写作是否是一种选择。另外,我找到了这个答案,希望对您有所帮助:stackoverflow.com/questions/16448882/…