{"id":12208,"date":"2024-03-05T19:22:38","date_gmt":"2024-03-05T10:22:38","guid":{"rendered":"https:\/\/www.sambuichi.jp\/?p=12208"},"modified":"2024-03-05T19:27:01","modified_gmt":"2024-03-05T10:27:01","slug":"python%e3%81%a7%e3%83%91%e3%83%af%e3%83%bc%e3%83%9d%e3%82%a4%e3%83%b3%e3%83%88%e4%bd%9c%e6%88%90","status":"publish","type":"post","link":"https:\/\/www.sambuichi.jp\/?p=12208","title":{"rendered":"Python\u3067\u30d1\u30ef\u30fc\u30dd\u30a4\u30f3\u30c8\u4f5c\u6210"},"content":{"rendered":"<p>Views: 13<\/p><div id=\"header\">\n<h1>Python\u3067\u30d1\u30ef\u30fc\u30dd\u30a4\u30f3\u30c8\u4f5c\u6210<\/h1>\n<\/div>\n<div id=\"content_adoc\">\n<div class=\"sect1\">\n<h2 id=\"_pptx\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\">1. pptx\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>python-pptx\u306f\u3001PyPI\u304b\u3089\u516c\u958b\u3055\u308c\u3066\u3044\u308b\u306e\u3067\u3001pip\u3067\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3059\u308b\u3002<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-bash\" data-lang=\"bash\">pip install python-pptx<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_\u539f\u7a3f\u30d5\u30a1\u30a4\u30ebcsv\u304b\u3089\u30d1\u30ef\u30fc\u30dd\u30a4\u30f3\u30c8\u3092\u4f5c\u6210\">2. \u539f\u7a3f\u30d5\u30a1\u30a4\u30eb\uff08CSV\uff09\u304b\u3089\u30d1\u30ef\u30fc\u30dd\u30a4\u30f3\u30c8\u3092\u4f5c\u6210<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p><strong>CSV\u30d5\u30a1\u30a4\u30eb<\/strong><\/p>\n<\/div>\n<table class=\"tableblock frame-all grid-all stretch\">\n<caption class=\"title\">Table 1. input.csv<\/caption>\n<colgroup>\n<col style=\"width: 33.3333%;\">\n<col style=\"width: 33.3333%;\">\n<col style=\"width: 33.3334%;\">\n<\/colgroup>\n<tbody>\n<tr>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">page<\/p>\n<\/td>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">level<\/p>\n<\/td>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">text<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">1<\/p>\n<\/td>\n<td class=\"tableblock halign-left valign-top\"><\/td>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">\u6700\u521d\u306e\u30da\u30fc\u30b8\u306e\u30bf\u30a4\u30c8\u30eb.<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">1<\/p>\n<\/td>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">1<\/p>\n<\/td>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">\u5148\u982d\u30da\u30fc\u30b8\u306e\uff11\u884c\u76ee<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">1<\/p>\n<\/td>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">2<\/p>\n<\/td>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">\u5148\u982d\u30da\u30fc\u30b8\u306e\uff12\u884c\u76ee<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">2<\/p>\n<\/td>\n<td class=\"tableblock halign-left valign-top\"><\/td>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">\u7b2c\uff12\u30da\u30fc\u30b8\u306e\u30bf\u30a4\u30c8\u30eb<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">2<\/p>\n<\/td>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">1<\/p>\n<\/td>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">\u7b2c\uff12\u30da\u30fc\u30b8\u306e\uff11\u884c\u76ee<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<div class=\"paragraph\">\n<p>\u6700\u521d\u306e\u30da\u30fc\u30b8<\/p>\n<\/div>\n<table class=\"tableblock frame-all grid-all stretch\">\n<caption class=\"title\">Table 2. \u6700\u521d\u306e\u30da\u30fc\u30b8\u306e\u30bf\u30a4\u30c8\u30eb.<\/caption>\n<colgroup>\n<col style=\"width: 50%;\">\n<col style=\"width: 50%;\">\n<\/colgroup>\n<tbody>\n<tr>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">Level<\/p>\n<\/td>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">Text<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">1<\/p>\n<\/td>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">\u5148\u982d\u30da\u30fc\u30b8\u306e\uff11\u884c\u76ee<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">2<\/p>\n<\/td>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">\u5148\u982d\u30da\u30fc\u30b8\u306e\uff12\u884c\u76ee<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<div class=\"paragraph\">\n<p>\uff12\u30da\u30fc\u30b8<\/p>\n<\/div>\n<table class=\"tableblock frame-all grid-all stretch\">\n<caption class=\"title\">Table 3. \u7b2c\uff12\u30da\u30fc\u30b8\u306e\u30bf\u30a4\u30c8\u30eb<\/caption>\n<colgroup>\n<col style=\"width: 50%;\">\n<col style=\"width: 50%;\">\n<\/colgroup>\n<tbody>\n<tr>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">Level<\/p>\n<\/td>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">Text<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">1<\/p>\n<\/td>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">\u7b2c\uff12\u30da\u30fc\u30b8\u306e\uff11\u884c\u76ee<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_python\u30d7\u30ed\u30b0\u30e9\u30e0pptxslide_py\">3. Python\u30d7\u30ed\u30b0\u30e9\u30e0pptxSlide.py<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<div class=\"listingblock\">\n<div class=\"title\">pptxSlide.py<\/div>\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-python\" data-lang=\"python\">import argparse\r\nimport csv\r\nfrom pptx import Presentation\r\nfrom pptx.util import Inches\r\n\r\ndef read_csv(input_csv):\r\n    \"\"\"\r\n    CSV\u30d5\u30a1\u30a4\u30eb\u3092\u8aad\u307f\u8fbc\u307f\u3001\u884c\u306e\u8f9e\u66f8\u306e\u30ea\u30b9\u30c8\u3092\u8fd4\u3057\u307e\u3059\u3002\r\n    \"\"\"\r\n    sections = []  # \u5404\u30bb\u30af\u30b7\u30e7\u30f3\u3092\u683c\u7d0d\u3059\u308b\u305f\u3081\u306e\u30ea\u30b9\u30c8\r\n    current_section_title = None  # \u73fe\u5728\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u306e\u30bf\u30a4\u30c8\u30eb\r\n    current_section_content = []  # \u73fe\u5728\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u306e\u30b3\u30f3\u30c6\u30f3\u30c4\r\n    with open(input_csv, mode='r', encoding='utf-8-sig') as file:\r\n        reader = csv.DictReader(file)\r\n        for row in reader:\r\n            # \u30ad\u30fc\u3068\u5024\u306e\u524d\u5f8c\u306e\u7a7a\u767d\u3092\u524a\u9664\r\n            row = {k.strip(): v.strip() for k, v in row.items()}\r\n            page, level, text = row['page'], row['level'], row['text']\r\n\r\n            if not level:  # \u65b0\u3057\u3044\u30bb\u30af\u30b7\u30e7\u30f3\u306e\u958b\u59cb\r\n                if current_section_title is not None:\r\n                    # \u524d\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3092\u4fdd\u5b58\r\n                    sections.append({\"title\": current_section_title, \"content\": current_section_content})\r\n                    current_section_content = []  # \u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u306e\u6e96\u5099\r\n                current_section_title = text  # \u65b0\u3057\u3044\u30bf\u30a4\u30c8\u30eb\u306e\u8a2d\u5b9a\r\n            else:\r\n                # \u73fe\u5728\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u306b\u30b3\u30f3\u30c6\u30f3\u30c4\u3092\u8ffd\u52a0\r\n                level = int(level) - 1  # \u30ec\u30d9\u30eb\u30920\u304b\u3089\u958b\u59cb\u3059\u308b\u3088\u3046\u306b\u8abf\u6574\r\n                current_section_content.append({\"text\": text, \"level\": level})\r\n        # \u6700\u5f8c\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3092\u8ffd\u52a0\u3059\u308b\u306e\u3092\u5fd8\u308c\u306a\u3044\r\n        if current_section_title is not None:\r\n            sections.append({\"title\": current_section_title, \"content\": current_section_content})\r\n    return sections\r\n\r\n\r\ndef add_slide_with_textboxes_and_paragraphs(presentation, title_text, content_list):\r\n    slide_layout = presentation.slide_layouts[1]  # \u7a7a\u767d\u306e\u30ec\u30a4\u30a2\u30a6\u30c8\u3092\u4f7f\u7528\r\n    slide = presentation.slides.add_slide(slide_layout)  # PPT\u30d5\u30a1\u30a4\u30eb\u306b\u30b9\u30e9\u30a4\u30c9\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u8ffd\u52a0\r\n    myShapes = slide.shapes  # shapes\u306e\u5c5e\u6027\u306b\u30a2\u30af\u30bb\u30b9\r\n    titleShape = myShapes.title  # \u30bf\u30a4\u30c8\u30eb\u306b\u30c6\u30ad\u30b9\u30c8\u3092\u8ffd\u52a0\r\n    titleShape.text = title_text\r\n    bodyShape = myShapes.placeholders[1]  # \u672c\u6587\u30c6\u30ad\u30b9\u30c8\u30d5\u30ec\u30fc\u30e0\u3092\u8ffd\u52a0\r\n    textFrame = bodyShape.text_frame\r\n    first_paragraph = True  # \u6700\u521d\u306e\u6bb5\u843d\u304c\u91cd\u8907\u3057\u306a\u3044\u3088\u3046\u306b\u3059\u308b\r\n    for paragraph in content_list:\r\n        if first_paragraph:\r\n            p = textFrame\r\n            first_paragraph = False\r\n        else:\r\n            p = textFrame.add_paragraph()\r\n        p.text = paragraph[\"text\"]\r\n        p.level = paragraph[\"level\"]\r\n\r\n\r\ndef create_presentation(sections, output_pptx, presentation):\r\n    \"\"\"\r\n    \u63d0\u4f9b\u3055\u308c\u305f\u30c7\u30fc\u30bf\u304b\u3089PowerPoint\u30d7\u30ec\u30bc\u30f3\u30c6\u30fc\u30b7\u30e7\u30f3\u3092\u4f5c\u6210\u3057\u3001\u4fdd\u5b58\u3057\u307e\u3059\u3002\r\n    \"\"\"\r\n    for section in sections:\r\n        title_text = section['title']\r\n        content_list = section['content']\r\n        add_slide_with_textboxes_and_paragraphs(presentation, title_text, content_list)\r\n    presentation.save(output_pptx)\r\n    print(f\"\u30d7\u30ec\u30bc\u30f3\u30c6\u30fc\u30b7\u30e7\u30f3 {output_pptx} \u304c\u6b63\u5e38\u306b\u4f5c\u6210\u3055\u308c\u307e\u3057\u305f\u3002\")\r\n\r\n\r\ndef main():\r\n    # \u5f15\u6570\u30d1\u30fc\u30b5\u30fc\u306e\u8a2d\u5b9a\r\n    parser = argparse.ArgumentParser(description='CSV\u30d5\u30a1\u30a4\u30eb\u304b\u3089PPTX\u30d7\u30ec\u30bc\u30f3\u30c6\u30fc\u30b7\u30e7\u30f3\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002')\r\n    parser.add_argument('input_csv', type=str, help='\u5165\u529bCSV\u30d5\u30a1\u30a4\u30eb\u306e\u30d1\u30b9')\r\n    parser.add_argument('output_pptx', type=str, help='\u51fa\u529bPPTX\u30d5\u30a1\u30a4\u30eb\u306e\u30d1\u30b9')\r\n    # \u5f15\u6570\u3092\u89e3\u6790\r\n    args = parser.parse_args()\r\n    # CSV\u304b\u3089\u30c7\u30fc\u30bf\u3092\u8aad\u307f\u8fbc\u3080\r\n    sections = read_csv(args.input_csv)\r\n    # PowerPoint\u30d7\u30ec\u30bc\u30f3\u30c6\u30fc\u30b7\u30e7\u30f3\u3092\u521d\u671f\u5316\r\n    presentation = Presentation()\r\n    # \u30d7\u30ec\u30bc\u30f3\u30c6\u30fc\u30b7\u30e7\u30f3\u3092\u4f5c\u6210\u3057\u3066\u4fdd\u5b58\r\n    create_presentation(sections, args.output_pptx, presentation)\r\n\r\nif __name__ == \"__main__\":\r\n    main()<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"title\">sections<\/div>\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-json\" data-lang=\"json\">[\r\n    {'title': '\u6700\u521d\u306e\u30da\u30fc\u30b8\u306e\u30bf\u30a4\u30c8\u30eb.', 'content': [\r\n        {'text': '\u5148\u982d\u30da\u30fc\u30b8\u306e\uff11\u884c\u76ee', 'level': 0},\r\n        {'text': '\u5148\u982d\u30da\u30fc\u30b8\u306e\uff12\u884c\u76ee', 'level': 1}\r\n    ]},\r\n    {'title': '\u7b2c\uff12\u30da\u30fc\u30b8\u306e\u30bf\u30a4\u30c8\u30eb', 'content': [\r\n        {'text': '\u7b2c\uff12\u30da\u30fc\u30b8\u306e\uff11\u884c\u76ee', 'level': 0}\r\n    ]}]<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p><span class=\"image\"><img decoding=\"async\" src=\"https:\/\/www.sambuichi.jp\/wp-content\/uploads\/2024\/03\/Page1.png\" alt=\"Page1\"><\/span><\/p>\n<\/div>\n<div class=\"paragraph\">\n<p><span class=\"image\"><img decoding=\"async\" src=\"https:\/\/www.sambuichi.jp\/wp-content\/uploads\/2024\/03\/Page2.png\" alt=\"Page2\"><\/span><\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_\u5b9f\u884c\u65b9\u6cd5\">4. \u5b9f\u884c\u65b9\u6cd5<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>python pptxSlide.py input.csv output.pptx<\/p>\n<\/div>\n<\/div>\n<div id=\"footer_adoc\">\n<div id=\"footer-text\">\nLast updated 2024-03-05 19:18:39 +0900\n<\/div>\n<\/div>\n<div id=\"toc\" class=\"toc2\">\n<div id=\"toctitle\">\u76ee\u6b21<\/div>\n<ul class=\"sectlevel1\">\n<li><a href=\"#_pptx\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\">1. pptx\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb<\/a><\/li>\n<li><a href=\"#_\u539f\u7a3f\u30d5\u30a1\u30a4\u30ebcsv\u304b\u3089\u30d1\u30ef\u30fc\u30dd\u30a4\u30f3\u30c8\u3092\u4f5c\u6210\">2. \u539f\u7a3f\u30d5\u30a1\u30a4\u30eb\uff08CSV\uff09\u304b\u3089\u30d1\u30ef\u30fc\u30dd\u30a4\u30f3\u30c8\u3092\u4f5c\u6210<\/a><\/li>\n<li><a href=\"#_python\u30d7\u30ed\u30b0\u30e9\u30e0pptxslide_py\">3. Python\u30d7\u30ed\u30b0\u30e9\u30e0pptxSlide.py<\/a><\/li>\n<li><a href=\"#_\u5b9f\u884c\u65b9\u6cd5\">4. \u5b9f\u884c\u65b9\u6cd5<\/a><\/li>\n<\/ul>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Views: 13 Python\u3067\u30d1\u30ef\u30fc\u30dd\u30a4\u30f3\u30c8\u4f5c\u6210 1. pptx\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb python-pptx\u306f\u3001PyPI\u304b\u3089\u516c\u958b\u3055\u308c\u3066\u3044\u308b\u306e\u3067\u3001pip\u3067\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3059\u308b\u3002 pip install python-pptx 2. [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":12190,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[50,11],"tags":[],"_links":{"self":[{"href":"https:\/\/www.sambuichi.jp\/index.php?rest_route=\/wp\/v2\/posts\/12208"}],"collection":[{"href":"https:\/\/www.sambuichi.jp\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.sambuichi.jp\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.sambuichi.jp\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.sambuichi.jp\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=12208"}],"version-history":[{"count":5,"href":"https:\/\/www.sambuichi.jp\/index.php?rest_route=\/wp\/v2\/posts\/12208\/revisions"}],"predecessor-version":[{"id":12213,"href":"https:\/\/www.sambuichi.jp\/index.php?rest_route=\/wp\/v2\/posts\/12208\/revisions\/12213"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.sambuichi.jp\/index.php?rest_route=\/wp\/v2\/media\/12190"}],"wp:attachment":[{"href":"https:\/\/www.sambuichi.jp\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=12208"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.sambuichi.jp\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=12208"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.sambuichi.jp\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=12208"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}