JuliaPy / PyCall.jl

Package to call Python functions from the Julia language
MIT License
1.47k stars 189 forks source link

python-pptx trouble #725

Open jaakkor2 opened 4 years ago

jaakkor2 commented 4 years ago

Installed python-pptx like this

using Conda, PyCall
run(PyCall.python_cmd(`-m pip install python-pptx`))

In this example, the second last line fails, since ERROR: KeyError: key "rgb" not found.

using PyCall
pptx = pyimport("pptx")
RGBColor = pptx.dml.color.RGBColor
Inches = pptx.util.Inches
prs = pptx.Presentation()
title_slide_layout = get(prs.slide_layouts, 1)
slide = prs.slides.add_slide(title_slide_layout)
shape = slide.shapes.add_table(4, 3, Inches(1), Inches(1), Inches(3), Inches(2))
shape.table.cell(1,1).fill.solid()
isnothing(shape.table.cell(1,1).fill.fore_color.type) # true
shape.table.cell(1,1).fill.fore_color.rgb = RGBColor(255, 0, 0) # ERROR: KeyError: key "rgb" not found
prs.save("debug_rgb_jl.pptx")

For some reason shape.table.cell(1,1).fill.fore_color.type is nothing. whereas in the Python version it is 1. Here is Python version of the above

import pptx
from pptx.dml.color import RGBColor
from pptx.util import Inches
prs = pptx.Presentation()
title_slide_layout = prs.slide_layouts[0]
slide = prs.slides.add_slide(title_slide_layout)
shape = slide.shapes.add_table(4, 3, Inches(1), Inches(1), Inches(3), Inches(2))
shape.table.cell(1,1).fill.solid()
shape.table.cell(1,1).fill.fore_color.type == 1 # True
shape.table.cell(1,1).fill.fore_color.rgb = RGBColor(255, 0, 0)
prs.save("debug_rgb_py.pptx")

Also, in Julia, typing shape.<TAB> results in Error: Error in the keymap....

Julia v1.2, Conda v1.3.0, PyCall v1.91.2.

jaakkor2 commented 3 years ago

This works

using PyCall
pptx = pyimport("pptx")
RGBColor = pptx.dml.color.RGBColor
Inches = pptx.util.Inches
prs = pptx.Presentation()
title_slide_layout = get(prs.slide_layouts, 1)
slide = prs.slides.add_slide(title_slide_layout)
shape = slide.shapes.add_table(4, 3, Inches(1), Inches(1), Inches(3), Inches(2))
shape.table.cell(1,1).fill.solid()
py"""
$shape.table.cell(1,1).fill.fore_color.rgb = $RGBColor(255, 0, 0)
"""
prs.save("debug_rgb_jl.pptx")

Similar problem with openpyxl where some part of the code has to be wrapped inside py""" ... """ in https://discourse.julialang.org/t/julia-using-openpyxl-to-change-column-width-row-height/45172/5 .