さくさくのTips!よく使うLinuxコマンド集

Linux

こんにちは。
さくさくTECHブロガーの「さく」です。


Linuxコマンドで忘れやすいコマンドをまとめていきます。

自分用っていう部分もありますが、もしよければ参考にしてください。


Linuxコマンド

コピー

強制的にコピーするときは「-f」。

強制的というのは、いちいち”上書きします。よろしいですか?”をきかない、ということ。


cp -f a.txt b.txt


ディレクトリをコピーするときには「-r」。

コピー元ディレクトリ配下のファイル、および、サブフォルダ・サブファイルもコピーする。


cp -r directory1 directory1


ファイルの属性を保持したままコピーするときは「-p」。

ファイルの属性とは、ファイルのタイムスタンプ・権限、といったメタ情報。


cp -p a.txt b.txt

リスト

よく使うオプションは「-la」。

「l」は、詳細表示。

「a」は、全て表示。(先頭に . がついているファイルとか)


ls -la

ファイルのタイムスタンプをミリ秒まで表示したい場合は、「–full-time」


ls -la --full-time

履歴

コマンドの実行履歴をみたい場合はhistory

現在ログインしているユーザのコマンド実行履歴なので、ユーザを切り替えた場合は、切り替え前の実行履歴は表示されない。


history

履歴コマンドを実行すると、大概は大量にコマンドが出てくるので、パイプでつないでお目当てのコマンドを探す


history | grep ○△□

※「○△□」は探す対象のコマンドなど

エイリアス

OSに設定されてるエイリアスを確認する時はエイリアスコマンド


alias

登録されているエイリアスコマンドが確認できるが、たいがいのLinuxでは「ll(エルエル)」は “ls -l –color=auto” のエイリアス。


所有者とグループの変更

所有者・グループの変更はchownコマンド。


chown owner:group ○△□

「owner」はオーナー名。

「group」はグループ名。

「○△□」は、対象のフォルダ名とファイル名。


圧縮・解凍

一番簡単な圧縮コマンドは「gzip」


gzip file

解凍も「gzip」でいける
「-d」をつけると、圧縮ファイルは削除される。


gzip -d file

viエディタ

Linux上でファイルを直接修正する場合はviコマンド



vi ファイル名

「i」で編集モード、「esc」でコマンドモード、を切り替える。

コマンドモードでよく使うコマンドは以下。

コマンド 説明
/ (スラッシュ)

スラッシュをいれて検索ワードを入力。

エンターで検索開始。

n(小文字)で次検索。

N(大文字)で前検索。

Shift + g

ファイルの末尾に移動。

dd(dを2回押し)

1行削除

yy(yを2回押し)

行コピー

p

ペースト

シェル

シェルの実行

シェルを実行するときは、シェルが存在するディレクトリを明確にしたうえでシェルファイル名を指定するだけ。


./shell.sh


シェルをバックグラウンドで実行するときは、末尾に「&」をつける。

バックグラウンドで実行といっても、「huponexit」の設定次第では、実行端末を閉じるとシェル自体は停止するので注意が必要。


./shell.sh &

TeraTermマクロを使って、Linux上の指定ファイルダウンロードを自動化

Linux

Linuxのシステムを保守している技術者が日々直面するシーンとして、”特定のログファイルを取得する”という場面があるかと思います。


例えば、一日に1回、アプリケーションのログやミドルウェアのログを収集して、変なエラーが出てないか?を調査したりする場合ですね。


特に、サービスのローンチ直後はよくある場面かと思います。


今回は、TeraTermマクロを使って、ログイン→圧縮ファイル作成→ダウンロードを自動的に実施するマクロを紹介します。


いちいち、ログインしてー、ファイル圧縮してー、ダウンロードしてー、って面倒ですもんね!?

環境情報

今回は、WindowsマシンにTeraTermがインストールされている状態を前提とします。

TeraTermを使って、Linuxサーバにログインします。


  • クライアントOS:Windows7
  • ターミナルエミュレータ:TeraTerm
  • サーバOS:Linux

マクロを使って自動ログイン

自動ログインの部分は、以前、作成した記事を参照してください。



今回は、“パスの指定” “ダウンロード” の部分を中心に解説していきます。


マクロで自動ログインしてダウンロードまで

とりあえず、作成したマクロを紹介します。

このマクロで、“自動ログイン”→”対象フォルダへの移動”→”圧縮してダウンロード”が可能です。


; sample TeraTerm Macro
;
; FILE:     fileGet.ttl
; create:   2019/07/21
; Author:   SakuSaku

call login
call setCur
call dwnload
sendln 'exit'
end

;
; ログイン
;
:login
    ; ホスト名とログインアカウントを定義
    host = 'sakusaku.com:22'
    account = 'sakusaku'

    ; リモート認証に必要な固定文字列を定義
    msg = 'Enter password for user '
    strconcat msg account
    passwordbox msg 'Get password'

    ; 「msg」を作業領域とし、リモート認証に必要な文字列を作成する
    msg = host
    strconcat msg '/ssh /auth=password /user='
    strconcat msg account
    strconcat msg ' /passwd='
    strconcat msg inputstr

    ; 認証する
    connect msg
return

;
; 指定フォルダに移動
;
:setCur
    ; 入力できる状態までまつ
    wait '$ '

    ; フォルダを入力
    inputbox 'フォルダを指定してください(/区切り):' 'フォルダ入力'
    strscan inputstr '/'
    if result <= 0 then
        messagebox '正しいパスを指定して下さい' 'エラー'
        end
    endif

    ; 指定されたフォルダに移動
    cmd = "cd "
    strconcat cmd inputstr
    sendln cmd
return

;
; ダウンロード
;
:dwnload
    ; 入力できる状態までまつ
    wait '$ '

    ; テキストファイルを、すべてzipファイル化
    cmd = "find *.txt | zip -@ file.zip"
    sendln cmd

    ; 入力できる状態までまつ
    wait '$ '

    ; 圧縮ファイルのフルパスを取得
    sendln 'pwd'
    recvln
    recvln
    zipFile = inputstr
    strconcat zipFile '/file.zip'

    ; ダウンロード先のフルパスを取得
    getdir localfile
    strconcat localfile '/file.zip'

    ; ファイルをダウンロード
    scprecv zipFile localfile

return

それでは、ポイントを説明していきます。

ダウンロードマクロのポイント

loginメソッドのマクロについては、以下の記事を参照してください。


フォルダの指定はユーザ指定が可能

このマクロは、Linux上に存在する特定フォルダ配下のファイルを圧縮して、マクロが存在するクライアントPCの指定フォルダに圧縮ファイルをダウンロードします。


圧縮するファイルが存在するLinux上のフォルダですが、このマクロではユーザによる指定を可能としています。


マクロの「setCur」メソッドが、該当箇所になります。

具体的には以下の箇所。


    inputbox 'フォルダを指定してください(/区切り):' 'フォルダ入力'
    strscan inputstr '/'
    if result <= 0 then
        messagebox '正しいパスを指定して下さい' 'エラー'
        end
    endif

inputboxで入力ダイアログを表示し、受け取った文字列に「」’/’を付加して、パスを作成しています。


フォルダ入力ダイアログ

マクロが存在するフォルダにダウンロード

ダウンロードするまでに、いくつかの処理があります。


まずは、圧縮ファイルを作成しています。

拡張子が「txt」のファイルを検索して、file.zipという圧縮ファイルにまとめています。

    ; テキストファイルを、すべてzipファイル化
    cmd = "find *.txt | zip -@ file.zip"
    sendln cmd

次に圧縮ファイルのフルパス作成です。

ここでのフルパスは、Linux上にzipファイルのフルパスです。

現在フォルダ(pwd) + file.zip としています。

    ; 圧縮ファイルのフルパスを取得
    sendln 'pwd'
    recvln
    recvln
    zipFile = inputstr
    strconcat zipFile '/file.zip'

最後にファイルダウンロードです。

 

注意しなければいけないのが、「localfile」になります。

これは、”マクロが存在する場所”になります。

 


ダウンロード自体は簡単で、「scprecv」を呼び出すだけです。

「scprecv」で、セキュアなファイルダウンロードが可能になります。

    ; ダウンロード先のフルパスを取得
    getdir localfile
    strconcat localfile '/file.zip'

    ; ファイルをダウンロード
    scprecv zipFile localfile

まとめ

いかがでしたでしょうか?

TeraTermマクロを使って、ファイルをダウンロードするやり方がわかったかと思います。

まとめ
  • ユーザ入力は「inputbox 」で表示可能
  • ファイルのダウンロードは「scprecv 」

それではまた。



Googleアドセンスの広告が表示されない!原因はなに?

Googleアドセンス

こんにちは。
さくさくTECHブロガーの「さく」です。


最初に言っておきますが、この記事の初版は2019年7月7日です。

タイトルの通りの問題なのですが、どうやら長引きそうだなと判断致しまして、この記事で経緯をまとめる形にしました。


皆さんのGoogleアドセンス運用での助けになれば(なるのか?)と思います。


Googleアドセンスを導入して広告が出ない場合のHowTo になります。


Googleアドセンス審査に合格しました!

思ったよりも早くに合格しちゃいました!


GoogleAdseneceの合格

このメールがGoogleから届いたときはうれしかったですね。

2回目の申請で合格しました。

とはいっても1回目と2回目の間は1ヶ月くらいあって、その間は試行錯誤しました。。。

わたくし、昼間は都内でSIerをやっておりまして、基本は土日にしかまとまった時間がとれないんですよねー。


1回目申請時の不合格理由は『コンテンツが複製されているサイト』だったのですが、”コピーしてねーよ!””どこがコピーなんだよ!”って一人で悪態ついてました。

でも、冷静になっていろいろ調べたのですが、どうやら『あなたのブログは客観的すぎておもしろくありません!』って言われているということがわかったので、いろいろ修正に取り掛かることにしました。

記事の構成を変えたり、言葉の言いまわしを変えたり、記事を削除したり、ですね。 

申請時は15記事あったのですが、大幅にリストラしまして、合格時は8記事です。


同じ理由で不合格になった方は結構いらっしゃるようで、”15回目の申請でやっと合格した!””っていうか諦めた!”という阿鼻叫喚状態だったので心配していましたが、2回目で合格。


2回目で合格する俺ってすげー!って思ったのですが、そこからが苦難の始まりです。


アドセンスの広告が出ないんです!

合格後、4日経った今でも!

さあ、困りました。。。


広告が出ない原因を考えてみる

正確には言うと、広告が出ない訳ではないんですよ。

「合格直後は出ていたけど出なくなった」「一部は出る」って言うのが正確かなと。

合格直後はここに出ていた

確実に合格直後は出ていたんです!(信じて!)

“よくみるブログのよくみる広告”が出ていました。

よしよし、なーんて思ってました。


広告が出ていた箇所1
広告が出ていた箇所1

合格直後の4・5時間は広告が出ていたのですが、その後になぜかパタッと広告が出なくなりました!


なぜだ?!


ちなみに、ブラウザのキャッシュを削除して確認してみたり、ブラウザを変えて確認したり、会社のパソコンから確認したり、とやってみたのですが、現象は変わらずでした。

広告が出る部分もある

まったく広告出ないのであれば、”何か変な設定しちゃったかな?”と思えるのですが、実は広告が出る箇所もあるんです。

だから混乱しちゃってます。

スマートフォン画面でブログをみたときに、ヘッダ上部には広告が出ます。


モバイル上部への広告表示

モバイル上部の広告は出るのですが、サイドバー下部と記事下部の広告は出ないです。

これは、パソコンもスマートフォンも同様。

問題点を探っていく

ネットで検索したら良い記事がありました。

同じようなことで悩んでいる人はいっぱいいるってことですね。



この記事に沿って、16のチェック項目をチェックしていきます。


1.審査中

合格は頂いております。

クリア。


2.広告配信に適しているか審査中

どうやらGoogleは、「このブログにはどんてな広告を出した方がいいのかな?」っていう調べる時間があるようです。

「ブランドプロテクション」っていうらしい。

これが原因かもしれませんが、審査に合格してコードをいれてから4日ほど経っているのに、まだ時間が掛かっているとは考えにくい。

とはいっても可能性はあるので、要チェック。


3.YouTubeやBloggerでアカウントを取得した

そんなことしてません。

クリア。


4.PINを入力していない

収益が1,000円以上達した場合のお話のようです。

こちとら、1円も売り上がっていません。

クリア。


5.Javascriptが有効になっていない

有効です。

あと、キャッシュを全部削除しても同じでした。

クリア。


6.アドブロックを使用している

広告を非表示にするツールを「アドブロックツール」というらしいです。

これが有効になっていると広告が表示されない場合があると。

あやしい。要チェック。


7.コードが正しく設置できていない

正しく設置しているつもりだが。。。

確証を得るには、WordPressの設定も見直したり、もうちょっと調べた方がいい。

要チェック。


8.広告が多くなっていないか

広告はGoogleアドセンスしか設置していないのですが、参考サイトに気になる文書がありました。


逆にコンテンツが少ないページには広告を多く設置してはいけません。


広告は多くないのは確かだが、逆で、コンテンツが少ないと思われていてそれが原因?

要チェック。


9.コードが古いタイプ

ブログをSSL化した際にコードが古いと広告が表示されない場合があるようです。

このブログは最初からSSL化できています。

クリア。


10.NG キーワードが含まれる

健全です。

クリア。


11.ポリシー違反の状態で配信停止

アドセンスのコンソールで確認しましたが、通知は発生していません。

クリア。


12.トラフィックの品質が悪い

んー、怪しい。。。

このブログは2019年5月に公開したばっかりだし、記事も10記事もないし、だからPVも全然ないし。。。

要チェック。


※2019年9月1日

結果、原因はこれでした。

詳細な考察は、本記事の下に記載したのでそちらを参照してください。

Googleアドセンスの広告が出なくて悩んでいる人は参考にしてください。

ある程度PVがないと広告は出ないよ!ってことですね。


13.[サイト]に URL が追加され「準備完了」になっていない

「準備完了」になっています。

クリア。


14.今までアカウントが無効になったことがある

ありません。

クリア。


15.サイト単位(ドメイン)で停止

停止されていません。

クリア。


16.プラグインや他のシステムと干渉

んー、怪しい。。。

このブログはWordPressで作っているのですが、当然、プラグインはいくつか使っています。

このプラグインと干渉して広告が出ないなんてことはあり得る。

要チェック。



こうやって改めて確認していくと、怪しい個所がチラホラとありますね。

この「要チェック」個所をまずは調べていくしかないかなと思っています。


ads.txtのワーニングが出ている

広告が出ないことと関係ないとは思っているのですが、アドセンスの管理コンソールに以下のワーニングが表示され続けています。


ads.txtが配置されていないワーニング

この件は、「ads.txt」をドキュメントルールに配置すればよいという話だったのですが、配置後に4日経った今でもワーニングが消えません。

これが原因なのかなー?


※2019年7月21日

.htaccessの修正をおこないました。

詳細は、下の「2019年7月21日版」を参照。

ちょっと様子見します。


※2019年7月28日

めでたく、「ads.txt」のワーニングは消えました。
という訳で、この問題は解決しました。

よかった。。。


広告を出すために調査する

時間が掛かりそうな問題なので、進展があったら下に内容を追記していきます。

いつになったらまともに広告がでるようになるのやら。

Advanced Adsを使う – 2019/9/1

進展があったので追記。

進展というか解決、です。


実は結構まえから解決はしていたんですが、ブログに書くのが遅くなりました。

結果、広告が出るようになりました。

やったことは以下の2つ。


  • 広告表示のツールを「Advanced Ads」に変更した。
  • ただ待ってみた。

一つ目のやつは、あんまり関係ないかもしれないです。

以前は「Header and Footer」を使って、自動広告を表示するためのJavaScriptを埋め込んでいました。

これを「Advanced Ads」に変更しました。


「Advanced Ads」は、GoogleアドセンスのアカウントIDを入力して、自動広告を表示するをチェックすれば、自動的にHTMLヘッダーにJavaScriptが挿入されます。



「Advanced Ads」に変更したら、広告が出るようになった(ような気がします)。

でもこれは、関係ないと思っています。

なぜなら、「Header and Footer」を使った結果と「Advanced Ads」を使った結果のJavaScriptの出力結果がまったく同じだったので。


結果、広告が表示されるようになったのは。。。「ただ待ってみた」だけかと思います。


「2 広告が出ない原因を考えてみる」を記載しましたが、「12.トラフィックの品質が悪い」が原因だったと思っています。


Googleは、ブログにアクセスされたトラフィックを解析して、このユーザにはどのような広告を出すか?といったことを解析しています。


あまりにもトラフィックが少ないと、Googleはどんな広告を出していいかが解らないので、結果、広告が出ない。

原因はこれかなと。


筆者のブログは、10PV/日あたりの時に広告を挿入しました。

これが良くなかったです。


ちゃんと広告をだすようにするには、少なくとも30PV/日くらいないとダメですね。

それ以下のPVだと、Googleが”このブログは広告を出す価値なし!“って判断しちゃいます。


自動広告ではなく広告ユニット – 2019/8/4

進展があったので追記。

広告の設定方法を変えてみました。

自動広告ではなく広告ユニットの配置で広告を表示するようにしました。


広告の選択方法

自動広告は、ヘッダにアドセンスのJavaScriptコードを配置して終わりってやつ。

広告ユニットは、自分で広告種類を選択して、広告表示位置も指定できるやつ。

広告ユニットを使って広告を表示するようにすると、きちんと広告がでるようになりました。

記事の下に表示する広告ユニットを作成したのですが、ちゃんと出ます。


アドセンスの広告ユニットの表示

筆者のブログはWordPressで構築しているのですが、広告の表示にはAdvanced Adsを使いました。


何か一応、ちゃんと広告がでるようにはなったが。。。

また急に広告が出なくなる可能性もあるので、もうちょい様子見!

ads.txtのワーニング – 2019/7/28

ads.txtのワーニングが消えました。

やはり、前回(7月21日)の対応がきいたようです。


.htaccessへの文字コード追記ですね。


という訳で、adx.txtワーニングの件は解決という事になりました。

肝心の広告は、思ったように出ないままですが。。。


ads.txtチェックツール – 2019/7/21

進展があったので追記。

相変わらず、広告自体は思ったように出ないんですが、「ads.txt」で進展がありました。

「ads.txtチェックツール」というサイトがあると。。。(知らなかった)



早速ためしてみたのですが、以下のエラーを検出!


““ISO-8859-1” は誤った文字コードです。utf-8で作成してください。”というエラーが出ています。

このエラーを消すためには、2つの対処が必要とのことです。


  • ads.txtの文字コードをUTF-8Nにする
  • .htaccessで文字コード指定する

文字コードの方はOKでした。

UTF-8Nとは、BOM無のUTF-8とのことですが、既にUTF-8Nでした。

しかし、2つ目の.htaccessの設定はおこなっていませんでした!


原因はこれだ!ということで、.htaccessに記述を追加しました。

筆者のブログは「ロリポップ」上にWordPressを使って構築しており、SSHでの接続を可能にしています。

なので、WinScpで接続して.htaccessを直接編集しました。

<Files ads.txt>~</Files>の部分を追記しました。


#==== SITEGUARD_RENAME_LOGIN_SETTINGS_END
#SITEGUARD_PLUGIN_SETTINGS_END

<Files ads.txt>
AddType "text/plain; charset=utf-8" .txt
</Files>

# BEGIN WordPress

.htaccessを修正したあとに再度チェックツールを実行してみたところ、見事にエラーが消えました!

これでエラーが消えるか?またしばらく様子見です。



Javaでエクセルを操作したい!POIの環境構築からセルの背景色を設定して出力まで

ApachePOI

こんにちは。

さくさくTECHブロガーの「さく」です。


Webアプリケーションの開発では、“○○○一覧画面の内容をエクセルに出力する”といった場面がよく出てきます。

さらに、“○○○の条件に一致したらセルを赤くして!”といったユーザからのリクエストもありえますね。


Javaからエクセルを操作するための方法として、POIを使ったエクセル操作がとても便利です。

ライブラリが豊富で、ある程度の要件ついては、ほぼ対応することができます。


という訳で今回は、POIを使ってJavaでエクセル操作をおこなう方法を紹介します。


Apache POI

Javaでエクセルを扱うといえば。。。『Apache POI』しかないでしょう!

Apache POIは、Java用のエクセル操作ライブラリになります。

エクセルファイルの読み書き、セルを指定して文字列を出力、セル背景色を変更、といった様々な機能をもっています。

Apache POIの詳細については公式ページを参照ください。

ライブラリ本体(JARファイル)も、公式ページからダウンロードできます。



環境を構築

Apache POIを組み込んだJavaのバッチプログラムを動かすための環境を構築します。

今回、サンプルプログラムを作成した実行した環境としては以下になります。

  • OS:Windows 7
  • Java:Java1.8.0_40
  • Apache POI:poi 4.1.0

Javaのメインクラスを作って、必要なライブラリをダウンロードしてクラスパスを通して。。。といった具合で環境は作れるのですが、筆者はいくつかつまずきました。

ビルドはすんなり通ったのですが、実行しようとしても「NoClassFound」が発生してしまう、などですね。

結果、うまくいったのですが、ビルドする際に必要なJARと実行する際に必要なJARを記載しておきます。


ビルドする際に必要なJAR

  • poi-4.1.0.jar
  • poi-ooxml-4.1.0.jar
  • poi-ooxml-schemas-4.1.0.jar
  • poi-scratchpad-4.1.0.jar

実行する際に必要なJAR

  • poi-4.1.0.jar
  • poi-ooxml-4.1.0.jar
  • poi-ooxml-schemas-4.1.0.jar
  • poi-scratchpad-4.1.0.jar
  • xmlbeans-3.1.0.jar
  • commons-collections4-4.3.jar
  • commons-compress-1.18.jar

サンプルコードを実行するためには、上記のJARをクラスパスに設定する必要があります。


サンプルコードと解説

では実際にプログラムを作成して実行してみます。

以下を実行するプログラムを作成しました。


  1. テンプレートファイルである「template.xlsx」を読み込み。
  2. 3つのセルに文字列を書き込み。同時にそれぞれのセルの背景色設定。
  3. 作成したエクセルファイルを「out.xlsx」として保存。

簡単なプログラムですが、セルに色を付ける方法は理解頂けると。

プログラムは以下になります。


import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.FillPatternType;
import org.apache.poi.ss.usermodel.CellValue;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.ss.usermodel.IndexedColors;

public class PoiColor {

    public static void main(String[] args){
        System.out.print("start: main\r\n");

        Workbook tempbook = null;
        try {
            //--- テンプレートファイルをひらいて、シートを指定 --//
            Path tempPath = Paths.get("./template.xlsx");
            InputStream inSt = Files.newInputStream(tempPath);
            tempbook = new XSSFWorkbook(inSt);
            Sheet sheet = tempbook.getSheet("Sheet1");

            //--- A1セルへの書き込み --//
            //--- セル背景色は栗色 --//
            Row row = sheet.createRow(0);
            Cell cell = row.createCell(0);
            cell.setCellValue("あああ");
            CellStyle styleA1 = tempbook.createCellStyle();
            styleA1.setFillPattern(
                FillPatternType.SOLID_FOREGROUND);
            styleA1.setFillForegroundColor(
                IndexedColors.MAROON.getIndex());
            cell.setCellStyle(styleA1);

            //--- A2セルへの書き込み --//
            //--- セル背景色は青 --//
            row = sheet.createRow(1);
            cell = row.createCell(0);
            cell.setCellValue("いいい");
            CellStyle styleA2 = tempbook.createCellStyle();
            styleA2.setFillPattern(
                FillPatternType.SOLID_FOREGROUND);
            styleA2.setFillForegroundColor(
                IndexedColors.BLUE.getIndex());
            cell.setCellStyle(styleA2);

            //--- A3セルへの書き込み --//
            //--- セル背景色は緑 --//
            row = sheet.createRow(2);
            cell = row.createCell(0);
            cell.setCellValue("ううう");
            CellStyle styleA3 = tempbook.createCellStyle();
            styleA3.setFillPattern(
                FillPatternType.SOLID_FOREGROUND);
            styleA3.setFillForegroundColor(
                IndexedColors.GREEN.getIndex());
            cell.setCellStyle(styleA3);

            //--- out.xlsxとしてファイル出力 --//
            Path outPath = Paths.get("./out.xlsx");
            OutputStream outSt = Files.newOutputStream(outPath);
            tempbook.write(outSt);
        } catch (IOException e) {
            System.out.print("入出力例外が発生!");
        } finally {
            //--- テンプレートをクローズ --//
            try {
                if (tempbook != null) {
                    tempbook.close();
                }
            } catch (IOException e) {
                System.out.print("終了処理で入出力例外が発生!");
            }
        }
        System.out.print("end: main\r\n");
    }
}

このプログラムを実行すると、以下のエクセル(out.xlsx)が出力されます。

ApachePOIを使用したエクセルの出力

では、ポイントを説明していきます。

エクセルの読み込み・書き込み

Apahce POIは「XSSFWorkbook」というクラスでエクセルファイル(ブック)を管理します。

このファイルにInputStreamで読み込んだエクセルファイルを食わせてあげるだけですね。


    Path tempPath = Paths.get("./template.xlsx");
    InputStream inSt = Files.newInputStream(tempPath);
    tempbook = new XSSFWorkbook(inSt);
    Sheet sheet = tempbook.getSheet("Sheet1");

一番最後の「getSheet」は、対象となるシートを指定しています。

“Sheet1をカレントにしている”という感じですね。

セルの指定と文字列書き込み

行(row)と列(colum)を指定する形でセルを特定し、文字列出力などの操作をおこないます。

普段使っているエクセルでは、行は1始まりの番号で、列はAから始まるアルファベットですが、Apache POIは両方とも0オリジンの数値指定です。


    //--- A1セルへの書き込み --//
    //--- セル背景色は栗色 --//
    Row row = sheet.createRow(0);
    Cell cell = row.createCell(0);
    cell.setCellValue("あああ");

上はサンプルコードの一部抜粋ですが、このプログラムで、エクセルのA1セルに”あああ”という文字列を出力しています。

色の指定(スタイル指定)

セルに対する色指定は、スタイル指定という方法で可能です。

サンプルコードでは背景色を設定しています。


    CellStyle styleA1 = tempbook.createCellStyle();
    styleA1.setFillPattern(FillPatternType.SOLID_FOREGROUND);
    styleA1.setFillForegroundColor(IndexedColors.MAROON.getIndex());
    cell.setCellStyle(styleA1);

背景色の設定は、『塗り潰しパターン』と『色』を指定することで設定可能です。

『塗り潰しパターン』は、CellStyle クラスのsetFillPatternメソッドで変更可能です。

設定する値は、FillPatternTypeクラスに列挙型として定義されているようです。


NO_FILL SOLID_FOREGROUND FINE_DOTS ALT_BARS
SPARSE_DOT THICK_HORZ_BANDS THICK_VERT_BANDS THICK_BACKWARD_DIAG
THICK_FORWARD_DIAG BIG_SPOTS BRICKS THIN_HORZ_BANDS
THIN_VERT_BANDS THIN_BACKWARD_DIAG THIN_FORWARD_DIAG SQUARES
DIAMONDS LESS_DOTS LEAST_DOTS  

試しに塗りつぶしパターンを「DIAMONDS」にしてみます。

そうすると、ちょっと出力結果が変わってきます。



格子上の塗りつぶしになりました。

これってつまり、エクセルのセルの書式設定で変更できるやつ、ですね。


FillPatternTypeをDIAMONDに指定

『色』は、CellStyle クラスのsetFillForegroundColorメソッドで変更可能です。

色については、「IndexedColors」に定義されている列挙型で定義されている色のインデックスを指定します。


AQUA AUTOMATIC BLACK BLACK1
BLUE BLUE_GREY BLUE1 BRIGHT_GREEN
BRIGHT_GREEN1 BROWN CORAL CORNFLOWER_BLUE
DARK_BLUE DARK_GREEN DARK_RED DARK_TEAL
DARK_YELLOW GOLD GREEN GREY_25_PERCENT
GREY_40_PERCENT GREY_50_PERCENT GREY_80_PERCENT INDIGO
LAVENDER LEMON_CHIFFON LIGHT_BLUE LIGHT_CORNFLOWER_BLUE
LIGHT_GREEN LIGHT_ORANGE LIGHT_TURQUOISE LIGHT_TURQUOISE1
LIGHT_YELLOW LIME MAROON OLIVE_GREEN
ORANGE ORCHID PALE_BLUE PINK
PINK1 PLUM RED RED1
ROSE ROYAL_BLUE SEA_GREEN SKY_BLUE
TAN TEAL TURQUOISE TURQUOISE1
VIOLET WHITE WHITE1 YELLOW
YELLOW1

どんな色かは、名前からだいたいで察してもらえればと。

まとめ

いかがでしたでしょうか?

Apache POIの基本的な使い方と、セルの色設定方法についてわかって頂いたかと思います。



まとめ
  • Javaでエクセルを操作するためには、Apache POIをつかうべき!
  • Apache POIを使えば、エクセルへの文字列出力だけではなく、色設定も簡単におこなうことができる

それではまた!