Ошибка значения: в названии листа найден недопустимый символ

#python #excel #openpyxl

#python #excel #openpyxl

Вопрос:

Этот код Python завершается с ошибкой:

 from openpyxl import Workbook

wb = Workbook()
sheet = wb.create_sheet('*nice*')
  

Исключение:

 /home/foo/local/bin/python /home/foo/src/invalid.py
Traceback (most recent call last):
  File "/home/foo/src/invalid.py", line 5, in <module>
    sheet = wb.create_sheet('*nice')
  File "/home/foo/local/lib/python2.7/site-packages/openpyxl/workbook/workbook.py", line 158, in create_sheet
    new_ws = Worksheet(parent=self, title=title)
  File "/home/foo/local/lib/python2.7/site-packages/openpyxl/worksheet/worksheet.py", line 121, in __init__
    _WorkbookChild.__init__(self, parent, title)
  File "/home/foo/local/lib/python2.7/site-packages/openpyxl/workbook/child.py", line 50, in __init__
    self.title = title or self._default_title
  File "/home/foo/local/lib/python2.7/site-packages/openpyxl/workbook/child.py", line 93, in title
    raise ValueError(msg)
ValueError: Invalid character * found in sheet title
  

Как создать лист, содержащий * в названии?

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

1. В соответствии со спецификацией OOXML вам не разрешено использовать * в именах листов, поэтому openpyxl вызывает исключение.

2. @CharlieClark нет способа экранировать / заключить в кавычки эти символы?

3. Что неясно в «не разрешено»? Подробности см. в 18.17.2.3 спецификации.

4. @CharlieClark причина не ясна. Я не понимаю, почему некоторые символы недопустимы.

5. Спецификация запрещает использование некоторых символов в именах листов. EOM

Ответ №1:

Можем ли мы создать рабочий лист, используя символ звездочки (*)?

 sheet = wb.create_sheet("amp;nice")
  

В соответствии с этим, мы не можем использовать следующие специальные символы в именах листов

/
*
[
]
:
?

Ответ №2:

Вы можете использовать регулярное выражение для замены недопустимых символов:

 import re

from openpyxl import Workbook
from openpyxl.workbook.child import INVALID_TITLE_REGEX

wb = Workbook()
title = re.sub(INVALID_TITLE_REGEX, '_', '*nice*')
sheet = wb.create_sheet(title)
  

Но это не решение, просто обходной путь.

Приветствуются лучшие решения: есть ли способ процитировать * ?

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

1. Это лучший ответ, поскольку он импортирует шаблон непосредственно из openpyxl.