프로델에서 네신 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 폴더에 히나형과 같은 이름의 파일이 출력됩니다.


    잘 대체 된 것 같습니다.

    좋은 웹페이지 즐겨찾기