プロデルでネ申Excel作成を自動化したい #2


セル内の文字列の置換~その2

 #1で作ったコードに手を入れて、ひな型から目的のxlsxファイルを出力するようにします。#1で使ったファイルをひな型とします。

カレンダー形式の表で、図では日付部分が切れていますが、「//day1-3」のようなセル位置を表す記号がそれぞれ入っています。xlsxファイルを解凍して得られるsharedStrings.xmlから文字列要素を順次読み出し、それが記号だったらその内容に応じた文字列に置換して、最後にzip圧縮→出力という流れです。

実際のコード

 ひとまず動くものをということで作ってみました。ひな型から2020年4月の予定表を出力します。

  • 7-zip32.dllなどのアーカイバDLLが必要です。
  • 作業フォルダtempにひな型ファイルを解凍します。
  • 予定データは配列と辞書を組み合わせた構造体もどきに格納してあります。配列の探す手順が使えないので速度的に探索が不利になりますが、読みやすいのであえてこれにしました。
  • 月の大小の処理はしてません。
  • その他まどろっこしい部分があります(特に後半の分岐の辺り)
xlsx操作.rdr
ーー予定データ
見出しは、{title=「2020年4月 プレイルーム使用予定」,mon=「月」,tue=「火」,wed=「水」,thu=「木」,fri=「金」}
ーー構造体もどきを定義
予定一覧は、{
{日付=1,参加者=「渡部 石倉 伊藤」},{日付=2,参加者=「横尾 小笠原 西 横川」},{日付=3,参加者=「江原 松本 新田 千田」},
{日付=6,参加者=「富田 浅井 森山」},{日付=7,参加者=「原 中川 藤原 」},{日付=8,参加者=「片岡 柳原 福田 山口」},
{日付=9,参加者=「柴山 志村 須藤 」},{日付=10,参加者=「志村 星野 桑原 大井」},{日付=13,参加者=「原口 宮部 新垣」},
{日付=14,参加者=「平田 生田 浜崎 三村」},{日付=15,参加者=「菅井 進藤 八木 」},{日付=16,参加者=「細田 谷口 菅谷 坂口」},
{日付=17,参加者=「山野 藤井 水口 」},{日付=20,参加者=「佐竹 荻原 島津 西」},{日付=21,参加者=「水崎 竹下 大木 」},
{日付=22,参加者=「黒沢 梅田 竹下 諏訪」},{日付=23,参加者=「泉 鈴木 阪本 」},{日付=24,参加者=「志村 北野 一木 池内」},
{日付=27,参加者=「立石 川井」},{日付=28,参加者=「岡島 池上 成海 」},{日付=30,参加者=「上山 黒岩 森下 村上」}
}


臨時日付は、「2020/4/1 0:00」を日時形式化したもの
曜日一覧は、{「月曜日」,「火曜日」,「水曜日」,「木曜日」,「金曜日」,「土曜日」,「日曜日」}
臨時一覧は、曜日一覧から[臨時日付の曜日]を探したもの
曜日オフセットは、臨時一覧(1)-1

「[プログラムの位置]カレンダー原紙.xlsx」を「[プログラムの位置]\temp」へコピーする
「[プログラムの位置]\temp\カレンダー原紙.xlsx」を「[プログラムの位置]\temp\カレンダー原紙.zip」へ変更する
「[プログラムの位置]\temp\カレンダー原紙.zip」を「[プログラムの位置]\temp」へ解凍する
「[プログラムの位置]\temp\カレンダー原紙.zip」を削除する
文字列xmlは、「[プログラムの位置]temp\xl\sharedStrings.xml」をXMLとして開いたもの
文字セル一覧は、文字列xmlから「sst\si」を取得したもの
文字セル一覧を箱へそれぞれ繰り返す
    臨時一覧は、箱の要素一覧
    臨時一覧を器へそれぞれ繰り返す
        もし器の名前が「t」かつ[器の内容が「//[[]A-Za-z[]]+」という正規表現に合致する]ならば
            マッチ単語は、器の内容から「[[]A-Za-z[]]+」という正規表現で取り出したもの
            マッチ数字は、器の内容から「[[]0-9[]]+」という正規表現で取り出したもの
            もしマッチ単語(1)が「day」ならば
                臨時は、[(マッチ数字(1)-1)*7+マッチ数字(2)-曜日オフセット]
                もし臨時>0ならば
                    器の内容を、臨時に変える
                そうでないなら
                    器の内容を、「」に変える
                もし終わり
            他でもしマッチ単語(1)が「member」ならば
                臨時は、[(マッチ数字(1)-1)*7+マッチ数字(2)-曜日オフセット]
                該当なし=1
                [予定一覧の個数]回、値にカウントしながら繰り返す
                    もし、臨時=[予定一覧(値)の「日付」]なら
                        該当なし=0
                        繰り返しから抜ける
                    もし終わり
                繰り返し終わり
                もし該当なし=0なら
                    器の内容を、予定一覧(値)の「参加者」に変える
                そうでないなら
                    器の内容を、「」に変える
                もし終わり
            そうでないなら
                器の内容を、[見出しからマッチ単語(1)を得たもの]に変える
            もし終わり
        もし終わり
    繰り返し終わり
繰り返し終わり

「[プログラムの位置]temp\xl\sharedStrings.xml」に文字列xmlを保存する
「[プログラムの位置]\temp\_rels」を「[プログラムの位置]\temp\カレンダー原紙.zip」へ圧縮する
「[プログラムの位置]\temp\docProps」を「[プログラムの位置]\temp\カレンダー原紙.zip」へ圧縮する
「[プログラムの位置]\temp\xl」を「[プログラムの位置]\temp\カレンダー原紙.zip」へ圧縮する
「[プログラムの位置]\temp\[[]Content_Types[]].xml」を「[プログラムの位置]\temp\カレンダー原紙.zip」へ圧縮する
「[プログラムの位置]\temp\カレンダー原紙.zip」を「[プログラムの位置]\temp\カレンダー原紙.xlsx」へ変更する

ひな型ファイル(カレンダー原紙.xlsx)をコードファイルと同じフォルダに置いて実行させると、tempフォルダにひな型と同名のファイルが出力されます。

うまく置換できているようです。