FrontPage  Index  Search  Changes  Login

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'
          cell
rng = eData(cell, eFont("White"), eInterior("Black")) ss.range(0,0, 1,1) # 白黒反転
        when 'perl'
          cell
A1:B2の2×2の領域をRangeとして設定
    rng.each {|cell|
      data, color
= eData(cell, eFont("Blue"))
        when 'ruby'
          cell
ary.shift
      cell.Data
= eData(cell, eFont("Red"))
        else
          cell
data
      cell.Font.Color
= cell
        end
color  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|
        cell
ss = eData(cell, eBorder())
      }
ExlSheet.new(ary)
    }
    ss
ss.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'
          params
data, horizontal, vertical = %w(Left Top)ary.shift
        when 'perl'
          params
cell.Data = %w(Center Center)data
        when 'python'
          params
cell.Alignment.Horizontal = %w(Left Bottom)horizontal
        when 'ruby'
          params
cell.Alignment.Vertical = %w(Right Bottom)vertical
        end
        cell
rng.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|
        cell
ss = 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>',
            

      
'キーワードは<Font html: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|
      row
ss.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>&quot;#{list}&quot;</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'
          cell
rng = eData(cell, eFont("White"), eInterior("Black")) ss.range(0,0, 1,1) # 白黒反転
        when 'perl'
          cell
A1:B2の2×2の領域をRangeとして設定
    rng.each {|cell|
      data, color
= eData(cell, eFont("Blue"))
        when 'ruby'
          cell
ary.shift
      cell.Data
= eData(cell, eFont("Red"))
        else
          cell
data
      cell.Font.Color
= cell
        end
color  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}}

− 以上 −