Мне нужно вставить текстовое поле в лист Excel с помощью Python, я пробовал openpyxl, openpyxl.drawing.shape, точнее, xlsxwriter и другие, но это просто не работает.
from openpyxl import Workbook
from openpyxl.drawing.text import Paragraph, ParagraphProperties
from openpyxl.drawing.text import CharacterProperties
from openpyxl.drawing.shape import Shape
# Create a shape
shape = Shape()
# Initialize GraphicalProperties
graphical_properties = GraphicalProperties()
# Assign GraphicalProperties to spPr
shape.spPr = graphical_properties
# Add the shape to the worksheet
sheet.add_shape(shape)
# Save the workbook
workbook.save("output.xlsx")
Это последний код, который я пробовал.
Я попробовал это, но выдал мне эту ошибку: xlwrsheet.insert_textbox(rrow,ccol,ttxt, xlwropts) AttributeError: объект «NoneType» не имеет атрибута «insert_textbox»
Ваша проблема с предложенным кодом Xlsxwriter, скорее всего, связана с примером определения рабочего листа. В новой книге нет листа, который можно было бы найти по имени. Скорее всего, вы получили ошибку потому, что xlwrsheet не был объектом рабочего листа Xlsxwriter. Измените строку на xlwrsheet = xlwrwb.add_worksheet(). Обратите внимание также на Xlsxwriter; этот модуль создает новые книги, но не может открывать существующие книги.
Что, если вы просто скопируете пример из этого документа XlsxWriter: tutorialspoint.com/python_xlsxwriter/…
Я понимаю, что вы говорите, я попробовал ссылку, которой вы поделились, и она работает, единственное, что мне нужно поместить эту серию текстовых полей в существующий файл Excel с несколькими листами. Если я сначала займусь расчетами, то текстовые поля, а затем вставлять таблицы и диаграммы на лист Excel, существует высокая вероятность того, что все текстовые поля окажутся позади диаграмм.
Формы действительно очень сложные. OOXML является общим для всех приложений и чрезвычайно абстрактным. Openpyxl 3.2 будет включать поддержку чтения/записи фигур, но я бы не рекомендовал ее для клиентского кода.






Openpyxl не очень хорошо работает с фигурами, поэтому лучше использовать Xlsxwriter, как уже упоминалось, или, если вы хотите добавить что-то в существующую книгу, вы можете использовать Xlwings или win32com.
Код ниже является примером для Xlwings;
Команда AddShape взята из Excel, а тип фигуры — из перечисления MsoAutoShapeType, например. 1 — прямоугольник, 9 — круг.
import xlwings as xw
from xlwings.utils import rgb_to_int
excel_file = 'shapes.xlsx'
with xw.App(visible=True) as app:
wb = xw.Book(excel_file)
ws = wb.sheets('Sheet1')
### Excel AddShape command, Values are Type, Left, Top, Width & Height
shape1 = ws.api.Shapes.AddShape(1, 100, 50, 150, 30) # 1 is a rectangle
shape2 = ws.api.Shapes.AddShape(9, 1, 1, 20, 20) # 9 is a circle
shape1_name = shape1.Name
shape1.Fill.ForeColor.RGB = rgb_to_int((255,233,0))
shape2.TextFrame2.TextRange.Text = "Hello There"
### Some parameters are accessible from ws.shapes
for shape in ws.shapes:
if shape.name == shape1_name:
shape.characters.api.Text = f"Shape Name = {shape.name}"
shape.characters.font.name = 'Arial'
shape.characters.font.color = (0,0,0)
shape.characters.font.bold = True
### You can also add a macro to the object
# shape.api.OnAction = "sample_sub"
wb.save(excel_file)
Это работает, он открывает файл, в конце создает текстовое поле: wb.save(file) он показывает эту ошибку и останавливает цикл: self.impl.save(path, пароль=пароль) self.xl.SaveAs( v = self .__method(*args, **kwargs) в SaveAs возвращает self._oleobj_.InvokeTypes(3174, LCID, 1, (24, 0), ((12, 17), (12, 17), (12, 17), (12, 17), (12, 17), (12, 17), (3, 49), (12, 17), (12, 17), (12, 17), (12, 17), (12 , 17), (12, 17)), Имя файла pywintypes.com_error: (-2147352567, «Произошло исключение.», (0, «Microsoft Excel», «Невозможно получить доступ к Brand_Health_Tracker - 2 03-26-2024.xlsx». ", 'xlmain11.chm', 0, -2146827284), Нет)
Я пытаюсь представить ситуацию, в которой могла бы произойти такая ошибка. Вы упоминаете цикл, сохраняете ли вы книгу каждый раз во время цикла и записи в файл XLSX? В этом случае вам следует сохранять файл только один раз, в конце после записи всех данных и перед выходом из кода. Или это файл «Brand_Health_Tracker — 2 03-26-2024.xlsx». находится на диске, к которому вы можете потерять доступ? В противном случае мне, вероятно, нужно было бы посмотреть, что у вас за код (около раздела сохранения).
Независимо от существования файла, wb.save('Brand_Health_Tracker - 2 03-26-2024.xlsx') должен перезаписать существующий файл или создать и записать файл.
Вы можете попробовать xlsxwriter, как в этом посте: stackoverflow.com/questions/39773544/…