使用 openpyxl 更新复杂电子表格中的某些列
using openpyxl to update certain columns in a complex spreadsheet
您好,我有一个非常复杂的电子表格,我需要更新 "ONLY" 其内容的某些部分。
我尝试了 openpyxl,除了所有数据透视表、样式和公式都丢失外,它工作正常,保存工作簿后。有办法解决这个问题吗?
检查您安装的是哪个版本的openpyxl。仅在版本 2.5.0-a1 (2017-05-30) 中添加了对 Pivot Tables 的支持,并且仅支持一个 Pivot Table 直到版本 2.5.0-b2 (2018-01- 19).参见 changelog。
备选方案:Simplify、xlwings、内容保护和 win32com(最有可能)。
如果您使用的是 2.5 而它不起作用,那么如果您想继续使用 openpyxl,您可能必须简化您的电子表格。例如。将其拆分为源文件和输出文件,并使用 python 更新源文件。
您可以尝试 运行 xlwings 在电子表格本身中托管 Python 代码。
另一种可能的解决方案是锁定内容 - 打开保护 - 除了您计划更新的部分之外的所有内容。这不太可能起作用,因为 python 正在直接更改内容,但它可能会考虑锁定。
最后,最有可能成功的结果。通过 win32com 模块驱动更改。我认为这与 openpyxl 不同,需要安装 Excel,因为它使用 Excel 的功能进行更改。用法示例为 here and here.
一个简单的例子(摘自here):
import win32com.client as win32
excel = win32.gencache.EnsureDispatch('Excel.Application')
wb = excel.Workbooks.Add()
ws = wb.Worksheets("Sheet1")
ws.Cells(1,1).Value = "Cell A1"
ws.Cells(1,1).Offset(2,4).Value = "Cell D2"
ws.Range("A2").Value = "Cell A2"
ws.Range("A3:B4").Value = "A3:B4"
ws.Range("A6:B7,A9:B10").Value = "A6:B7,A9:B10"
wb.SaveAs('ranges_and_offsets.xlsx')
excel.Application.Quit()
您好,我有一个非常复杂的电子表格,我需要更新 "ONLY" 其内容的某些部分。
我尝试了 openpyxl,除了所有数据透视表、样式和公式都丢失外,它工作正常,保存工作簿后。有办法解决这个问题吗?
检查您安装的是哪个版本的openpyxl。仅在版本 2.5.0-a1 (2017-05-30) 中添加了对 Pivot Tables 的支持,并且仅支持一个 Pivot Table 直到版本 2.5.0-b2 (2018-01- 19).参见 changelog。
备选方案:Simplify、xlwings、内容保护和 win32com(最有可能)。
如果您使用的是 2.5 而它不起作用,那么如果您想继续使用 openpyxl,您可能必须简化您的电子表格。例如。将其拆分为源文件和输出文件,并使用 python 更新源文件。
您可以尝试 运行 xlwings 在电子表格本身中托管 Python 代码。
另一种可能的解决方案是锁定内容 - 打开保护 - 除了您计划更新的部分之外的所有内容。这不太可能起作用,因为 python 正在直接更改内容,但它可能会考虑锁定。
最后,最有可能成功的结果。通过 win32com 模块驱动更改。我认为这与 openpyxl 不同,需要安装 Excel,因为它使用 Excel 的功能进行更改。用法示例为 here and here.
一个简单的例子(摘自here):
import win32com.client as win32
excel = win32.gencache.EnsureDispatch('Excel.Application')
wb = excel.Workbooks.Add()
ws = wb.Worksheets("Sheet1")
ws.Cells(1,1).Value = "Cell A1"
ws.Cells(1,1).Offset(2,4).Value = "Cell D2"
ws.Range("A2").Value = "Cell A2"
ws.Range("A3:B4").Value = "A3:B4"
ws.Range("A6:B7,A9:B10").Value = "A6:B7,A9:B10"
wb.SaveAs('ranges_and_offsets.xlsx')
excel.Application.Quit()