У меня есть приведенный ниже код, который прекрасно работает для извлечения текста из всех фигур в файле Excel. Для простого xlsx с 2 листами и 1 фигурой на листе он вернет следующее:
['Текстовое поле 2'] ['Текст эллипса Sheet2 3']
Однако мне нужно, чтобы он также возвращал цвет фигуры. Я не могу использовать xlwings или pywin32, поскольку их обработка занимает слишком много времени. Я не верю, что в openpyxl есть такая функция.
from zipfile import ZipFile
from lxml import etree
def main():
z = ZipFile('/home/luis/tmp/shapes.xlsx')
drawings = [ drw for drw in z.filelist if "drawings" in drw.filename.split('/') ]
for drw in drawings:
with z.open(drw.filename) as sstr:
ssdata = sstr.read()
tree = etree.fromstring(ssdata)
ns = {"xdr": "http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing",
"a": "http://schemas.openxmlformats.org/drawingml/2006/main",
"r": "http://schemas.openxmlformats.org/officeDocument/2006/relationships"
}
shapes = tree.xpath('//xdr:txBody[preceding-sibling::xdr:spPr]/a:p/a:r/a:t/text()', namespaces = ns)
print(shapes)
if __name__ == '__main__':
main()
Получите геометрию формы, цвет тела и цвет линии как
shape_att = tree.xpath('//xdr:spPr/a:prstGeom/@prst | //xdr:spPr/a:solidFill/a:srgbClr/@val | //xdr:spPr/a:ln/a:solidFill/a:srgbClr/@val', namespaces=ns)
результат
['ellipse', '729fcf', '3465a4']
Выражения Xpath для любой формы/атрибута можно найти вручную, извлекаяxl/drawings/drawing1.xml
из файла xlsx.
После этого выражения xpath аналогичны любому другому XML.
Открытие xml в браузере и использование консоли разработчика для копирования некоторого xpath, который он может дать.
/xdr:wsDr/xdr:twoCellAnchor[2]/xdr:sp/xdr:spPr/a:solidFill/a:srgbClr
В приведенном выше выражении сокращено до выражения атрибута @val
//xdr:spPr/a:solidFill/a:srgbClr/@val