T. Yoshiizumi - exlap_c_test_guide Diff
- Added parts are displayed like this.
- Deleted parts are displayed
like this.
''exlap_c(xmlss作成用rubyライブラリ)サンプル集''
最終更新日:2011/02/092011/06/30
{{br}}
ここではexlap_cライブラリ(ver 1.2.4以降)を利用したサンプルを掲げますは、Excelで扱えるxmlスプレッドシート(xmlss)作成用のrubyライブラリです。
ライブラリに関する解説は、
[[「ここではexlap_cの使い方」|http://cup.sakura.ne.jp/hiki/hiki.cgi?exlap_c_guide]]
ライブラリ(ver 1.3以降)を参照して下さい利用したサンプルを掲げます。
各サンプルではライブラリに関する解説は、カレントディレクトリに euc-jp で書かれた
[[exlap_e.rb|http://cup.sakura.ne.jp/exlap_e.rb]]
があることを仮定しています[[「exlap_cの使い方」|http://cup.sakura.ne.jp/hiki/hiki.cgi?exlap_c_guide]]を参照して下さい。
webを読み込むサンプル「16. 列の幅と行の高さの指定」の実行に当たっては各サンプルでは、予めカレントディレクトリに nokogiri またはShift_JIS で書かれた exlap_s.rb があること、また、スクリプト本体も同じ hpricot のインストールが必要ですShift_JIS で書かれていることを仮定しています。
以下で掲げるサンプルは、
[[exlap_c_test.zip|http://cup.sakura.ne.jp/exlap_c_test.zip]]
に一通り含まれています。
----
{{toc_here}}
----
!1. csvデータの取込み
文字列のcsvデータを与えて取り込んで、xmlssを生成。(csvのファイル名を与えることも可能。)
−−−− ここから
#! ruby-Ke-Ks
# coding:euc-jpShift_JIS
require"./exlap_e""./exlap_s"
include Exl
wb = ExlBook.new
csv_str = "awk,perl\n" + "python,ruby\n"
wb.push(csv_str)
wb.sheets.last.name = "csvデータの取込み" # ワークシート名
wb.output_xml "test01.xml"
−−−− ここまで
----
!2. 2次元配列の取込み
rubyの「配列の配列」(2次元配列)を与えて取り込んでxmlssを生成。
−−−− ここから
#! ruby-Ke-Ks
# coding:euc-jpShift_JIS
require"./exlap_e""./exlap_s"
include Exl
wb = ExlBook.new
ary = [
['awk', 'perl'],
['python', 'ruby']]
wb.push(ary)
wb.sheets.last.name = "2次元配列の取込み"
wb.output_xml "test02.xml"
−−−− ここまで
----
!3. font情報の付加
セルごとに文字色を変える。背景色の指定も行う。
−−−− ここから
#! ruby-Ke-Ks
# coding:euc-jpShift_JIS
require"./exlap_e""./exlap_s"
include Exl
wb = ExlBook.new
ss = ExlSheet.new
ss.name = "font情報の付加"
ary =[%w(awk perl), %w(python ruby)][%w(snow White), %w(sky Blue), %w(earth), %w(sun Red)]
ary.map! {|row|
row.map! {|cell|
case cell
when 'awk'
cellrng = eData(cell, eFont("White"), eInterior("Black")) ss.range(0,0, 1,1) # 白黒反転
when 'perl'
cellA1:B2の2×2の領域をRangeとして設定
rng.each {|cell|
data, color =eData(cell, eFont("Blue"))
when 'ruby'
cellary.shift
cell.Data =eData(cell, eFont("Red"))
else
celldata
cell.Font.Color =cell
endcolor if color
}cell.Interior.Color = "Black" if color == "White"
}
ss = ExlSheet.new(ary, "font情報の付加")
wb.push(ss)
wb.output_xml "test03.xml"
−−−− ここまで
----
!4. 罫線・始点の設定
罫線を引く。また、始点(表の左上端の位置)を指定。
−−−− ここから
#! ruby-Ke-Ks
# coding:euc-jpShift_JIS
require"./exlap_e""./exlap_s"
include Exl
wb = ExlBook.new
ary = [%w(awk perl), %w(python ruby)][%w(desk chair), %w(pencil note)]
ary.map! {|row|
row.map! {|cell|
cellss = eData(cell, eBorder())
}ExlSheet.new(ary)
}
ssss.name = ExlSheet.new(ary, "罫線・始点の設定", [1,1]) "
ss.start_rc = [1,1] # 始点をB2に設定にする
ss.used_range.allbox() # データのある領域のセルを総て罫線で囲む
wb.push(ss)
wb.output_xml "test04.xml"
−−−− ここまで
----
!5. 文字の配置
結合セル(3(3×3)3)の中で、文字の位置を様々に指定。3×3の結合セルを4つ設ける。
−−−− ここから
#! ruby-Ke-Ks
# coding:euc-jpShift_JIS
require"./exlap_e""./exlap_s"
include Exl
wb = ExlBook.new
ss = ExlSheet.new
ss.name = "文字の配置"
ary =[[%w(dog Left Top), %w(cat Center Center),
['awk', nil, nil, 'perl', nil, nil],
[],
[],
['python', nil, nil, 'ruby', nil, nil],
[],
[]]%w(cow Left Bottom), %w(horse Right Bottom)]
ary.map! {|row|height = 3 # 縦の結合幅
width = 3 # 横の結合幅
[0, height].each {|y|
row.map! {|cell|[0, width].each {|x|
params rng = [] ss.range(y,x, y+height-1, x+width-1)
cell = rng.cell(0,0) #eAlignment() に渡す引数Rangeの左上端のセル
case cell
when 'awk'
paramsdata, horizontal, vertical = %w(Left Top)ary.shift
when 'perl'
paramscell.Data = %w(Center Center)data
when 'python'
paramscell.Alignment.Horizontal = %w(Left Bottom)horizontal
when 'ruby'
paramscell.Alignment.Vertical = %w(Right Bottom)vertical
end
cellrng.merge_cells = eData(cell, eSpan(3,3), eAlignment(*params))true # セル結合
}
}
ss = ExlSheet.new(ary, "文字の配置")
wb.push(ss)
wb.output_xml "test05.xml"
−−−− ここまで
----
!6. 数値の表示形式
数値を小数点2桁まで表示するように設定。
−−−− ここから
#! ruby-Ke-Ks
# coding:euc-jpShift_JIS
require"./exlap_e""./exlap_s"
include Exl
wb = ExlBook.new
ary = [
[56, 12.4, 35.42],
[234.8, 94, 39.1]]
ary.map! {|row|
row.map! {|cell|
cellss = eData(cell, eNumberFormat("##0.00"))ExlSheet.new(ary)
ss.name = "数値の表示形式"
ss.used_range.each {|cell|
}cell.NumberFormat = "##0.00"
}
ss = ExlSheet.new(ary, "数値の表示形式")
wb.push(ss)
wb.output_xml "test06.xml"
−−−− ここまで
----
!7. 表示形式あれこれ
001問題への対応、パーセントや日付の表示形式への対応の例。
−−−− ここから
#! ruby-Ke-Ks
# coding:euc-jpShift_JIS
require"./exlap_e""./exlap_s"
include Exl
wb = ExlBook.new
csv_str = <<EOS1
001,"1,234",123,12
002,50%,3.14%,"1,234%"
003,2010/10/07,2010年10月8日,平成22年10月9日
004,01:14,15:32:08
EOS1
wb.push(csv_str)
wb.sheets.last.name = "表示形式あれこれ"
wb.output_xml "test07.xml"
−−−− ここまで
----
!8. 関数の設定
Excelの関数 SUM, LOWER を設定する例。それら関数の代替rubyスクリプトも定義。代替スクリプトは、なくてもかまわない。
−−−− ここから
#! ruby-Ke-Ks
# coding:euc-jpShift_JIS
require"./exlap_e""./exlap_s"
include Exl
wb = ExlBook.new
formula1 = "=SUM(RC[-3]:RC[-1])"
$formula[formula1] = <<SCR1
total = 0
aa[rn][cn-3..cn-1].each do |cell|
total += getData(cell).to_i
end
data = total
SCR1
formula2 = "=LOWER(RC[-1])"
$formula[formula2] = "data = getData(aa[rn][cn-1]).to_s.tr('A-Z', 'a-z')"
ary ss = [
ExlSheet.new
ss.name = "関数の設定"
ss.range(0,0, 0,3).Data = [5, 6, 7,eData(1, eFormula(formula1))],
5+6+7]
ss.cell(0,3).Formula = formula1
ss.range(1,0, 1,1).Data = ["ABC",eData("x", eFormula(formula2))]]"abc"]
ss ss.cell(1,1).Formula = ExlSheet.new(ary, "関数の設定")formula2
wb.push(ss)
wb.output_xml "test08.xml"
−−−− ここまで
----
!9. 表単位でのfont情報設定
表全体について、文字を緑色にし、総てのセルに罫線を引く。
−−−− ここから
#! ruby-Ke-Ks
# coding:euc-jpShift_JIS
require"./exlap_e""./exlap_s"
include Exl
wb = ExlBook.new
ary = [%w(awk perl), %w(python ruby)][%w(grass leaf), %w(tree forest)]
ss =ExlSheet.new(ary, ExlSheet.new(ary)
ss.name = "表単位でのfont情報設定")"
ss.tbl =eFont("Green").update(eBorder())eFont("Green").mrg( eBorder() )
wb.push(ss)
wb.output_xml "test09.xml"
−−−− ここまで
----
!10. 列単位でのfont情報設定
第1列目を総て茶色、第2列目を総て水色に設定。
−−−− ここから
#! ruby-Ke-Ks
# coding:euc-jpShift_JIS
require"./exlap_e""./exlap_s"
include Exl
wb = ExlBook.new
ary = [%w(awk perl), %w(python ruby)][%w(linux FreeBSD), %w(Windows android)]
ss =ExlSheet.new(ary, ExlSheet.new(ary)
ss.name = "列単位でのfont情報設定")
ss.col[0] = eFont("Brown")"
ss.col[1] ss.col = eFont("Cyan")[eFont("Brown"), eFont("Cyan")]
wb.push(ss)
wb.output_xml "test10.xml"
−−−− ここまで
----
!11. 行単位でのfont情報設定
第1行目を総てピンク、第2行目を総て白黒反転に設定。
−−−− ここから
#! ruby-Ke-Ks
# coding:euc-jpShift_JIS
require"./exlap_e""./exlap_s"
include Exl
wb = ExlBook.new
ary = [%w(awk perl), %w(python ruby)][%w(bicycle car), %w(ship train)]
ss =ExlSheet.new(ary, ExlSheet.new(ary)
ss.name = "行単位でのfont情報設定")"
ss.row[0] = eFont("Magenta")
ss.row[1] =eFont("White").update(eInterior("Black"))eFont("White")
ss.row[1].Interior.Color = "Black"
wb.push(ss)
wb.output_xml "test11.xml"
−−−− ここまで
----
!12. 部分的なfont情報の付加
セル内の文字列の一部に色を付けたりする。html記述で実現。
−−−− ここから
#! ruby-Ke-Ks
# coding:euc-jpShift_JIS
require"./exlap_e""./exlap_s"
include Exl
wb = ExlBook.new
ary ss = []ExlSheet.new
ary << ['ss.name = "部分的なfont情報の付加"
ss.col = [eWidth(36), eWidth(36)] # 列幅の設定
rng = ss.range(0,0, 1,1)
rng.Data = [
'キーワードは<I>xmlss</I><Font>(イタリック)です.</Font>',
'キーワードは<B>ruby</B><Font>(太字)です.</Font>']
ary << ['</Font>',
'キーワードは<U>SpreadSheet</U><Font>(下線)です.</Font>',
'キーワードは<Fonthtml:Color="Red">Excel</Font>' +
'<Font>(html:Color="Red">Excel</Font><Font>(赤色)です.</Font>']
ss rng.each {|cell|
cell.Type =ExlSheet.new(ary, "部分的なfont情報の付加")'String@html'
ss.array_update(eType('String@html')) # 全セルにhtml記述属性を設定
ss.col[0] = eWidth(36) # 列幅の設定
ss.col[1] = eWidth(36)}
wb.push(ss)
wb.output_xml "test12.xml"
−−−− ここまで
----
!13. ふりがな
ふりがなを付ける。その第1行目と2行目は、ふりがな表示/非表示の指定も行うoff。3行目と4行目はon。第2列目には、ふりがなのみ表示。
−−−− ここから
#! ruby-Ke-Ks
# coding:euc-jpShift_JIS
require"./exlap_e""./exlap_s"
include Exl
wb = ExlBook.new
list ary = [
%w(虚心坦懐 キョシンタンカイ),
%w(君子豹変 クンシヒョウヘン),
%w(羽化登仙 ウカトウセン),
%w(我田引水 ガデンインスイ)]
ary ss = []ExlSheet.new
list.each_with_index {|rs, i|
rowss.name = []"ふりがな"
rng = ss.range(0,0, 3,1) # 4行・2列
rng.each_with_yx {|cell, y, x|
if i <= 1 case x
when 0 # 第1行目と第2行目列目
row << eData(rs[0], ePhoneticText(rs[1])) data, phonetic = ary.shift
cell.Data = data
cell.PhoneticText.Text = phonetic
if y >= 2 # 第3行目と4行目は、ふりがな・非表示表示on
cell.PhoneticText.Visible = 1
end
else when 1 # 3行目以降第2列目
row << eData(rs[0], ePhoneticText(rs[1], 1)) cell.Data = 'x' # ふりがな・表示適当な文字列(なんでもよい)
cell.Formula = '=PHONETIC(RC[-1])' # 左隣セルのふりがなを得る
end
row << eData('x', eFormula('=PHONETIC(RC[-1])')) # Excelの関数PHONETIC
ary << row
}
ss = ExlSheet.new(ary, "ふりがな")
ss.col[1] = eWidth(16) # 第2列目の幅を16桁に
wb.push(ss)
wb.output_xml "test13.xml"
−−−− ここまで
----
!14. 非表示属性
特定の列または行に非表示属性を付ける。3行のうちの第2行目、3列のうちの第2列目を非表示にする。
−−−− ここから
#! ruby-Ke-Ks
# coding:euc-jpShift_JIS
require"./exlap_e""./exlap_s"
include Exl
wb = ExlBook.new
ary = [%w(1 awk perl),
%w(2 fortran cobol),
%w(3 python ruby)]
ss = ExlSheet.new(ary, "非表示属性")
ss.col[1] = eHidden(1) # 第2列目を非表示に
ss.row[1] = eHidden(1) # 第2行目を非表示に
wb.push(ss)
wb.output_xml "test14.xml"
−−−− ここまで
----
!15. ハイパーリンク
ハイパーリンクを設定。
−−−− ここから
#! ruby-Ke-Ks
# coding:euc-jpShift_JIS
require"./exlap_e""./exlap_s"
include Exl
wb = ExlBook.new
list ary = [
%w(ルビマ http://jp.rubyist.net/magazine/),
%w(経済産業省 http://www.meti.go.jp/)]
ary ss = []ExlSheet.new
list.each {|rs|ss.name = "ハイパーリンク"
ss.range(0,0, 1,0).each {|cell|
data, href = ary.shift
cell.Data = data
ary << [eData(rs[0], eHRef(rs[1]))]cell.HRef = href
}
ss = ExlSheet.new(ary, "ハイパーリンク")
wb.push(ss)
wb.output_xml "test15.xml"
−−−− ここまで
----
!16.列の幅と行の高さの指定別シートのコピーと外枠罫線
視聴率調査結果をwebから取得。データが総て見えるよう列の幅と行の高さを調整別のワークシートの内容を第2行目以降(A2欄以降)にコピーし、それを外枠罫線で囲む。
−−−− ここから
#! ruby-Ke-Ks
# coding:euc-jpShift_JIS
require"./exlap_e""./exlap_s"
include Exl
wb = ExlBook.new
url csv_str = 'http://www.videor.co.jp/data/ratedata/top10.htm' "awk,perl\n" + "python,ruby\n"
wb.push(csv_str)
ss = ExlSheet.new
ss.name = "別シートのコピーと外枠罫線"
rng = ss.copy_from(1,0, wb.sheets.last)
rng.framebox
wb.push(ss)
wb.output_xml "test16.xml"
−−−− ここまで
----
!17. 列の幅と行の高さの指定
関東地区の視聴率調査結果をwebから取得。データが総て見えるよう列の幅と行の高さを調整。
このスクリプトが動くためには、htmlパーサの hpricot または nokogiri (どちらもruby用ライブラリ)が予めインストールされている必要がある。
−−−− ここから
#! ruby -Ks
#視聴率調査coding: Shift_JIS
require "./exlap_s"
include Exl
wb = ExlBook.new
url = 'http://www.videor.co.jp/data/ratedata/top10.htm'
wb.push(url)
puts '列の幅と行の高さを指定する例(視聴率調査データ)'
puts '各列の最大幅を標準出力に出力.'
scr = 'str = str.gsub(/\n[ \t]+/,"\n")' # 各セルに適用する変換script"\n")'
wb.sheets.map! {|ss|
ss.array_convert(scr)
mc =ss.mloc # 各列の最大幅を取得ss.mloc
p mc
over_flag =false # 40桁超のセルがあればtrueにfalse
for i in 0...mc.size
if mc[i] > 40
mc[i] = 40
over_flag = true
end
ss.col[i] = eWidth(mc[i])
end
ss.row[1] = eHeight(2) # 第2行目は必ず2行分の高さにする高さ
if over_flag # 桁数オーバーのものがあった
for i in 2...ss.max_row # 3行目以降の高さを2行分に
ss.row[i] = eHeight(2)
end
end
ss.array_update(eAlignment(nil, nil,1)) # 行の折り畳みon1))
}
wb.output_xml"test16.xml""test17.xml"
−−−− ここまで
----
!17.!18. 選択入力欄(ドロップダウンリスト)の設定その1
選択入力欄(ドロップダウンリスト)の設定。選択肢を文字列で与える。
−−−− ここから
#! ruby-Ke-Ks
# coding:euc-jpShift_JIS
require"./exlap_e""./exlap_s"
include Exl
wb = ExlBook.new
ary = [
%w(質問1 ?),
%w(質問2 ?),
%w(質問3 ?)]
ss = ExlSheet.new(ary, "アンケート")
input_area = "R1C2:R#{ary.size}C2" # 選択入力欄の番地
list = "◎,△,×" # 選択候補(カンマ区切り)
ss.other['DataValidation'] = <<EOS1
<DataValidation xmlns="urn:schemas-microsoft-com:office:excel">
<Range>#{input_area}</Range>
<Type>List</Type>
<CellRangeList/>
<Value>"#{list}"</Value>
</DataValidation>
EOS1
wb.push(ss)
wb.output_xml"test17.xml""test18.xml"
−−−− ここまで
----
!18.!19. 選択入力欄(ドロップダウンリスト)の設定その2
選択入力欄(ドロップダウンリスト)の設定。選択肢を別のシートに書いておく。
−−−− ここから
#! ruby-Ke-Ks
# coding:euc-jpShift_JIS
require"./exlap_e""./exlap_s"
include Exl
wb = ExlBook.new
range_name = "部署名" # 名前付き範囲の名称
sheet_name2 = "候補リスト" # 入力候補を記した次ワークシートの名前
##
ary = [
%w(氏名 所属),
%w(高橋一郎 ?),
%w(鈴木次郎 ?),
%w(佐藤三郎 ?)]
ss = ExlSheet.new(ary, "社員")
input_area = "R2C2:R#{ary.size}C2" # 選択入力欄の番地
ss.other['DataValidation'] = <<EOS1
<DataValidation xmlns="urn:schemas-microsoft-com:office:excel">
<Range>#{input_area}</Range>
<Type>List</Type>
<Value>#{range_name}</Value>
</DataValidation>
EOS1
wb.push(ss)
# ↓ 選択候補を次シートに設定
ary = [%w(総務課 営業課 人事課 研修課 開発課)]
ss = ExlSheet.new(ary, sheet_name2)
# ss.row[0] = eHidden(1) # 第1行目を非表示にするならコメントアウト
ss.array[0].map! {|cell|
cell = eData(cell, eNamedCell(range_name))
}
wb.push(ss)
##
option_area = "R1C1:R1C#{ary[0].size}" # 名前付き範囲(選択候補)の番地
wb.other['Names'] = <<EOS2
<Names>
<NamedRange ss:Name="#{range_name}" ss:RefersTo="=#{sheet_name2}!#{option_area}"/>
</Names>
EOS2
wb.output_xml"test18.xml""test19.xml"
−−−− ここまで
----
!19.!20. 条件付き書式
1〜6の乱数を10回発生させてセルに書き込み、3以下なら文字を青色にする。
−−−− ここから
#! ruby-Ke-Ks
# coding:euc-jpShift_JIS
require"./exlap_e""./exlap_s"
include Exl
wb = ExlBook.new
# 1〜6の乱数を10回発生させて記録
row = []
10.times do
n = rand(6) + 1
row << n
end
ary = [row]
ss = ExlSheet.new(ary, "条件付き書式")
# 条件設定のための情報をセット
# セルのテータが3以下なら青文字にする
area = "R1C1:R1C#{ary[0].size}" # 書式設定エリア
opr = "LessOrEqual" # <=
val = "3"
clr = "blue"
ss.other['ConditionalFormatting'] = <<EOS1
<ConditionalFormatting xmlns="urn:schemas-microsoft-com:office:excel">
<Range>#{area}</Range>
<Condition>
<Qualifier>#{opr}</Qualifier>
<Value1>#{val}</Value1>
<Format Style='color:#{clr}'/>
</Condition>
</ConditionalFormatting>
EOS1
##
wb.push(ss)
wb.output_xml"test19.xml""test20.xml"
−−−− ここまで
[補足] 上の例で「3以下」を設定していますが、数値としての比較でなく文字列での比較になるようです。なので、「7」と「10」を比較したとするなら「7」の方が大きいと判断されるみたいです。
数値として比較する方法を含め、条件付き書式に関するxmlss記述にはいろいろなバリエーションがあるようですが、まだ把握していません。
とりあえず最も簡単な例を掲げてみました。
----
!番外編 xmlssをクライアント側のExcelで開かせるためのcgi
「3. font情報の付加」のxmlssをクライアント側のExcelで開かせるためのcgi
rubyのcgiライブラリを使って書いた1例を掲げます。
−−−− ここから
#!/usr/local/bin/ruby-Ke-Ks
# coding:euc-jpShift_JIS
require"./exlap_e""./exlap_s"
require "cgi"
include Exl
# クライアントにExcelファイルを送るメソッド
def send_excel(filename, body)
header = {
'status'=>"OK",
'Pragma'=>"no-cache",
'Expires'=>"0",
'Content-type'=>"application/vnd.ms-excel",
'Content-Disposition'=>"attachment; filename=\"#{filename}\""
}
cgi = CGI.new("html4")
cgi.out(header) {body}
end
## main: xmlss生成&クライアントに送信
wb = ExlBook.new
ss = ExlSheet.new
ss.name = "font情報の付加"
ary =[%w(awk perl), %w(python ruby)][%w(snow White), %w(sky Blue), %w(earth), %w(sun Red)]
ary.map! {|row|
row.map! {|cell|
case cell
when 'awk'
cellrng = eData(cell, eFont("White"), eInterior("Black")) ss.range(0,0, 1,1) # 白黒反転
when 'perl'
cellA1:B2の2×2の領域をRangeとして設定
rng.each {|cell|
data, color =eData(cell, eFont("Blue"))
when 'ruby'
cellary.shift
cell.Data =eData(cell, eFont("Red"))
else
celldata
cell.Font.Color =cell
endcolor if color
}cell.Interior.Color = "Black" if color == "White"
}
ss = ExlSheet.new(ary, "font情報の付加")
wb.push(ss)
body = wb.xml_string # xmlssを文字列で得る
filename = "test03.xml"
send_excel(filename, body)
−−−− ここまで
上のcgiスクリプトを
[[test03.cgi|http://cup.sakura.ne.jp/test03.cgi]]
[[test03.cgi|http://cup.sakura.ne.jp/test03.cgi]] として、当方のサーバ(FreeBSD 7.2, ruby 1.8.7)に置いてみました。
このcgiにブラウザでアクセスすると、開くか保存するかキャンセルするかを選ぶダイアログボックスが出ます(その前にセキュリティの警告が出るかもしれません)。そこで「開く」を選ぶと、Excelが起動します。
ただただし、クライアント側のExcelがExcel2002(Office XP版)だと、「開く」を選んでもExcelが起動しないようです。「保存」は可能です。
cgiスクリプト内のfilenameの値 test03.xml を test03.xls にすれば、Excel2002でも開けるようになりますが、そうすると逆に、Excel2007などでは無用な警告メッセージが出るようになります。「拡張子と中身が違っていますが、開きますか?」といったメッセージです。
Excelのバージョン、あるいは、ブラウザの種類やバージョンにも左右されるかもしれない中途半端なcgiではありますが、1つの簡単な参考例として掲げてみました。
{{br}}
− 以上 −
最終更新日:
{{br}}
[[「
[[exlap_e.rb|http://cup.sakura.ne.jp/exlap_e.rb]]
があることを仮定しています
[[exlap_c_test.zip|http://cup.sakura.ne.jp/exlap_c_test.zip]]
に一通り含まれています。
{{toc_here}}
----
!1. csvデータの取込み
文字列のcsvデータを
−−−− ここから
#! ruby
# coding:
require
include Exl
wb = ExlBook.new
wb.push(csv_str)
wb.sheets.last.name = "csvデータの取込み" # ワークシート名
wb.output_xml "test01.xml"
−−−− ここまで
----
!2. 2次元配列の取込み
rubyの「配列の配列」(2次元配列)を
−−−− ここから
#! ruby
# coding:
require
include Exl
wb = ExlBook.new
['awk', 'perl'],
['python', 'ruby']]
wb.push(ary)
wb.sheets.last.name = "2次元配列の取込み"
wb.output_xml "test02.xml"
−−−− ここまで
----
!3. font情報の付加
セルごとに文字色を変える。背景色の指定も行う。
−−−− ここから
#! ruby
# coding:
require
include Exl
wb = ExlBook.new
ss.name = "font情報の付加"
ary =
row.map! {|cell|
case cell
when 'awk'
cell
when 'perl'
cell
rng.each {|cell|
data, color =
when 'ruby'
cell
cell.Data =
else
cell
cell.Font.Color =
end
}
wb.output_xml "test03.xml"
−−−− ここまで
----
!4. 罫線・始点の設定
罫線を引く。また、始点(表の左上端の位置)を指定。
−−−− ここから
#! ruby
# coding:
require
include Exl
wb = ExlBook.new
row.map! {|cell|
cell
}
ss
ss.start_rc = [1,1] # 始点をB2
ss.used_range.allbox() # データのある領域のセルを総て罫線で囲む
wb.push(ss)
wb.output_xml "test04.xml"
−−−− ここまで
----
!5. 文字の配置
結合セル
−−−− ここから
#! ruby
# coding:
require
include Exl
wb = ExlBook.new
ss.name = "文字の配置"
ary =
[],
[],
['python', nil, nil, 'ruby', nil, nil],
[],
[]]
width = 3 # 横の結合幅
[0, height].each {|y|
cell = rng.cell(0,0) #
when 'awk'
params
params
params
params
cell
}
}
wb.output_xml "test05.xml"
−−−− ここまで
----
!6. 数値の表示形式
数値を小数点2桁まで表示するように設定。
−−−− ここから
#! ruby
# coding:
require
include Exl
wb = ExlBook.new
[56, 12.4, 35.42],
[234.8, 94, 39.1]]
row.map! {|cell|
cell
ss.name = "数値の表示形式"
ss.used_range.each {|cell|
}
wb.output_xml "test06.xml"
−−−− ここまで
----
!7. 表示形式あれこれ
001問題への対応、パーセントや日付の表示形式への対応の例。
−−−− ここから
#! ruby
# coding:
require
include Exl
wb = ExlBook.new
001,"1,234",123,12
002,50%,3.14%,"1,234%"
003,2010/10/07,2010年10月8日,平成22年10月9日
004,01:14,15:32:08
EOS1
wb.push(csv_str)
wb.sheets.last.name = "表示形式あれこれ"
wb.output_xml "test07.xml"
−−−− ここまで
----
!8. 関数の設定
Excelの関数 SUM, LOWER を設定する例。それら関数の代替rubyスクリプトも定義。代替スクリプトは、なくてもかまわない。
−−−− ここから
#! ruby
# coding:
require
include Exl
wb = ExlBook.new
$formula[formula1] = <<SCR1
total = 0
aa[rn][cn-3..cn-1].each do |cell|
total += getData(cell).to_i
end
data = total
SCR1
formula2 = "=LOWER(RC[-1])"
$formula[formula2] = "data = getData(aa[rn][cn-1]).to_s.tr('A-Z', 'a-z')"
ss.name = "関数の設定"
ss.range(0,0, 0,3).Data = [5, 6, 7,
ss.cell(0,3).Formula = formula1
ss.range(1,0, 1,1).Data = ["ABC",
wb.push(ss)
wb.output_xml "test08.xml"
−−−− ここまで
----
!9. 表単位でのfont情報設定
表全体について、文字を緑色にし、総てのセルに罫線を引く。
−−−− ここから
#! ruby
# coding:
require
include Exl
wb = ExlBook.new
ss =
ss.name = "表単位でのfont情報設定
ss.tbl =
wb.push(ss)
wb.output_xml "test09.xml"
−−−− ここまで
----
!10. 列単位でのfont情報設定
第1列目を総て茶色、第2列目を総て水色に設定。
−−−− ここから
#! ruby
# coding:
require
include Exl
wb = ExlBook.new
ss =
ss.name = "列単位でのfont情報設定
ss.col[0] = eFont("Brown")
wb.push(ss)
wb.output_xml "test10.xml"
−−−− ここまで
----
!11. 行単位でのfont情報設定
第1行目を総てピンク、第2行目を総て白黒反転に設定。
−−−− ここから
#! ruby
# coding:
require
include Exl
wb = ExlBook.new
ss =
ss.name = "行単位でのfont情報設定
ss.row[0] = eFont("Magenta")
ss.row[1] =
ss.row[1].Interior.Color = "Black"
wb.push(ss)
wb.output_xml "test11.xml"
−−−− ここまで
----
!12. 部分的なfont情報の付加
セル内の文字列の一部に色を付けたりする。html記述で実現。
−−−− ここから
#! ruby
# coding:
require
include Exl
wb = ExlBook.new
ary
ss.col = [eWidth(36), eWidth(36)] # 列幅の設定
rng = ss.range(0,0, 1,1)
rng.Data = [
'キーワードは<I>xmlss</I><Font>(イタリック)です.</Font>',
'キーワードは<B>ruby</B><Font>(太字)です.
ary << ['
'キーワードは<U>SpreadSheet</U><Font>(下線)です.</Font>',
'キーワードは<Font
'<Font>(
cell.Type =
ss.col[0] = eWidth(36) # 列幅の設定
ss.col[1] = eWidth(36)
wb.push(ss)
wb.output_xml "test12.xml"
−−−− ここまで
----
!13. ふりがな
ふりがなを付ける。
−−−− ここから
#! ruby
# coding:
require
include Exl
wb = ExlBook.new
list
%w(虚心坦懐 キョシンタンカイ),
%w(君子豹変 クンシヒョウヘン),
%w(羽化登仙 ウカトウセン),
%w(我田引水 ガデンインスイ)]
row
rng = ss.range(0,0, 3,1) # 4行・2列
rng.each_with_yx {|cell, y, x|
when 0 # 第1
cell.Data = data
cell.PhoneticText.Text = phonetic
if y >= 2 # 第3行目と4行目は、ふりがな
cell.PhoneticText.Visible = 1
end
cell.Formula = '=PHONETIC(RC[-1])' # 左隣セルのふりがなを得る
end
ary << row
wb.push(ss)
wb.output_xml "test13.xml"
−−−− ここまで
----
!14. 非表示属性
特定の列または行に非表示属性を付ける。3行のうちの第2行目、3列のうちの第2列目を非表示にする。
−−−− ここから
#! ruby
# coding:
require
include Exl
wb = ExlBook.new
%w(2 fortran cobol),
%w(3 python ruby)]
ss = ExlSheet.new(ary, "非表示属性")
ss.col[1] = eHidden(1) # 第2列目を非表示に
ss.row[1] = eHidden(1) # 第2行目を非表示に
wb.push(ss)
wb.output_xml "test14.xml"
−−−− ここまで
----
!15. ハイパーリンク
ハイパーリンクを設定。
−−−− ここから
#! ruby
# coding:
require
include Exl
wb = ExlBook.new
list
%w(ルビマ http://jp.rubyist.net/magazine/),
%w(経済産業省 http://www.meti.go.jp/)]
ss.range(0,0, 1,0).each {|cell|
data, href = ary.shift
cell.Data = data
}
wb.output_xml "test15.xml"
−−−− ここまで
----
!16.
−−−− ここから
#! ruby
# coding:
require
include Exl
wb = ExlBook.new
url
wb.push(csv_str)
ss = ExlSheet.new
ss.name = "別シートのコピーと外枠罫線"
rng = ss.copy_from(1,0, wb.sheets.last)
rng.framebox
wb.push(ss)
wb.output_xml "test16.xml"
−−−− ここまで
----
!17. 列の幅と行の高さの指定
関東地区の視聴率調査結果をwebから取得。データが総て見えるよう列の幅と行の高さを調整。
このスクリプトが動くためには、htmlパーサの hpricot または nokogiri (どちらもruby用ライブラリ)が予めインストールされている必要がある。
−−−− ここから
#! ruby -Ks
#
require "./exlap_s"
include Exl
wb = ExlBook.new
url = 'http://www.videor.co.jp/data/ratedata/top10.htm'
wb.push(url)
puts '列の幅と行の高さを指定する例(視聴率調査データ)'
puts '各列の最大幅を標準出力に出力.'
scr = 'str = str.gsub(/\n[ \t]+/,
wb.sheets.map! {|ss|
ss.array_convert(scr)
mc =
p mc
over_flag =
for i in 0...mc.size
if mc[i] > 40
mc[i] = 40
over_flag = true
end
ss.col[i] = eWidth(mc[i])
end
ss.row[1] = eHeight(2) # 第2行目は必ず2行分の
if over_flag # 桁数オーバーのものがあった
for i in 2...ss.max_row # 3行目以降の高さを2行分に
ss.row[i] = eHeight(2)
end
end
ss.array_update(eAlignment(nil, nil,
}
wb.output_xml
−−−− ここまで
----
選択入力欄(ドロップダウンリスト)の設定。選択肢を文字列で与える。
−−−− ここから
#! ruby
# coding:
require
include Exl
wb = ExlBook.new
%w(質問1 ?),
%w(質問2 ?),
%w(質問3 ?)]
ss = ExlSheet.new(ary, "アンケート")
input_area = "R1C2:R#{ary.size}C2" # 選択入力欄の番地
list = "◎,△,×" # 選択候補(カンマ区切り)
ss.other['DataValidation'] = <<EOS1
<DataValidation xmlns="urn:schemas-microsoft-com:office:excel">
<Range>#{input_area}</Range>
<Type>List</Type>
<CellRangeList/>
<Value>"#{list}"</Value>
</DataValidation>
EOS1
wb.push(ss)
wb.output_xml
−−−− ここまで
----
選択入力欄(ドロップダウンリスト)の設定。選択肢を別のシートに書いておく。
−−−− ここから
#! ruby
# coding:
require
include Exl
wb = ExlBook.new
sheet_name2 = "候補リスト" # 入力候補を記した次ワークシートの名前
##
ary = [
%w(氏名 所属),
%w(高橋一郎 ?),
%w(鈴木次郎 ?),
%w(佐藤三郎 ?)]
ss = ExlSheet.new(ary, "社員")
input_area = "R2C2:R#{ary.size}C2" # 選択入力欄の番地
ss.other['DataValidation'] = <<EOS1
<DataValidation xmlns="urn:schemas-microsoft-com:office:excel">
<Range>#{input_area}</Range>
<Type>List</Type>
<Value>#{range_name}</Value>
</DataValidation>
EOS1
wb.push(ss)
# ↓ 選択候補を次シートに設定
ary = [%w(総務課 営業課 人事課 研修課 開発課)]
ss = ExlSheet.new(ary, sheet_name2)
# ss.row[0] = eHidden(1) # 第1行目を非表示にするならコメントアウト
ss.array[0].map! {|cell|
cell = eData(cell, eNamedCell(range_name))
}
wb.push(ss)
##
option_area = "R1C1:R1C#{ary[0].size}" # 名前付き範囲(選択候補)の番地
wb.other['Names'] = <<EOS2
<Names>
<NamedRange ss:Name="#{range_name}" ss:RefersTo="=#{sheet_name2}!#{option_area}"/>
</Names>
EOS2
wb.output_xml
−−−− ここまで
----
1〜6の乱数を10回発生させてセルに書き込み、3以下なら文字を青色にする。
−−−− ここから
#! ruby
# coding:
require
include Exl
wb = ExlBook.new
row = []
10.times do
n = rand(6) + 1
row << n
end
ary = [row]
ss = ExlSheet.new(ary, "条件付き書式")
# 条件設定のための情報をセット
# セルのテータが3以下なら青文字にする
area = "R1C1:R1C#{ary[0].size}" # 書式設定エリア
opr = "LessOrEqual" # <=
val = "3"
clr = "blue"
ss.other['ConditionalFormatting'] = <<EOS1
<ConditionalFormatting xmlns="urn:schemas-microsoft-com:office:excel">
<Range>#{area}</Range>
<Condition>
<Qualifier>#{opr}</Qualifier>
<Value1>#{val}</Value1>
<Format Style='color:#{clr}'/>
</Condition>
</ConditionalFormatting>
EOS1
##
wb.push(ss)
wb.output_xml
−−−− ここまで
[補足] 上の例で「3以下」を設定していますが、数値としての比較でなく文字列での比較になるようです。なので、「7」と「10」を比較したとするなら「7」の方が大きいと判断されるみたいです。
数値として比較する方法を含め、条件付き書式に関するxmlss記述にはいろいろなバリエーションがあるようですが、まだ把握していません。
とりあえず最も簡単な例を掲げてみました。
----
!番外編 xmlssをクライアント側のExcelで開かせるためのcgi
rubyのcgiライブラリを使って書いた1例を掲げます。
−−−− ここから
#!/usr/local/bin/ruby
# coding:
require
require "cgi"
include Exl
def send_excel(filename, body)
header = {
'status'=>"OK",
'Pragma'=>"no-cache",
'Expires'=>"0",
'Content-type'=>"application/vnd.ms-excel",
'Content-Disposition'=>"attachment; filename=\"#{filename}\""
}
cgi = CGI.new("html4")
cgi.out(header) {body}
end
wb = ExlBook.new
ss = ExlSheet.new
ss.name = "font情報の付加"
ary =
row.map! {|cell|
case cell
when 'awk'
cell
when 'perl'
cell
rng.each {|cell|
data, color =
when 'ruby'
cell
cell.Data =
else
cell
cell.Font.Color =
end
}
body = wb.xml_string # xmlssを文字列で得る
filename = "test03.xml"
send_excel(filename, body)
−−−− ここまで
上のcgiスクリプトを
[[test03.cgi|http://cup.sakura.ne.jp/test03.cgi]]
このcgiにブラウザでアクセスすると、開くか保存するかキャンセルするかを選ぶダイアログボックスが出ます(その前にセキュリティの警告が出るかもしれません)。そこで「開く」を選ぶと、Excelが起動します。
cgiスクリプト内のfilenameの値 test03.xml を test03.xls にすれば、Excel2002でも開けるようになりますが、そうすると逆に、Excel2007などでは無用な警告メッセージが出るようになります。「拡張子と中身が違っていますが、開きますか?」といったメッセージです。
Excelのバージョン、あるいは、ブラウザの種類やバージョンにも左右されるかもしれない中途半端なcgiではありますが、1つの簡単な参考例として掲げてみました。
{{br}}
− 以上 −