Esempio n. 1
0
def edit_slide(slide, model, skip_model_not_found=False):
    """
        1つのスライドに対して文字列置換およびチャートCSV設定を行う
        チャート設定や文字列置換は1スライドに対して複数持てる。配列やdictなどで引渡し、pptxからはEL式で特定する
        チャート設定なのか文字列置換なのかは、EL式の配置されているpptx内のオブジェクトで判断される
        文字列置換やチャートタイトルに EL式で {answer.0} のような形で指定する
        チャート設定として指定可能な項目:
         - file_name : CSVファイルの名前
         - body: CSVファイルの中身そのものを直接文字列で指定できる(file_name, file_encodingは無視される)
         - value_axis_max: チャート左側軸の最大値。(省略可)
         - value_axix_min: チャート左側軸の最小値。(省略可)
         - (TBI) file_encoding: CSVファイルのエンコーディング。省略時は utf-8
    """

    # pptx内の TextFrame の EL表記を model の値で置換する
    for shape in txt.select_all_text_shapes(slide):
        try:
            txt.replace_all_els_in_text_frame(shape.text_frame, model)
        except:
            if not skip_model_not_found:
                raise
    for shape in txt.select_all_tables(slide):
        try:
            txt.replace_all_els_in_table(shape, model)
        except:
            if not skip_model_not_found:
                raise

    # pptx内の 各チャートに対してcsvの値を設定する
    for chart in ch.select_all_chart_shapes(slide):
        try:
            ch.load_data_into_chart(chart, model)
        except:
            if not skip_model_not_found:
                raise
Esempio n. 2
0
def _duplicate_slide(pres, index, count):
    """
    Duplicate the slide with the given index in pres.
    Adds slide to the end of the presentation

    Не знаю как это разотает, но это создает копию слайда
    """

    source = pres.slides[index]
    blank_slide_layout = _get_blank_slide_layout(pres)

    dest = pres.slides.add_slide(blank_slide_layout)

    for shape in source.shapes:
        newel = copy.deepcopy(shape.element)
        dest.shapes._spTree.insert_element_before(newel, 'p:extLst')

    for key, value in six.iteritems(source.part.rels):
        # Make sure we don't copy a notesSlide relation as that won't exist
        if "notesSlide" not in value.reltype:
            dest.part.rels.add_relationship(value.reltype,
                                            value._target,
                                            value.rId)

    move_slide(pres, len(list(pres.slides)) - 1, index + 1)

    # Проходим по всем тектовым элементам и переименовываем элементы
    slide_id = None
    for shape in txt.select_all_text_shapes(pres.slides[index + 1]):
        _new_id, name = _get_id(shape.text, count)
        if _new_id:
            slide_id = name
            shape.text = _new_id
            break
    return slide_id
Esempio n. 3
0
def remove_slide_id(presentation, slide_id):
    """
         指定した id のスライドから {id:foobar} という形式の文字列を削除する
    """
    slide = get_slide(presentation, slide_id)
    for shape in txt.select_all_text_shapes(slide):
        if txt.extract_slide_id(shape.text) == slide_id:
            shape.text = ''
Esempio n. 4
0
def get_slide(presentation, slide_id):
    """
         指定した id に対して {id:foobar} という TextFrame を持つスライドを探す
    """
    for slide in presentation.slides:
        for shape in txt.select_all_text_shapes(slide):
            if txt.extract_slide_id(shape.text) == slide_id:
                return slide
    raise ValueError(u"slide id:%s not found" % slide_id)
Esempio n. 5
0
def remove_all_slides_having_id(presentation):
    """
         {id:foobar} という文字列を持つすべてのスライドを削除する
    """
    unused_slides = []
    for slide in presentation.slides:
        for shape in txt.select_all_text_shapes(slide):
            slide_id = txt.extract_slide_id(shape.text)
            if slide_id:
                unused_slides.append((slide_id, slide))
                break
    for slide_id, slide in unused_slides:
        log.info("Removing unused slide_id: %s" % slide_id)
        remove_slide(presentation, slide)