Python openpyxl无法保存具有自定义列宽的现有Excel

时间:2014-01-16 04:28:30

标签: python excel openpyxl

我正在使用模板生成一个Excel,

from openpyxl import Workbook
from openpyxl import load_workbook

src_file = 'D:\\code\\TestLink-Report\\pyxl.xlsx'
wb = load_workbook(filename = src_file, guess_types = False)

sheet = wb.worksheets[0]
sheet.cell('A1').value = 'blabla'
wb.save(filename =  src_file)

如果src_file是新的空白,它可以工作。 如果我通过手动更改src文件中任何列的宽度,再次运行代码,它将失败

    wb.save(filename =  src_file)
  File "D:\Python27\envs\TestLink\lib\site-packages\openpyxl\workbook.py", line 265, in save
    save_workbook(self, filename)
  File "D:\Python27\envs\TestLink\lib\site-packages\openpyxl\writer\excel.py", line
 187, in save_workbook
    writer.save(filename)
  File "D:\Python27\envs\TestLink\lib\site-packages\openpyxl\writer\excel.py", line
 170, in save
    self.write_data(archive)
  File "D:\Python27\envs\TestLink\lib\site-packages\openpyxl\writer\excel.py", line
 98, in write_data
    self._write_worksheets(archive, shared_string_table, self.style_writer)
  File "D:\Python27\envs\TestLink\lib\site-packages\openpyxl\writer\excel.py", line
 128, in _write_worksheets
    style_writer.get_style_by_hash()))
  File "D:\Python27\envs\TestLink\lib\site-packages\openpyxl\writer\worksheet.py", line 98, in write_worksheet
    write_worksheet_cols(doc, worksheet, style_table)
  File "D:\Python27\envs\TestLink\lib\site-packages\openpyxl\writer\worksheet.py", line 209, in write_worksheet_cols
    col_def['style'] = str(style_table[hash(columndimension.style_index)])
KeyError: 549131827

我正在使用Excel 2013。 我听说openpyxl在stackoverflow上搜索后不支持样式。但我的问题似乎应该是一件简单的事情。

3 个答案:

答案 0 :(得分:1)

此问题已得到解决here

运行此命令以获取最新版本

hg clone https://bitbucket.org/ericgazoni/openpyxl
cd openpyxl/
hg up 1.8
python setup.py develop

答案 1 :(得分:0)

是否可以使用 win32com 作为选项?可以在下面进行简单的列格式化:

from win32com.client import Dispatch

xl = Dispatch("Excel.Application")
filestr = "C:\blah\pytest.xlsx"
wbk = xl.Workbooks.Open(filestr)

wsht = wbk.Sheets(1)
wsht.Range("A1").Value = "Hello World!"
wsht.Columns(1).ColumnWidth = 50
wbk.SaveAs("C:\blah\pytested.xlsx")

xl.Application.Quit()

如果您只需要调整列宽,则可以将其与 openpyxl 结合使用。

如果有帮助,请告诉我们。 :)

答案 2 :(得分:0)

openpyxl目前正在进行工作以解决您遇到的错误。 1.8和1.9分支当前都会阻止它发生,但生成的Excel文件可能无法使用。