2015-08-24 4 views
4

Я вообще-то отказался от кодирования.Запись данных на существующий лист excel с использованием openpyxl

Что я хочу достичь, так это сделать скрипт, который работает со списком работодателей в 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) 

Может somewone поместить меня в правильном направлении?

Большое спасибо

+1

Не могли бы вы увидеть, что произойдет, если вы измените строку сохранения на 'wb.save (filename = dest)'? –

+1

Что происходит, когда вы просто загружаете или сохраняете книгу без изменений? Потому что, кроме неопределенного 'week_str' (который я предполагаю, это ошибка c & p), ваш код кажется прекрасным, поэтому, возможно, openpyxl не может правильно обрабатывать исходный лист. – dhke

+0

@Martin Спасибо за быстрый ответ, тогда я получаю следующее сообщение об ошибке: Файл «C: \ Python34 \ lib \ xml \ etree \ ElementTree.py», строка 1059, в _raise_serialization_error «не может сериализовать% r (type % s) "% (текст, тип (текст) .__ name__) ТипError: невозможно сериализовать 3 (тип int) – MNijland

ответ

0

Я думаю, что на основе ваших ответов тогда, что проблема заключается в существующий час листов Excel таблицы:

  1. Попробуйте начать с копией существующей таблицы и удаления всех записи. Надеюсь, это тоже сработает.

  2. Если это не удается, начните с новой пустой таблицы.

  3. Побитовое копирование существующих данных и повторение сценария.

Делая это, вы могли бы выделить функцию, которая не совместима с openpyxl.

В качестве альтернативы, вы можете написать все это из своего сценария Python и пропустить попытку изменения полузаполненного в одном. Тогда это будет на 100% совместимо.

+0

Эвенс, спасибо за помощь, попробует это сегодня вечером. Позвольте вам теперь, если я найду часть, которая несет ответственность. Также рассмотрим создание полного документа с помощью python. – MNijland

Смежные вопросы