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

#python #excel

#python #excel

Вопрос:

Пожалуйста, помогите, я пытаюсь создать отдельные файлы на основе столбца company, я запустил filescript с помощью CMD,

Этот снимок экрана представляет собой образец моих данных, где каждый день мне приходится фильтровать и создавать новый файл Excel в соответствии с компанией и отправлять электронное письмо, я хочу автоматизировать это с помощью Python:

Скриншот

Я получаю ошибку при разделении в виде файла

C:UserssudarshanDesktop >py filesplit.py

Путь к файлу: C:UserssudarshanDesktopSample.xlsx

Выберите столбец: Компания

Ваши данные будут разделены на основе этих значений Medlife B2B Cargo, TWIN BIRDS, Allied Molded Enclosure Products, JMZ CARGO PVT LTD и создадут 4 файла или листа на основе следующего выбора. Если вы готовы продолжить, пожалуйста, введите «Y» и нажмите enter. Нажмите «N» для выхода. Готов продолжить (Y / N): y

Разделить на разные листы или файл (S / F): F

Ошибка начинается отсюда, и это сообщение об ошибке отображается после ввода «F» для приведенной выше строки.

 Traceback (most recent call last):
  File "C:UserssudarshanDesktopfilesplit.py", line 49, in <module>
    sendtofile(cols)
  File "C:UserssudarshanDesktopfilesplit.py", line 24, in sendtofile
    df[df[colpick] == i].to_excel("{}/{}.xlsx".format(pth, i), sheet_name=i, index=False)
  File "C:pythonlibsite-packagespandascoregeneric.py", line 2188, in to_excel
    formatter.write(
  File "C:pythonlibsite-packagespandasioformatsexcel.py", line 821, in write
    writer.write_cells(
  File "C:pythonlibsite-packagespandasioexcel_xlsxwriter.py", line 209, in write_cells
    wks = self.book.add_worksheet(sheet_name)
  File "C:pythonlibsite-packagesxlsxwriterworkbook.py", line 184, in add_worksheet
    return self._add_sheet(name, worksheet_class=worksheet_class)
  File "C:pythonlibsite-packagesxlsxwriterworkbook.py", line 735, in _add_sheet
    name = self._check_sheetname(name, isinstance(worksheet, Chartsheet))
  File "C:pythonlibsite-packagesxlsxwriterworkbook.py", line 784, in _check_sheetname
    raise InvalidWorksheetName(
xlsxwriter.exceptions.InvalidWorksheetName: Excel worksheet name 'Allied Moulded Enclosure Products' must be <= 31 chars.
 

ниже приведен скрипт python для filesplit

 #!/usr/bin/env python
# coding: utf-8

# In[ ]:


import pandas as pd
import os
from openpyxl import load_workbook
import xlsxwriter
from shutil import copyfile

file=input('File Path: ')
extension = os.path.splitext(file)[1]
filename = os.path.splitext(file)[0]
pth=os.path.dirname(file)
newfile=os.path.join(pth,filename '_2' extension)
df=pd.read_excel(file)
colpick=input('Select Column: ')
cols=list(set(df[colpick].values))

def sendtofile(cols):
    for i in cols:
        df[df[colpick] == i].to_excel("{}/{}.xlsx".format(pth, i), sheet_name=i, index=False)
    print('nCompleted')
    print('Thanks for using this program.')
    return

def sendtosheet(cols):
    copyfile(file, newfile)
    for j in cols:
        writer = pd.ExcelWriter(newfile, engine='openpyxl')
        for myname in cols:
            mydf = df.loc[df[colpick] == myname]
            mydf.to_excel(writer, sheet_name=myname, index=False)
        writer.save()

    print('nCompleted')
    print('Thanks for using this program.')
    return

print('You data will split based on these values {} and create {} files or sheets based on next selection. If you are ready to proceed please type "Y" and hit enter. Hit "N" to exit.'.format(', '.join(cols),len(cols)))
while True:
    x=input('Ready to Proceed (Y/N): ').lower()
    if x == 'y':
        while True:
            s = input('Split into different Sheets or File (S/F): ').lower()
            if s == 'f':
                sendtofile(cols)
                break
            elif s == 's':
                sendtosheet(cols)
                break
            else: continue
        break
    elif x=='n':
        print('nThanks for using this program.')
        break

    else: continue


# In[ ]:
 

Ссылка на файлы
https://github.com/sudarshan0091/filesplit

Пожалуйста, обратите внимание, что этот скрипт не мой, получил его с github, он принадлежит youtube trainer.

Комментарии:

1. Используйте более короткое имя листа. Вы превысили лимит символов.

2. И в сообщении об ошибке сказано ИМЕННО это. Разве вы этого не видели?

3. Да, Тим, я заметил, что сейчас я сначала не мог этого понять, на самом деле я новичок в этом мире программирования и просто гуглю, чтобы облегчить мою жизнь для повседневной работы в Excel. Спасибо за ваш ответ.

Ответ №1:

Максимально допустимое имя рабочего листа в Excel составляет 31 символ. Имя листа, которое вы пытаетесь использовать, длиннее этого. Отсюда и сообщение об ошибке.

Комментарии:

1. Спасибо за ответ, пожалуйста, помогите, как мне изменить код, чтобы файл можно было разделить без изменения имени листа (я имел в виду, что имя листа может быть с именем по умолчанию, и можно изменить только имя файла). возможно ли это?