使用 openpyxl 将数据写入现有的 Excel 工作表

Posted

技术标签:

【中文标题】使用 openpyxl 将数据写入现有的 Excel 工作表【英文标题】:Writing data to an existing excel sheet using openpyxl 【发布时间】:2015-11-18 05:23:07 【问题描述】:

总的来说,我对编码不熟悉。

我想要实现的是制作一个在 excel 中运行到雇主列表的脚本,并每周生成一个新的小时表。通过生成我的意思是为每个雇主复制一个空的小时表并重命名它,并在新制作的副本中更改周数和雇主名称。

我没有从循环开始,因为我首先想制作更改雇主名称和周数的部分。我已经在互联网上搜索了一些答案,但我无法让代码工作,不断收到错误消息。

到目前为止,这是我的代码:

import os
import shutil
import time
from openpyxl import load_workbook

#calculate the year and week number
from time import strftime
year = (time.strftime("%Y"))
week = str(int(time.strftime("%W"))+1)
year_week = year + "_" + week

#create weekly houresheets per employer
employer = "Adam"
hsheets_dir = "C:\\test\\"
old_file_name = "blanco.xlsx"
new_file_name = employer + "_" + year_week + ".xlsx"
dest_filename = (hsheets_dir + new_file_name)

shutil.copy2((hsheets_dir + old_file_name), dest_filename)

#change employer name and weeknumber
def insert_xlsx(dest, empl, wk):
    #Open an xlsx for reading
    print (dest)
    wb = load_workbook(filename = dest)
    #Get the current Active Sheet
    ws = wb.get_sheet_by_name("Auto")
    ws.cell(row=1,column=2).value = empl
    ws.cell(row=2,column=2).value = wk
    wb.save(dest)

insert_xlsx(dest_filename, employer, week_str)

这是我不断收到的错误消息:

    Traceback (most recent call last):
  File "G:\ALL\Urenverantwoording\Wekelijks\Genereer_weekstaten.py", line 46, in <module>
    insert_xlsx(dest_filename, employer, week)
  File "G:\ALL\Urenverantwoording\Wekelijks\Genereer_weekstaten.py", line 44, in insert_xlsx
    wb.save(dest)
  File "C:\Python34\lib\site-packages\openpyxl\workbook\workbook.py", line 298, in save
    save_workbook(self, filename)
  File "C:\Python34\lib\site-packages\openpyxl\writer\excel.py", line 198, in save_workbook
    writer.save(filename, as_template=as_template)
  File "C:\Python34\lib\site-packages\openpyxl\writer\excel.py", line 181, in save
    self.write_data(archive, as_template=as_template)
  File "C:\Python34\lib\site-packages\openpyxl\writer\excel.py", line 87, in write_data
    self._write_worksheets(archive)
  File "C:\Python34\lib\site-packages\openpyxl\writer\excel.py", line 114, in _write_worksheets
    write_worksheet(sheet, self.workbook.shared_strings,
  File "C:\Python34\lib\site-packages\openpyxl\writer\worksheet.py", line 302, in write_worksheet
    xf.write(comments)
  File "C:\Python34\lib\contextlib.py", line 66, in __exit__
    next(self.gen)
  File "C:\Python34\lib\site-packages\openpyxl\xml\xmlfile.py", line 51, in element
    self._write_element(el)
  File "C:\Python34\lib\site-packages\openpyxl\xml\xmlfile.py", line 78, in _write_element
    xml = tostring(element)
  File "C:\Python34\lib\xml\etree\ElementTree.py", line 1126, in tostring
    short_empty_elements=short_empty_elements)
  File "C:\Python34\lib\xml\etree\ElementTree.py", line 778, in write
    short_empty_elements=short_empty_elements)
  File "C:\Python34\lib\xml\etree\ElementTree.py", line 943, in _serialize_xml
    short_empty_elements=short_empty_elements)
  File "C:\Python34\lib\xml\etree\ElementTree.py", line 943, in _serialize_xml
    short_empty_elements=short_empty_elements)
  File "C:\Python34\lib\xml\etree\ElementTree.py", line 935, in _serialize_xml
    v = _escape_attrib(v)
  File "C:\Python34\lib\xml\etree\ElementTree.py", line 1093, in _escape_attrib
    _raise_serialization_error(text)
  File "C:\Python34\lib\xml\etree\ElementTree.py", line 1059, in _raise_serialization_error
    "cannot serialize %r (type %s)" % (text, type(text).__name__)
TypeError: cannot serialize 3 (type int)

有人能帮我指明正确的方向吗?

非常感谢

【问题讨论】:

如果将保存行更改为wb.save(filename=dest),您能看到会发生什么吗? 当您只加载/保存工作簿而不进行修改时会发生什么?因为除了未定义的week_str(我认为这是一个 c&p 错误)之外,您的代码似乎很好,所以也许 openpyxl 无法正确处理原始工作表。 @Martin 感谢您的快速回复,然后我收到以下错误消息:文件“C:\Python34\lib\xml\etree\ElementTree.py”,第 1059 行,在 raise_serialization_error "cannot serialize %r (type %s)" % (text, type(text).__name_) TypeError: cannot serialize 3 (type int) 从@dhke 开始,如果您尝试使用默认的空 Excel 文件,而不是您要修改的文件,会发生什么情况? @dhke 仍然出现同样的错误,所以这意味着 openpyxl 可以处理我的 excel 文件。您现在是否有任何解决方法? 【参考方案1】:

根据您的回答,我认为问题在于您现有的小时表 Excel 电子表格:

    尝试从现有电子表格的副本开始并删除所有条目。希望这也能奏效。

    如果失败,请从新的空白电子表格开始。

    逐位复制现有数据并重复您的脚本。

通过这样做,您可能能够隔离与openpyxl 不兼容的功能。

或者,您可以使用 Python 脚本编写整个内容,而无需尝试修改半填充的内容。这将是 100% 兼容的。

【讨论】:

Evens,感谢您的帮助,今晚会试试这个。如果我找到了负责的部分,现在让你看看。还将研究用 python 构建完整的文档。

以上是关于使用 openpyxl 将数据写入现有的 Excel 工作表的主要内容,如果未能解决你的问题,请参考以下文章

在 php(网页)中运行 Python 脚本以写入现有的 excel

如何使用`openpyxl`库在Excel中的合并单元格中写入?

ruby excel - 将数据写入现有的xls

如何将数据从闪亮的应用程序写入exce / csv文件?恰好我想将股票价格值的值写入excel / csv文件

使用 pandas 和 XlsxWriter 写入现有的 .xlsm

如何使用 fast-csv npm 将新行或新行的数据(新行)附加到现有的 csv 文件