2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

##セル内の文字列の置換~その2
 #1で作ったコードに手を入れて、ひな型から目的のxlsxファイルを出力するようにします。#1で使ったファイルをひな型とします。
コメント 2019-04-28 231324.png
カレンダー形式の表で、図では日付部分が切れていますが、「//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フォルダにひな型と同名のファイルが出力されます。
コメント 2019-05-05 235726.png

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

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?