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


いきさつ

 このところRPAがブームになっているようですが、ITの時流から大きく取り残されたうちの職場にもそんな空気が作用したのか、昨年ぐらいから業務自動化の相談が舞い込んできています。どのくらい取り残されているかといえば、Wordで表入りの書類を作るのが煩雑だからExcelを使うとか、横罫線入りの手書き用紙から様式を変えずPC入力に移行したいからExcelを使うとかいうレベルです(一太郎がメジャーで残っててくれたらなぁ・・・)。とはいえ、電卓とワープロ専用機が仕事の道具という昔のやり方を踏襲していては、増える一方の仕事量は到底こなせるものではありません。
 これまで日本語プログラミング言語「プロデル」の力を借りながら、手弁当で業務自動化アプリをボチボチ作ってきました。敢えてマイナーな言語にしたのは、こんな職場環境でも日本語であれば開発を分担したいと言ってくれるスタッフが現れるかも・・・という淡い期待があってのことです(実際興味を示す人は何人もいます)。

今回の依頼

ある部署が毎月発行しているカレンダー形式の時間割表のようなものがあり、全入所部門はこの表を基に日々の業務の段取りを組み立てています。Excelファイルなのですが、氏名や時間、その他備考など細かく記載されていて、情報量はかなり多いです。発行部署のスタッフは、或る意味で職人的スキルを持っており、累計で10時間程度かけて作成しています。受け取った部署は該当する利用者氏名を蛍光ペンでマーキングしていきます。2、3度誤りチェックをしているので多くて2時間程度でしょうか。これらを通常の介護業務の合間を見て、あるいは夜勤帯の寝静まった時に一気呵成に行っています。
 昨年あたりから、うちもご多分に漏れず人手不足がさらに顕在化してきたうえに、利用者の異動やインフル感染などで時間割の組直しが頻繁に発生するようになり、さすがにもう無理・・・という声がちらほら上がるようになりました。ニーズとしてまとめると次の2点です。
1.セルにちまちまと文字列を入力していた作業の負担を軽くしたい。
2.マーキングの作業をなくしてほしい。
1.については、当日のサービスの内容と参加した利用者を記録する日報アプリを作成し、その部署で稼働させています。リストに表示された利用者名や業務内容を選んで入力するので迅速にできます。データはMDBファイルに記録するので、罫線抜きの一覧表で出力するぐらいなら標準のOffice連携機能で簡単に実装できそうに思えます。
2.については、部署ごとに所属する利用者だけが入っている時間割を出力するようにすれば解決です。
と思ったのですが、時間割表のフォーマットは結合セルや、フォント、色の指定を多数入れて、美しさにこだわって作られてきました。フォーマットは変えずに、ステークホルダーのコンセンサスから逸脱しないようにすすめたい。となると、連係機能では難しいので、白紙のフォーマットファイルをアプリから直接編集するのがよさそうです。

.xlsxファイルの構造

 早速xlsxファイルの構造を調べて見ました。正体は複数のXMLファイルをまとめたZIPファイルだったと知り、今更驚きました。
http://mitsutakauomi.com/?p=362
それなら、XML機能でセルの文字列を編集できそうです(初めて使う機能ですが)。セルの位置を指定して編集するのはかなり煩雑な作業になりそうなので、ひな型とするファイルの目的のセルに「@サービス名1-1」、「@参加者1-2」などの文字列を入れておいて、取得した要素の内容により分岐させ書き換えと。

セル内の文字列の読み出し

ひとまず、Excelで適当なカレンダーをつくって試してみます。

このxlsxファイル内のsharedStrings.xmlの内容は次のようになっています。

sharedStrings.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<sst xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" count="8" uniqueCount="8"><si><t></t></si><si><t></t></si><si><t></t></si><si><t></t></si><si><t></t></si><si><t></t></si><si><t></t></si><si><t>2020年1月</t><rPh sb="4" eb="5"><t>ネン</t></rPh><rPh sb="6" eb="7"><t>ガツ</t></rPh><phoneticPr fontId="5"/></si></sst>

プロデルの例を参考に以下のコードを実行させてみました。

xml取得.rdr
XMLを使う
データは、「[プログラムの位置]カレンダー\xl\sharedStrings.xml」からXMLとして読み込んだもの
一覧は、データから「sst\si」を取得したもの
一覧を要素へそれぞれ繰り返す
  [要素の「t」の内容を表示する
繰り返し終わり

結果はエラー。要素の「t」の中身が無だそうです。「si」の内容の表示はできるのになぜ??
プロデルの実行例で出力したXMLと見比べつつ調べてみると、原因は名前空間でした。
https://www.atmarkit.co.jp/fxml/ddd/ddd001/ddd001-namespaces1.html
名前が違うフルネームに変換されるためか、すんなり参照できないようです。上のXMLからxlmns属性を削除すると上記のコードで問題なく動きます。とは言え、それがxlsx内でどのように作用するのか分かりません。
 そこで、次のように変えてみました。

xml取得その2.rdr
文字xmlは、「[プログラムの位置]カレンダー\xl\sharedStrings.xml」をXMLとして開いたもの
文字セル一覧は、文字xmlから「sst\si」を取得したもの
文字セル一覧を箱へそれぞれ繰り返す
    臨時一覧は、箱の要素一覧
    臨時一覧を器へそれぞれ繰り返す
        もし器の名前が「t」ならば
            器の内容を報告する
        もし終わり
    繰り返し終わり
繰り返し終わり

結果は、








2020年1月

うまく行きました。これで文字列の書き換えはすぐにできそうです。ただ、再圧縮したzipファイルをExcelがすんなり読み込めるかがヤマになりそうな気がします。
〜続く〜