简体   繁体   中英

Writing data to an existing excel sheet using openpyxl

I'm quit new to coding in general.

What i want to achieve is to make an script that runs to a list of employers in excel and weekly generate a new hour-sheet. And by generating i mean copy for every employer an empty hour-sheet and rename it, and also change the week-number and employer-name in the newly made copy.

I didn't start with a loop, because i first wanted to made the part that change the employers-name and week-number. I've already search the internet for some answers, but i can't get the code to work, keep getting error messages.

So here is my code so far:

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)

And here is the error message i keep getting:

    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)

Can somewone put me in the right directions?

Many thanks

I think based on your responses then that the problem lies with your existing hour-sheet Excel spreadsheet:

  1. Try starting with a copy of your existing spreadsheet and removing all of the entries. Hopefully this too will work.

  2. If this fails, start with a new blank spreadsheet.

  3. Bit by bit copy the existing data and repeat your script.

By doing this you will might be able to isolate the feature which is not compatible with openpyxl .

Alternatively, you might be able to write the whole thing from your Python script, and skip trying to modify a semi-filled in one. This would then be 100% compatible.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM