【问题标题】:xlwt/xlutils.copy doesn't preserve cell (which I didn't touch) formatxlwt/xlutils.copy 不保留单元格(我没有触摸)格式
【发布时间】: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/…

标签: python excel xlwt xlutils


【解决方案1】:

看起来 xlrd 还不支持条件格式。

您可以通过将 verbosity=1 传递给 open_workbook 函数来查看错误日志。

rb=xlrd.open_workbook(MY_FILE_PATH,formatting_info=True,verbosity=1)

另外,openpyxl 似乎支持“条件格式”。可以改为检查这个包。

【讨论】:

  • 感谢您指出查看错误日志的方法。现在我看到日志包含*** WARNING: Ignoring CONDFMT (conditional formatting) record 的可能条目。而且由于openpyxl似乎不适用于xls文件,我想我不得不放弃python并尝试寻找其他工具来完成这项工作
猜你喜欢
  • 1970-01-01
  • 2012-01-21
  • 2016-08-27
  • 1970-01-01
  • 1970-01-01
  • 2011-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多