「wex」の版間の差分

提供: Personal Tukubai for Academic
ナビゲーションに移動 検索に移動
(Batch Update)
(Excel シリアル値の計算には uawk で計算用のスクリプトを実行するのではなく time-excel コマンドが存在する。)
 
189行目: 189行目:
 
この場合、wex コマンドに読み込ませる日付をシリアル値に置き換えると意図した通りの動作になります。シリアル値とは 1900年1月1日を起点として数値で、2017年7月1日のシリアル値は42917です。
 
この場合、wex コマンドに読み込ませる日付をシリアル値に置き換えると意図した通りの動作になります。シリアル値とは 1900年1月1日を起点として数値で、2017年7月1日のシリアル値は42917です。
  
日付とシリアル値の変換は、例えば以下のような uawk スクリプトを作ることで実現できます。各自のシチュエーションに合わせて修正してお使い下さい。
+
日付とシリアル値の変換は、time-excel コマンドを用いることで実現できます。
  
<pre>$ echo 20170701 |  
+
<pre>$ echo 20170701 | time-excel 1
  uawk 'function uruuYear(year){                          # 閏年計算をする関数
 
        return ((year%4==0&amp;&amp;year%100!=0)||year%400==0); # 閏年なら1、そうでないなら0を返す
 
        }                                                #
 
        {
 
        year=int($1/10000);    # 年の受け取る
 
        month=int($1/100%100); # 月を受け取る
 
        day=$1%100;            # 日を受け取る
 
        serialday=0;          # シリアル値の変数初期化
 
        for(i=1900;i&lt;year;i++){        # 1900年から入力年までの日数のカウント
 
            serialday+=365+uruuYear(i);  # (閏年は日数を+1する)
 
        }                              #
 
        split( &quot;31 28 31 30 31 30 31 31 30 31 30 31&quot;, dayOfMonth ); # 各月の日数を初期化
 
        if( uruuYear(year)==1 ){ #
 
            dayOfMonth[2]++;      # 入力年が閏年なら2月の日数を1つ増やす
 
        }                        #
 
        for( i=1; i&lt;month ; i++ ){  #
 
            serialday += dayOfMonth[i] # 入力年の年初から今月までの日数をカウント
 
        }                            #
 
        serialday+=day+1; # 今月の日数をカウント
 
        print serialday;
 
        }'
 
 
42917</pre>
 
42917</pre>
 
<!--
 
<!--
219行目: 198行目:
 
## 備考
 
## 備考
 
-->
 
-->
 +
 
== Version and Edition ==
 
== Version and Edition ==
  

2022年3月19日 (土) 03:25時点における最新版

名前

wex : xlsx,xlsmフォーマットのエクセルを編集する

書式

使い方とオプション

Usage

wex <template.xlsx> [-paste] <sheet> <pos> <data>
wex <template.xlsx> -sheetCopy <元シート名> <先シート名>
wex <template.xlsx> -sheetNameChange <旧シート名> <新シート名>
wex <template.xlsx> -sheetAdd <新シート名>
wex <template.xlsx> -hideRow <対象シート名> <対象行>
wex <template.xlsx> -hideCol <対象シート名> <対象列>
wex <template.xlsx> -delCol <対象シート名> <対象列>
wex <template.xlsx> -delRow <対象シート名> <対象行>
wex <template.xlsx> -blankRow <対象シート名> <対象列>
wex <template.xlsx> -kaiPageRow <対象シート名> <対象行>
wex <template.xlsx> -kaiPageCol <対象シート名> <対象列>
wex <template.xlsx> -copyRow <対象シート名> <上端> <下端> <貼付行> <繰返>
wex <template.xlsx> -copyCol <対象シート名> <左端> <右端> <貼付列> <繰返>
wex <template.xlsx> -setColLen <対象シート名> <対象列> <長さ>
wex <template.xlsx> -list <処理スクリプト>

Option

-n オプション:null文字
-t オプション:透過文字
-s オプション:空白文字

説明

例(その1) 典型的なテキスト貼り付け

$ wex template.xlsx Sheet1 C3 input.txt > out.xlsx

なお “-paste” オプションを付けても同様に動作します。

$ wex template.xlsx -paste Sheet1 C3 input.txt > out.xlsx

テキストデータは標準入力から受け取ることも可能です。

$ cat input.txt | wex template.xlsx Sheet1 C3 - > out.xlsx

シート名の代わりにシート番号を使うことも可能です。

$ wex template.xlsx 1 C3 input.txt > out.xlsx

なお文字列が入っていない Excel ファイルに対して、文字列を書き込むことは出来ません。下記はその実行例です(tmp/simple-number.xls には数値しか書かれていません)。このエラーを回避するためには、Excelファイルに空白など何らかの文字をあらかじめ書き込んでおく必要があります。

$ echo abc | wex tmp/simple-number.xlsx Sheet1 A1 - > out.xlsx
Error[wex-paste]: sharedStrings.xmlがありませんでした。文字列を貼り付ける場合、テンプレートExcelファイルのA1セルなどに空白文字を書き込 んでおく必要があります。Error[wex]: データの貼り付けに失敗しました。

例(その2) null文字の貼り付け

-n オプションを使って null 文字を設定すると、対象セルはカラになります。

$ wex -n_ template.xlsx Sheet1 C3 input.txt > out.xlsx

例(その3) 透過文字の貼り付け

-t オプションを使って透過文字を設定すると、対象セルは元のExcelに書かれた文字が有効になります。

$ wex -t@ template.xlsx Sheet1 C3 input.txt > out.xlsx

例(その4) シートコピー

シートをコピーすることが出来ます。

$ wex template.xlsx -sheetCopy Sheet1 Sheet2 > out.xlsx

例(その5) シート名変更

シート名を変更することが可能です。

$ wex template.xlsx -sheetNameChange Sheet1 NewName > out.xlsx

例(その6) シート追加

新しい空白のシートを追加することが可能です。

$ wex template.xlsx -sheetAdd NewSheet > out.xlsx

例(その7) 行を非表示化

以下を実行すると4行目が非表示化されます。

$ wex template.xlsx -hideRow Sheet1 4 > out.xlsx

以下を実行すると4、5、6行目が非表示化されます。

$ wex template.xlsx -hideRow Sheet1 4,5,6 > out.xlsx

例(その8) 列を非表示化

以下を実行するとD列が非表示化されます。

$ wex template.xlsx -hideCol Sheet1 D > out.xlsx

以下を実行するとD、E、F列が非表示化されます。

$ wex template.xlsx -hideCol Sheet1 D,E,F > out.xlsx

※一度は列の非表示/再表示の操作を行ったExcelファイルをテンプレートとしてご利用ください。 ※列指定に使えるのは大文字のみです。小文字で “d” と指定することは出来ません。

例(その9) 行を空白化

指定した行に書かれているデータを全て消します。行の非表示化と合わせて使うと、擬似的に行を消すことが出来ます。以下を実行すると4行目のデータを消します。

$ wex template.xlsx -blankRow Sheet1 4 > out.xlsx

以下を実行すると、4,5,6行目のデータを消します。

$ wex template.xlsx -blankRow Sheet1 4,5,6 > out.xlsx

例(その10) 改ページを挿入

指定した行・列に改ページを挿入します。

例えば以下を実行すると、行が 1~3、4~6、7~9、10~ の範囲で改ページされ印刷可能になります。

$ wex template.xlsx -kaiPageRow Sheet1 3,6,9 > out.xlsx

例えば以下を実行すると、列が 1~4、5~8、9~ の範囲で改ページされ印刷可能になります。

$ wex template.xlsx -kaiPageCol Sheet1 4,8 > out.xlsx

またこのように連結すれば、行と列の改ページを設定することが可能です。

$ wex template.xlsx -kaiPageRow Sheet1 3,6,9 |
  wex -             -kaiPageCol Sheet1 4,8   > out.xlsx

ただし kaiPageRow/kaiPageCol のコマンドが実行可能なのは、行/列の改ページ設定がされていない Excel ファイルに限ります。既に行の改ページ設定がされている Excel ファイルに対して kaiPageRow を実行出来ませんし、列の改ページ設定がされている場合には kaiPageCol を実行出来ません。

例(その11) 行のコピー

指定した行をコピーします。例えば以下のように実行すると、「Sheet1の2~20行目を、22行目に10回繰り返してコピーする」という処理を実行します。

$ wex template.xlsx -copyRow Sheet1 2 20 22 10 > out.xlsx

copyRow が想定しているのは、1シート内の改ページです。上記の例ですと2~20行目が1ページ分の帳票テンプレートであり、それを10ページ分下にコピーしています。出来た10ページ分の領域に、paste でデータを貼り付けることを想定しています。

copyRow はコピー対象領域を、そのシートの末尾にコピーすることを想定しています。上記の例では、22行目以降に何らかのデータが存在した場合の動作は保証されません。必ず貼付行にはシート末尾のデータが存在しない行を指定して下さい。

例(その12) 列の幅の変更

指定した列の横幅を変更します。例えば以下のように実行すると「Sheet1のB列の幅を30に変更する」という処理を実行します。

$ wex template.xlsx -setColLen Sheet1 B 30 > out.xlsx

また以下を実行するとB、C、D列の幅を変更します。

$ wex template.xlsx -setColLen Sheet1 B,C,D 30 > out.xlsx

※一度は列幅変更の操作を行ったExcelファイルをテンプレートとしてご利用ください。

例(その13) 列の削除

指定した列を削除します。例えば以下のように実行すると「Sheet1のB列を削除する」という処理を実行します。

$ wex template.xlsx -delCol Sheet1 B > out.xlsx

また以下を実行するとB、C、D列を削除します。なお複数列の削除をする場合は、右側の列から指定するべきです。例えばB,Cを順番に削除すると、B列を削除した後の状態でC列を削除するので、最初の状態で言うB列とD列が削除されてしまいます。

$ wex template.xlsx -delCol Sheet1 D,C,B > out.xlsx

※重要事項※

列削除は、関数が使われていないExcelファイルにのみ使うことが出来ます。関数が使われているExcelに対して列削除を行うと、ファイルが壊れます。注意して下さい。

例(その14) 行の削除

指定した行を削除します。例えば以下のように実行すると「Sheet1の2列目を削除する」という処理を実行します。

$ wex template.xlsx -delRow Sheet1 2 > out.xlsx

また以下を実行すると2,3,4行を削除します。なお複数行の削除をする場合は、下側の行から指定するべきです。例えば2,3行を順番に削除すると、2行目を削除した後の状態で3行目を削除するので、最初の状態で言う2行目と4行目が削除されてしまいます。

$ wex template.xlsx -delRow Sheet1 4,3,2 > out.xlsx

※重要事項※

行削除は、関数が使われていないExcelファイルにのみ使うことが出来ます。関数が使われているExcelに対して行削除を行うと、ファイルが壊れます。注意して下さい。

例(その15) リスト実行

wex を数回呼び出してExcelファイルを編集する場合、下記のようなリスト実行を行うことが可能です。

$ cat action
sheetCopy 店舗 店舗A
paste     店舗A B4 tmp/input1.txt
sheetCopy 店舗 店舗B
paste     店舗B B4 tmp/input2.txt
sheetCopy 店舗 店舗C
paste     店舗C B4 tmp/input3.txt
$ wex tyohyo.xlsx -list action > out.xlsx

この -list オプションでの実行は、下記のパイプを使った実行と、処理結果として等価になります。

$ wex tmp/tyohyo.xlsx -sheetCopy 店舗 店舗A | \
  wex - -paste 店舗A B4 tmp/input1.txt      | \
  wex - -sheetCopy 店舗 店舗B               | \
  wex - -paste 店舗B B4 tmp/input2.txt      | \
  wex - -sheetCopy 店舗 店舗C               | \
  wex - -paste 店舗C B4 tmp/input3.txt      > tmp/out.xlsx

-list オプションを使う目的は、速度性能のためです。wex コマンドは Excel ファイルを編集するためにファイルを zip 解凍し、内部ファイルを編集した後に zip 圧縮をかけて元に戻します。上記のパイプを使った例の場合はExcelファイルが6回も解凍と圧縮が繰り返されます。テンプレートExcelファイルが小さい場合は問題ありませんが、巨大ファイルになってしまうと速度低下が問題なります。

-list オプションを使うと最初にExcelファイルを zip 解凍し、必要な処理を行った後に1回だけ zip 圧縮を行います。無駄な zip 圧縮を行わなくて済む分だけ速度性能が向上することが期待できます。

例(その16) 日付の入力について

日付を貼り付ける場合は、「YYYY/MM/DD」(例:2017/07/01)という文字列を作って paste オプションを使うことでほとんどの場合は正常に貼り付けられます。

例外的に上手く行かないのは、貼り付ける際にあらかじめ日付の書式設定を通常とは異なる場合に設定していた場合です。例えば海外向け文書を作る際に「July 1, 2017」のような書式として貼り付けたい場合です。この場合は正常に動作しません(貼り付けは正常終了するのですが、ファイルを開くと YYYY/MM/DD の形式で表示されてしまいます)。

この場合、wex コマンドに読み込ませる日付をシリアル値に置き換えると意図した通りの動作になります。シリアル値とは 1900年1月1日を起点として数値で、2017年7月1日のシリアル値は42917です。

日付とシリアル値の変換は、time-excel コマンドを用いることで実現できます。

$ echo 20170701 | time-excel 1
42917

Version and Edition

Version : Thu Oct 15 00:31:03 JST 2020


© 2021 Universal Shell Programming Laboratory site