昨日の応用編で、実行環境は同じCygwin 2.5.1 x64 + putclip + Cygwinpsql。Excel2007でテストしました。PostgreSQLのデータを、ファイルを経由せずExcelに持っていく方法としては、今日のが個人的ベストな予感。


コマンドはわずか ↓ これだけ。1行目で出力形式を「ヘッダ(列名)ありのタブ区切り」に設定。2行目が任意のクエリ+ \g | putclipで、クエリ結果を直接クリップボードへ突っ込みます。ASCII以外のデータがある場合、最後の行のように文字コード変換が必要。もちろんiconv以外のコマンドラインツールでもOK。
\t off \\ \f '\t' \\ \pset format unaligned
( ... your query ... ) \g | putclip 

-- DB: utf8 -> Excel: sjis
( ... your query ... ) \g | iconv -f utf8 -t sjis | putclip 


昨日もやったけど、\g以降を好きな変数名で保存すれば実行がもっと楽に。エイリアスみたいなものです。
\set vname '\\g | iconv -f utf8 -t sjis | putclip'
( ... your query ...) :vname


↓ 実際の様子。1行目を打つとレスポンスが3行あります。3つの出力設定をまとめて実行してるから(\\で連結)。データのみ必要なら、最初を「\t on」にして下さい。続いてクエリ+メタコマンドを打ってもレスがないので不安になりますが、クリップボードにきちんと格納されており、Excelに移って好きな場所で貼り付けできます。
# \t off \\ \f '\t' \\ \pset format unaligned
Tuples only is off.
Field separator is "    ".
Output format is unaligned.

# select * from pg_tables \g | putclip


同じクエリ結果を、クリップボードでなく普通に表示すると ↓ こんな感じ。列間のタブ区切りが、Excelではセル間の区切りになります。
# select * from pg_tables;
schemaname      tablename       tableowner      tablespace      hasindexes
pg_catalog      pg_statistic    postgres                t       f       f
pg_catalog      pg_type postgres                t       f       f       f
pg_catalog      pg_authid       postgres        pg_global       t       f
pg_catalog      pg_user_mapping postgres                t       f       f
pg_catalog      pg_largeobject  postgres                t       f       f
pg_catalog      pg_attribute    postgres                t       f       f
pg_catalog      pg_proc postgres                t       f       f       f
pg_catalog      pg_class        postgres                t       f       f
...


日本語のクエリ結果で、うっかり文字コード変換を忘れると ↓ 文字化けします。2つ目のクエリ・画像が文字コード変換した正常バージョン。
# select chr(12354 + i) from generate_series(1, 50) as i
  \g | putclip

# select chr(12354 + i) from generate_series(1, 50) as i
  \g | iconv -f utf8 -t sjis | putclip


↓ 少し違う方法で、\copyコマンドの出力先をクリップボードにしても同じことが可能。文字コード指定は不要な一方(自動変換されるぽい)、メタコマンドなので改行を入れられず、\copyのオプションを毎回書く必要があるので実用性は下です。
# \copy (select chr(12354 + i) from generate_series(1, 50) as i) to '/dev/clipboard' (format csv, delimiter e'\t', header true, null '')
COPY 50


同じ\copyからクリップボードで、出力文字コードをSJISに指定すると ↓ 文字化けというよりバイトシーケンスがバラバラで認識された感じでした。
# \copy (select chr(12354 + i) from generate_series(1, 50) as i) to '/dev/clipboard' (encoding sjis, format csv, delimiter e'\t', header true, null '')
COPY 50


\copyコマンドはデフォルトでNULL\Nで明示します。オプションで空白を指定しないと ↓ こんな感じになって直すのに一手間。だから、繰り返しになりますが最初のパターン「出力形式を指定、続いてクエリ+メタコマンド」が使いやすいです。
# \copy (select * from pg_tables) to '/dev/clipboard';
COPY 61