以下に掲げるrubyスクリプトのサンプルは、Excel操縦用ライブラリ exlap.rb 最新版: exlap_latest.zipに同梱のものを利用するとの前提で書かれています。
目次
#! ruby -Ks # 性別の平均身長と平均体重のピボットテーブル集計表を作成 require "exlap" data_list = [ # 10人分の氏名、性別、身長、体重 %w(氏名 性別 身長 体重), %w(安部 男 158.9 50.6), %w(伊藤 女 151.0 50.7), %w(上村 男 178.4 73.9), %w(榎本 女 164.0 70.6), %w(小田 男 161.8 64.7), %w(佐藤 女 167.9 62.1), %w(篠原 男 174.6 71.5), %w(杉山 女 173.9 51.5), %w(千田 男 179.6 65.2), %w(相馬 女 151.6 51.3)] filename = "test01.xls" Exlap.new(filename) {|wb| # 元になるデータをワークシートに記録 ss = wb.fes # 最初の空のシートを選択 ss.Name = "元データのシート" data_list.each_with_index {|row, i| rn = i + 1 ss.rr(rn,1, rn,row.size).Value = row } y1,x1, y2,x2 = ss.range_address # データ記録領域の番地を取得 # 上記データの領域を「名前付き範囲」に指定 range_name = "性別と身長と体重" # 範囲に付ける名前 range_area = sprintf("R%dC%d:R%dC%d", y1, x1, y2, x2) wb.obj.Names.Add({ 'Name'=>range_name, 'RefersTo'=>"=#{ss.Name}!#{range_area}"}) # 次シートにピボットテーブルを設定 ss2 = wb.fes ss2.Name = "ピボットテーブルのシート" ss2.Activate # ピボットテーブルを設けるシートに焦点を当てる pivot_cache = wb.obj.PivotCaches.Add({ 'SourceType'=>XlDatabase, 'SourceData'=>range_name}) ptname = "ピボット01" # ピボットテーブルの名前 pivot_cache.CreatePivotTable({ 'TableDestination'=>ss2.Range("A1"), # ピボットテーブルの始点 'TableName'=>ptname}) pt = ss2.PivotTables(ptname) # ピボットテーブルオブジェクトをptに pt.SmallGrid = false # 項目分類の注目欄として性別を指定。横方向(列)に広げる形に設定 ptf = pt.PivotFields("性別") ptf.Orientation = XlColumnField # 「列」方向に並べるフィールドとする # 集計用の注目欄として「身長」を指定。平均を採ることも指定。 ptf = pt.PivotFields("身長") ptf.Orientation = XlDataField # 集計して新たに設ける欄であるとの指定 ptf.Function = XlAverage # 集計方法を「平均を求める」に設定 # 「体重」に関する設定(「身長」と同じ) ptf = pt.PivotFields("体重") ptf.Orientation = XlDataField ptf.Function = XlAverage wb.save }download pt01.rb
#! ruby -Ks # AddFields, AddDataField を用いてピボットフィールドを設定する require "exlap" data_list = [ # 10人分の氏名、性別、身長、体重 %w(氏名 性別 身長 体重), %w(安部 男 158.9 50.6), %w(伊藤 女 151.0 50.7), %w(上村 男 178.4 73.9), %w(榎本 女 164.0 70.6), %w(小田 男 161.8 64.7), %w(佐藤 女 167.9 62.1), %w(篠原 男 174.6 71.5), %w(杉山 女 173.9 51.5), %w(千田 男 179.6 65.2), %w(相馬 女 151.6 51.3)] filename = "test01_2.xls" Exlap.new(filename) {|wb| # 元になるデータをワークシートに記録 ss = wb.fes # 最初の空のシートを選択 ss.Name = "元データのシート" data_list.each_with_index {|row, i| rn = i + 1 ss.rr(rn,1, rn,row.size).Value = row } y1,x1, y2,x2 = ss.range_address # データ記録領域の番地を取得 # 上記データの領域を「名前付き範囲」に指定 range_name = "性別と身長と体重" # 範囲に付ける名前 range_area = sprintf("R%dC%d:R%dC%d", y1, x1, y2, x2) wb.obj.Names.Add({ 'Name'=>range_name, 'RefersTo'=>"=#{ss.Name}!#{range_area}"}) # 次シートにピボットテーブルを設定 ss2 = wb.fes ss2.Name = "ピボットテーブルのシート" ss2.Activate # ピボットテーブルを設けるシートに焦点を当てる pivot_cache = wb.obj.PivotCaches.Add({ 'SourceType'=>XlDatabase, 'SourceData'=>range_name}) ptname = "ピボット01" # ピボットテーブルの名前 pt = pivot_cache.CreatePivotTable({ 'TableDestination'=>ss2.Range("A1"), # ピボットテーブルの始点 'TableName'=>ptname}) pt.SmallGrid = false pt.AddFields({'ColumnFields'=>"性別"}) pt.AddDataField({'Field'=>pt.PivotFields("身長"), 'Function'=>XlAverage}) pt.AddDataField({'Field'=>pt.PivotFields("体重"), 'Function'=>XlAverage}) wb.save }download pt01_2.rb
#! ruby -Ks # ピボットフィールドの見出し、数値表示形式、項目順序に関する操作 require "exlap" data_list = [ # 10人分の氏名、性別、身長、体重 %w(氏名 性別 身長 体重), %w(安部 男 158.9 50.6), %w(伊藤 女 151.0 50.7), %w(上村 男 178.4 73.9), %w(榎本 女 164.0 70.6), %w(小田 男 161.8 64.7), %w(佐藤 女 167.9 62.1), %w(篠原 男 174.6 71.5), %w(杉山 女 173.9 51.5), %w(千田 男 179.6 65.2), %w(相馬 女 151.6 51.3)] filename = "test01_3.xls" Exlap.new(filename) {|wb| # 元になるデータをワークシートに記録 ss = wb.fes # 最初の空のシートを選択 ss.Name = "元データのシート" data_list.each_with_index {|row, i| rn = i + 1 ss.rr(rn,1, rn,row.size).Value = row } y1,x1, y2,x2 = ss.range_address # データ記録領域の番地を取得 # 上記データの領域を「名前付き範囲」に指定 range_name = "性別と身長と体重" # 範囲に付ける名前 range_area = sprintf("R%dC%d:R%dC%d", y1, x1, y2, x2) wb.obj.Names.Add({ 'Name'=>range_name, 'RefersTo'=>"=#{ss.Name}!#{range_area}"}) # 次シートにピボットテーブルを設定 ss2 = wb.fes ss2.Name = "ピボットテーブルのシート" ss2.Activate # ピボットテーブルを設けるシートに焦点を当てる pivot_cache = wb.obj.PivotCaches.Add({ 'SourceType'=>XlDatabase, 'SourceData'=>range_name}) ptname = "ピボット01" # ピボットテーブルの名前 pivot_cache.CreatePivotTable({ 'TableDestination'=>ss2.Range("A1"), # ピボットテーブルの始点 'TableName'=>ptname}) pt = ss2.PivotTables(ptname) # ピボットテーブルオブジェクトをptに pt.SmallGrid = false # 項目分類の注目欄として性別を指定。横方向(列)に広げる形に設定 ptf = pt.PivotFields("性別") ptf.Orientation = XlColumnField # 「列」方向に並べるフィールドとする ptf.PivotItems("男").Position = 1 ptf.PivotItems("女").Position = 2 # 集計用の注目欄として「身長」を指定。平均を採ることも指定。 ptf = pt.PivotFields("身長") ptf.Orientation = XlDataField # 集計して新たに設ける欄であるとの指定 ptf.Function = XlAverage # 集計方法を「平均を求める」に設定 ptf.Caption = "身長の平均" ptf.NumberFormat = "0.0" # 「体重」に関する設定(「身長」と同じ) ptf = pt.PivotFields("体重") ptf.Orientation = XlDataField ptf.Function = XlAverage ptf.Caption = "体重の平均" ptf.NumberFormat = "0.0" wb.save }download pt01_3.rb
#! ruby -Ks # ピボットテーブルの更新 require "exlap" data_list = [ # 10人分の氏名、性別、身長、体重 %w(氏名 性別 身長 体重), %w(安部 男 158.9 50.6), %w(伊藤 女 151.0 50.7), %w(上村 男 178.4 73.9), %w(榎本 女 164.0 70.6), %w(小田 男 161.8 64.7), %w(佐藤 女 167.9 62.1), %w(篠原 男 174.6 71.5), %w(杉山 女 173.9 51.5), %w(千田 男 179.6 65.2), %w(相馬 女 151.6 51.3)] filename = "test01_4.xls" Exlap.new(filename) {|wb| # 元になるデータをワークシートに記録 ss = wb.fes # 最初の空のシートを選択 ss.Name = "元データのシート" data_list.each_with_index {|row, i| rn = i + 1 ss.rr(rn,1, rn,row.size).Value = row } y1,x1, y2,x2 = ss.range_address # データ記録領域の番地を取得 # 上記データの領域を「名前付き範囲」に指定 range_name = "性別と身長と体重" # 範囲に付ける名前 range_area = sprintf("R%dC%d:R%dC%d", y1, x1, y2, x2) wb.obj.Names.Add({ 'Name'=>range_name, 'RefersTo'=>"=#{ss.Name}!#{range_area}"}) # 次シートにピボットテーブルを設定 ss2 = wb.fes ss2.Name = "ピボットテーブルのシート" ss2.Activate # ピボットテーブルを設けるシートに焦点を当てる pivot_cache = wb.obj.PivotCaches.Add({ 'SourceType'=>XlDatabase, 'SourceData'=>range_name}) ptname = "ピボット01" # ピボットテーブルの名前 pivot_cache.CreatePivotTable({ 'TableDestination'=>ss2.Range("A1"), # ピボットテーブルの始点 'TableName'=>ptname}) pt = ss2.PivotTables(ptname) # ピボットテーブルオブジェクトをptに pt.SmallGrid = false # 項目分類の注目欄として性別を指定。横方向(列)に広げる形に設定 ptf = pt.PivotFields("性別") ptf.Orientation = XlColumnField # 「列」方向に並べるフィールドとする # 集計用の注目欄として「身長」を指定。平均を採ることも指定。 ptf = pt.PivotFields("身長") ptf.Orientation = XlDataField # 集計して新たに設ける欄であるとの指定 ptf.Function = XlAverage # 集計方法を「平均を求める」に設定 # 「体重」に関する設定(「身長」と同じ) ptf = pt.PivotFields("体重") ptf.Orientation = XlDataField ptf.Function = XlAverage # 2人分を元データに追加 ary = [ %w(田中 男 167.3 66.4), %w(須藤 女 160.5 48.9)] ss = wb.ss("元データのシート") y,x = ss.range_last ary.each {|row| y += 1 ss.rr(y,1, y,row.size).Value = row } ss.Range(range_name).CurrentRegion.Name = range_name # 名前付き範囲の再設定 # ピボットテーブルの更新 ss2 = wb.ss("ピボットテーブルのシート") ss2.Activate pt = ss2.PivotTables(ptname) pt.RefreshTable wb.save }download pt01_4.rb
#! ruby -Ks # 「性別」の1つの欄だけに注目して表を生成:人数表示 require "exlap" data_list = [ # 10人分の氏名、性別、身長、体重 %w(氏名 性別 身長 体重), %w(安部 男 158.9 50.6), %w(伊藤 女 151.0 50.7), %w(上村 男 178.4 73.9), %w(榎本 女 164.0 70.6), %w(小田 男 161.8 64.7), %w(佐藤 女 167.9 62.1), %w(篠原 男 174.6 71.5), %w(杉山 女 173.9 51.5), %w(千田 男 179.6 65.2), %w(相馬 女 151.6 51.3)] filename = "test02.xls" Exlap.new(filename) {|wb| # 元になるデータをワークシートに記録 ss = wb.fes # 最初の空のシートを選択 ss.Name = "元データのシート" data_list.each_with_index {|row, i| rn = i + 1 ss.rr(rn,1, rn,row.size).Value = row } y1,x1, y2,x2 = ss.range_address # データ記録領域の番地を取得 # 上記データの領域を「名前付き範囲」に指定 range_name = "性別と身長と体重" # 範囲に付ける名前 range_area = sprintf("R%dC%d:R%dC%d", y1, x1, y2, x2) wb.obj.Names.Add({ 'Name'=>range_name, 'RefersTo'=>"=#{ss.Name}!#{range_area}"}) # 次シートにピボットテーブルを設定 ss2 = wb.fes ss2.Name = "ピボットテーブルのシート" ss2.Activate # ピボットテーブルを設けるシートに焦点を当てる pivot_cache = wb.obj.PivotCaches.Add({ 'SourceType'=>XlDatabase, 'SourceData'=>range_name}) ptname = "ピボット01" # ピボットテーブルの名前 pivot_cache.CreatePivotTable({ 'TableDestination'=>ss2.Range("A1"), # ピボットテーブルの始点 'TableName'=>ptname}) pt = ss2.PivotTables(ptname) # ピボットテーブルオブジェクトをptに pt.SmallGrid = false # 項目分類の注目欄として性別を指定。横方向(列)に広げる形に設定 ptf = pt.PivotFields("性別") ptf.Orientation = XlColumnField # 「列」方向に並べるフィールドとする # 集計用の注目欄としても「性別」を指定。個数(人数)を取る ptf = pt.PivotFields("性別") ptf.Orientation = XlDataField ptf.Function = XlCount ptf.Caption = "性別の人数" # 「個数/性別」の見出しを変更 wb.save }download pt02.rb
#! ruby -Ks # 「性別」の1つの欄だけに注目して表を生成:構成比表示 require "exlap" data_list = [ # 10人分の氏名、性別、身長、体重 %w(氏名 性別 身長 体重), %w(安部 男 158.9 50.6), %w(伊藤 女 151.0 50.7), %w(上村 男 178.4 73.9), %w(榎本 女 164.0 70.6), %w(小田 男 161.8 64.7), %w(佐藤 女 167.9 62.1), %w(篠原 男 174.6 71.5), %w(杉山 女 173.9 51.5), %w(千田 男 179.6 65.2), %w(相馬 女 151.6 51.3)] filename = "test02_2.xls" Exlap.new(filename) {|wb| # 元になるデータをワークシートに記録 ss = wb.fes # 最初の空のシートを選択 ss.Name = "元データのシート" data_list.each_with_index {|row, i| rn = i + 1 ss.rr(rn,1, rn,row.size).Value = row } y1,x1, y2,x2 = ss.range_address # データ記録領域の番地を取得 # 上記データの領域を「名前付き範囲」に指定 range_name = "性別と身長と体重" # 範囲に付ける名前 range_area = sprintf("R%dC%d:R%dC%d", y1, x1, y2, x2) wb.obj.Names.Add({ 'Name'=>range_name, 'RefersTo'=>"=#{ss.Name}!#{range_area}"}) # 次シートにピボットテーブルを設定 ss2 = wb.fes ss2.Name = "ピボットテーブルのシート" ss2.Activate # ピボットテーブルを設けるシートに焦点を当てる pivot_cache = wb.obj.PivotCaches.Add({ 'SourceType'=>XlDatabase, 'SourceData'=>range_name}) ptname = "ピボット01" # ピボットテーブルの名前 pivot_cache.CreatePivotTable({ 'TableDestination'=>ss2.Range("A1"), # ピボットテーブルの始点 'TableName'=>ptname}) pt = ss2.PivotTables(ptname) # ピボットテーブルオブジェクトをptに pt.SmallGrid = false # 項目分類の注目欄として性別を指定。横方向(列)に広げる形に設定 ptf = pt.PivotFields("性別") ptf.Orientation = XlColumnField # 「列」方向に並べるフィールドとする # 集計用の注目欄としても「性別」を指定。構成比(%)を取る ptf = pt.PivotFields("性別") ptf.Orientation = XlDataField ptf.Function = XlCount ptf.Caption = "性別の構成比(%)" ptf.Calculation = XlPercentOfRow # 「行」における構成比 wb.save }download pt02_2.rb
#! ruby -Ks # 同一ワークシートに2つのピボットテーブルを作成 require "exlap" data_list = [ # 10人分の氏名、性別、身長、体重 %w(氏名 性別 身長 体重), %w(安部 男 158.9 50.6), %w(伊藤 女 151.0 50.7), %w(上村 男 178.4 73.9), %w(榎本 女 164.0 70.6), %w(小田 男 161.8 64.7), %w(佐藤 女 167.9 62.1), %w(篠原 男 174.6 71.5), %w(杉山 女 173.9 51.5), %w(千田 男 179.6 65.2), %w(相馬 女 151.6 51.3)] filename = "test03.xls" Exlap.new(filename) {|wb| # 元になるデータをワークシートに記録 ss = wb.fes # 最初の空のシートを選択 ss.Name = "元データのシート" data_list.each_with_index {|row, i| rn = i + 1 ss.rr(rn,1, rn,row.size).Value = row } y1,x1, y2,x2 = ss.range_address # データ記録領域の番地を取得 # 上記データの領域を「名前付き範囲」に指定 range_name = "性別と身長と体重" # 範囲に付ける名前 range_area = sprintf("R%dC%d:R%dC%d", y1, x1, y2, x2) wb.obj.Names.Add({ 'Name'=>range_name, 'RefersTo'=>"=#{ss.Name}!#{range_area}"}) # 次シートにピボットテーブルを設定 ss2 = wb.fes ss2.Name = "ピボットテーブルのシート" ss2.Activate # ピボットテーブルを設けるシートに焦点を当てる pivot_cache = wb.obj.PivotCaches.Add({ 'SourceType'=>XlDatabase, 'SourceData'=>range_name}) # 第1のピボットテーブルを作成 ptname = "ピボット01" # ピボットテーブルの名前 pivot_cache.CreatePivotTable({ 'TableDestination'=>ss2.Range("A1"), # ピボットテーブルの始点 'TableName'=>ptname}) pt = ss2.PivotTables(ptname) # ピボットテーブルオブジェクトをptに pt.SmallGrid = false ptf = pt.PivotFields("性別") ptf.Orientation = XlColumnField # 「列」方向に並べるフィールドとする ptf = pt.PivotFields("身長") ptf.Orientation = XlDataField # 集計して新たに設ける欄であるとの指定 ptf.Function = XlAverage # 集計方法を「平均を求める」に設定 ptf = pt.PivotFields("体重") ptf.Orientation = XlDataField ptf.Function = XlAverage # 第2ピボットテーブル作成の準備 rng = pt.TableRange2 # 第1ピボットテーブルのRangeをrngに代入 y,x = ss2.range_last(rng) # 第1ピボットテーブルの最終番地を得る start_cell = ss2.cell(y+3,1) # 第2ピボットテーブルの始点を2行空け後に # 第2ピボットテーブルの作成 ptname = "ピボット02" # ピボットテーブルの名前 pivot_cache.CreatePivotTable({ 'TableDestination'=>start_cell, 'TableName'=>ptname}) pt = ss2.PivotTables(ptname) pt.SmallGrid = false ptf = pt.PivotFields("性別") ptf.Orientation = XlColumnField # 「列」方向に並べるフィールドとする ptf = pt.PivotFields("性別") ptf.Orientation = XlDataField ptf.Function = XlCount ptf.Caption = "性別の人数" # 「個数/性別」の見出しを変更 wb.save }download pt03.rb
#! ruby -Ks # ワークブック内の総てのピボットテーブルの名前を出力 require "exlap" filename = "test03.xls" Exlap.new(filename) {|wb| wb.each {|ss| next if ss.PivotTables.Count < 1 # ピボットテーブルがないのでskip puts "*ワークシート名:" + ss.Name ss.PivotTables.each {|pt| puts "\t" + pt.Name } } }download pt03_2.rb
#! ruby -Ks # ワークブック内の総てのピボットテーブルを削除 require "exlap" filename = "test03.xls" Exlap.new(filename) {|wb| wb.each {|ss| next if ss.PivotTables.Count < 1 # ピボットテーブルがないのでskip ss.Activate ss.PivotTables.each {|pt| pt.TableRange2.Clear } } wb.save }download pt03_3.rb
#! ruby -Ks # odbc接続で別のExcelワークブックのデータを材料にする require "exlap" source_name = "source.xls" cnn = "ODBC;DSN=Excel Files;DBQ=#{Exl::getAbsolutePath(source_name)}" tblname = "性別の身長と体重" sql = "SELECT * FROM [#{tblname}$];" filename = "test04.xls" Exlap.new(filename) {|wb| # シートにピボットテーブルを設定 ss = wb.fes ss.Name = "ピボットテーブルのシート" ss.Activate # ピボットテーブルを設けるシートに焦点を当てる pivot_cache = wb.obj.PivotCaches.Add({ 'SourceType'=>XlExternal}) pivot_cache.Connection = cnn pivot_cache.CommandText = sql ptname = "ピボット01" # ピボットテーブルの名前 pivot_cache.CreatePivotTable({ 'TableDestination'=>ss.Range("A1"), # ピボットテーブルの始点 'TableName'=>ptname}) pt = ss.PivotTables(ptname) # ピボットテーブルオブジェクトをptに pt.SmallGrid = false # 項目分類の注目欄として性別を指定。横方向(列)に広げる形に設定 ptf = pt.PivotFields("性別") ptf.Orientation = XlColumnField # 「列」方向に並べるフィールドとする # 集計用の注目欄としても「性別」を指定。個数(人数)を取る ptf = pt.PivotFields("性別") ptf.Orientation = XlDataField ptf.Function = XlCount ptf.Caption = "性別の人数" # 「個数/性別」の見出しを変更 wb.save }download pt04.rb
#! ruby -Ks # odbc接続でAccessデータベースのデータを材料にする require "exlap" source_name = "source.mdb" cnn = "ODBC;DSN=MS Access Database;DBQ=#{Exl::getAbsolutePath(source_name)}" tblname = "性別の身長と体重" sql = "SELECT * FROM #{tblname};" filename = "test04_2.xls" Exlap.new(filename) {|wb| # シートにピボットテーブルを設定 ss = wb.fes ss.Name = "ピボットテーブルのシート" ss.Activate # ピボットテーブルを設けるシートに焦点を当てる pivot_cache = wb.obj.PivotCaches.Add({ 'SourceType'=>XlExternal}) pivot_cache.Connection = cnn pivot_cache.CommandText = sql ptname = "ピボット01" # ピボットテーブルの名前 pivot_cache.CreatePivotTable({ 'TableDestination'=>ss.Range("A1"), # ピボットテーブルの始点 'TableName'=>ptname}) pt = ss.PivotTables(ptname) # ピボットテーブルオブジェクトをptに pt.SmallGrid = false # 項目分類の注目欄として性別を指定。横方向(列)に広げる形に設定 ptf = pt.PivotFields("性別") ptf.Orientation = XlColumnField # 「列」方向に並べるフィールドとする # 集計用の注目欄としても「性別」を指定。個数(人数)を取る ptf = pt.PivotFields("性別") ptf.Orientation = XlDataField ptf.Function = XlCount ptf.Caption = "性別の人数" # 「個数/性別」の見出しを変更 wb.save }download pt04_2.rb
#! ruby -Ks # ado接続で別のExcelワークブックのデータを材料にする require "exlap" source_name = "source.xls" tblname = "性別の身長と体重" sql = "SELECT * FROM [#{tblname}$];" # ado接続の準備 cnn_xls = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=#{Exl::getAbsolutePath(source_name)};" + "Extended Properties=\"Excel 8.0;HDR=Yes;\"" cnn_xlsx = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=#{Exl::getAbsolutePath(source_name)};" + "Extended Properties=\"Excel 12.0;HDR=Yes;\"" cnn = nil case File.extname(source_name).downcase when '.xls' cnn = cnn_xls when '.xlsx' cnn = cnn_xlsx end unless cnn exit end cn = WIN32OLE.new("ADODB.Connection") rs = WIN32OLE.new("ADODB.Recordset") rs.CursorLocation = 3 # adUseClient クライアント側カーソルを使用 filename = "test04_3.xls" Exlap.new(filename) {|wb| # シートにピボットテーブルを設定 ss = wb.fes ss.Name = "ピボットテーブルのシート" ss.Activate # ピボットテーブルを設けるシートに焦点を当てる cn.Open cnn; rs.Open sql,cn # ado接続 pivot_cache = wb.obj.PivotCaches.Add({ 'SourceType'=>XlExternal}) pivot_cache.Recordset = rs rs.Close; cn.Close # adoを閉じる ptname = "ピボット01" # ピボットテーブルの名前 pivot_cache.CreatePivotTable({ 'TableDestination'=>ss.Range("A1"), # ピボットテーブルの始点 'TableName'=>ptname}) pt = ss.PivotTables(ptname) # ピボットテーブルオブジェクトをptに pt.SmallGrid = false # 項目分類の注目欄として性別を指定。横方向(列)に広げる形に設定 ptf = pt.PivotFields("性別") ptf.Orientation = XlColumnField # 「列」方向に並べるフィールドとする # 集計用の注目欄としても「性別」を指定。個数(人数)を取る ptf = pt.PivotFields("性別") ptf.Orientation = XlDataField ptf.Function = XlCount ptf.Caption = "性別の人数" # 「個数/性別」の見出しを変更 wb.save }download pt04_3.rb
#! ruby -Ks # ado接続でAccessデータベースのデータを材料にピボットテーブルを作成 require "exlap" source_name = "source.mdb" tblname = "性別の身長と体重" sql = "SELECT * FROM #{tblname};" # ado接続の準備 cnn = nil case File.extname(source_name).downcase when '.mdb' cnn = "Provider=Microsoft.Jet.OLEDB.4.0;" when '.accdb' cnn = "Provider=Microsoft.ACE.OLEDB.12.0;" end unless cnn exit end cnn = cnn + "Data Source=#{Exl::getAbsolutePath(source_name)};" cn = WIN32OLE.new("ADODB.Connection") rs = WIN32OLE.new("ADODB.Recordset") rs.CursorLocation = 3 # adUseClient クライアント側カーソルを使用 filename = "test04_4.xls" Exlap.new(filename) {|wb| # シートにピボットテーブルを設定 ss = wb.fes ss.Name = "ピボットテーブルのシート" ss.Activate # ピボットテーブルを設けるシートに焦点を当てる cn.Open cnn; rs.Open sql,cn # ado接続 pivot_cache = wb.obj.PivotCaches.Add({ 'SourceType'=>XlExternal}) pivot_cache.Recordset = rs rs.Close; cn.Close # adoを閉じる ptname = "ピボット01" # ピボットテーブルの名前 pivot_cache.CreatePivotTable({ 'TableDestination'=>ss.Range("A1"), # ピボットテーブルの始点 'TableName'=>ptname}) pt = ss.PivotTables(ptname) # ピボットテーブルオブジェクトをptに pt.SmallGrid = false # 項目分類の注目欄として性別を指定。横方向(列)に広げる形に設定 ptf = pt.PivotFields("性別") ptf.Orientation = XlColumnField # 「列」方向に並べるフィールドとする # 集計用の注目欄としても「性別」を指定。個数(人数)を取る ptf = pt.PivotFields("性別") ptf.Orientation = XlDataField ptf.Function = XlCount ptf.Caption = "性別の人数" # 「個数/性別」の見出しを変更 wb.save }download pt04_4.rb
#! ruby -Ks # ado接続の場合のピボットキャッシュの更新(source.xls, test04_3.xls) require "exlap" source_name = "source.xls" tblname = "性別の身長と体重" sql = "SELECT * FROM [#{tblname}$];" cnn = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=#{Exl::getAbsolutePath(source_name)};" + "Extended Properties=\"Excel 8.0;HDR=Yes;\"" cn = WIN32OLE.new("ADODB.Connection") rs = WIN32OLE.new("ADODB.Recordset") rs.CursorLocation = 3 # adUseClient クライアント側カーソルを使用 filename = "test04_3.xls" sheet_name = "ピボットテーブルのシート" # ワークシートの名前 pivot_name = "ピボット01" # ピボットテーブルの名前 Exlap.new(filename) {|wb| ss = wb.ss(sheet_name) ss.Activate # ピボットテーブルのあるシートに焦点を当てる pt = ss.PivotTables(pivot_name) # ピボットテーブルオブジェクトをptに cn.Open cnn; rs.Open sql,cn # ado接続 pivot_cache = pt.PivotCache pivot_cache.Recordset = rs pivot_cache.Refresh rs.Close; cn.Close # adoを閉じる wb.save }download pt_ado01.rb
#! ruby -Ks # ado接続の場合のピボットキャッシュの更新(source.mdb, test04_4.xls) require "exlap" source_name = "source.mdb" tblname = "性別の身長と体重" sql = "SELECT * FROM #{tblname};" cnn = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=#{Exl::getAbsolutePath(source_name)};" cn = WIN32OLE.new("ADODB.Connection") rs = WIN32OLE.new("ADODB.Recordset") rs.CursorLocation = 3 # adUseClient クライアント側カーソルを使用 filename = "test04_4.xls" sheet_name = "ピボットテーブルのシート" # ワークシートの名前 pivot_name = "ピボット01" # ピボットテーブルの名前 Exlap.new(filename) {|wb| ss = wb.ss(sheet_name) ss.Activate # ピボットテーブルのあるシートに焦点を当てる pt = ss.PivotTables(pivot_name) # ピボットテーブルオブジェクトをptに cn.Open cnn; rs.Open sql,cn # ado接続 pivot_cache = pt.PivotCache pivot_cache.Recordset = rs pivot_cache.Refresh rs.Close; cn.Close # adoを閉じる wb.save }download pt_ado02.rb
#! ruby -Ks # 身長によるグループ化(150-160, 160-170, 170-180) require "exlap" data_list = [ # 10人分の氏名、性別、身長、体重 %w(氏名 性別 身長 体重), %w(安部 男 158.9 50.6), %w(伊藤 女 151.0 50.7), %w(上村 男 178.4 73.9), %w(榎本 女 164.0 70.6), %w(小田 男 161.8 64.7), %w(佐藤 女 167.9 62.1), %w(篠原 男 174.6 71.5), %w(杉山 女 173.9 51.5), %w(千田 男 179.6 65.2), %w(相馬 女 151.6 51.3)] filename = "test05.xls" Exlap.new(filename) {|wb| # 元になるデータをワークシートに記録 ss = wb.fes # 最初の空のシートを選択 ss.Name = "元データのシート" data_list.each_with_index {|row, i| rn = i + 1 ss.rr(rn,1, rn,row.size).Value = row } y1,x1, y2,x2 = ss.range_address # データ記録領域の番地を取得 # 上記データの領域を「名前付き範囲」に指定 range_name = "性別と身長と体重" # 範囲に付ける名前 range_area = sprintf("R%dC%d:R%dC%d", y1, x1, y2, x2) wb.obj.Names.Add({ 'Name'=>range_name, 'RefersTo'=>"=#{ss.Name}!#{range_area}"}) # 次シートにピボットテーブルを設定 ss2 = wb.fes ss2.Name = "ピボットテーブルのシート" ss2.Activate # ピボットテーブルを設けるシートに焦点を当てる pivot_cache = wb.obj.PivotCaches.Add({ 'SourceType'=>XlDatabase, 'SourceData'=>range_name}) ptname = "ピボット01" # ピボットテーブルの名前 pivot_cache.CreatePivotTable({ 'TableDestination'=>ss2.Range("A1"), # ピボットテーブルの始点 'TableName'=>ptname}) pt = ss2.PivotTables(ptname) # ピボットテーブルオブジェクトをptに pt.SmallGrid = false ptf1 = pt.PivotFields("身長") ptf1.Orientation = XlColumnField ptf2 = pt.PivotFields("身長") ptf2.Orientation = XlDataField ptf2.Function = XlCount ptf1.LabelRange.Group({'Start'=>150.0, 'By'=>10.0}) wb.save }download pt05.rb
#! ruby -Ks # 「氏名」によるグループ化:個々の氏名を残さずグループだけ表示 require "exlap" data_list = [ # 10人分の氏名、性別、身長、体重 %w(氏名 性別 身長 体重), %w(安部 男 158.9 50.6), %w(伊藤 女 151.0 50.7), %w(上村 男 178.4 73.9), %w(榎本 女 164.0 70.6), %w(小田 男 161.8 64.7), %w(佐藤 女 167.9 62.1), %w(篠原 男 174.6 71.5), %w(杉山 女 173.9 51.5), %w(千田 男 179.6 65.2), %w(相馬 女 151.6 51.3)] filename = "test05_2.xls" Exlap.new(filename) {|wb| # 元になるデータをワークシートに記録 ss = wb.fes # 最初の空のシートを選択 ss.Name = "元データのシート" data_list.each_with_index {|row, i| rn = i + 1 ss.rr(rn,1, rn,row.size).Value = row } y1,x1, y2,x2 = ss.range_address # データ記録領域の番地を取得 # 上記データの領域を「名前付き範囲」に指定 range_name = "性別と身長と体重" # 範囲に付ける名前 range_area = sprintf("R%dC%d:R%dC%d", y1, x1, y2, x2) wb.obj.Names.Add({ 'Name'=>range_name, 'RefersTo'=>"=#{ss.Name}!#{range_area}"}) # 次シートにピボットテーブルを設定 ss2 = wb.fes ss2.Name = "ピボットテーブルのシート" ss2.Activate # ピボットテーブルを設けるシートに焦点を当てる pivot_cache = wb.obj.PivotCaches.Add({ 'SourceType'=>XlDatabase, 'SourceData'=>range_name}) ptname = "ピボット01" # ピボットテーブルの名前 pivot_cache.CreatePivotTable({ 'TableDestination'=>ss2.Range("A1"), # ピボットテーブルの始点 'TableName'=>ptname}) pt = ss2.PivotTables(ptname) # ピボットテーブルオブジェクトをptに pt.SmallGrid = false # まず未加工の集計表を設計 ptf1 = pt.PivotFields("氏名") ptf1.Orientation = XlColumnField ptf2 = pt.PivotFields("身長") ptf2.Orientation = XlDataField ptf2.Function = XlAverage # 以下がグループ化の処理 xl = pt.Application xl.Union(ptf1.PivotItems("安部").LabelRange, ptf1.PivotItems("伊藤").LabelRange, ptf1.PivotItems("上村").LabelRange, ptf1.PivotItems("榎本").LabelRange, ptf1.PivotItems("小田").LabelRange).Group xl.Union(ptf1.PivotItems("佐藤").LabelRange, ptf1.PivotItems("篠原").LabelRange, ptf1.PivotItems("杉山").LabelRange, ptf1.PivotItems("千田").LabelRange, ptf1.PivotItems("相馬").LabelRange).Group ptf1p = ptf1.ParentField # 親フィールド(大きなカテゴリー)のオブジェクト ptf1p.PivotItems(1).Name = "ア行の人々" ptf1p.PivotItems(2).Name = "サ行の人々" ptf1.Orientation = XlHidden # 個々の氏名を非表示に wb.save }download pt05_2.rb
#! ruby -Ks # 「氏名」によるグループ化:個々の氏名を残す require "exlap" data_list = [ # 10人分の氏名、性別、身長、体重 %w(氏名 性別 身長 体重), %w(安部 男 158.9 50.6), %w(伊藤 女 151.0 50.7), %w(上村 男 178.4 73.9), %w(榎本 女 164.0 70.6), %w(小田 男 161.8 64.7), %w(佐藤 女 167.9 62.1), %w(篠原 男 174.6 71.5), %w(杉山 女 173.9 51.5), %w(千田 男 179.6 65.2), %w(相馬 女 151.6 51.3)] filename = "test05_3.xls" Exlap.new(filename) {|wb| # 元になるデータをワークシートに記録 ss = wb.fes # 最初の空のシートを選択 ss.Name = "元データのシート" data_list.each_with_index {|row, i| rn = i + 1 ss.rr(rn,1, rn,row.size).Value = row } y1,x1, y2,x2 = ss.range_address # データ記録領域の番地を取得 # 上記データの領域を「名前付き範囲」に指定 range_name = "性別と身長と体重" # 範囲に付ける名前 range_area = sprintf("R%dC%d:R%dC%d", y1, x1, y2, x2) wb.obj.Names.Add({ 'Name'=>range_name, 'RefersTo'=>"=#{ss.Name}!#{range_area}"}) # 次シートにピボットテーブルを設定 ss2 = wb.fes ss2.Name = "ピボットテーブルのシート" ss2.Activate # ピボットテーブルを設けるシートに焦点を当てる pivot_cache = wb.obj.PivotCaches.Add({ 'SourceType'=>XlDatabase, 'SourceData'=>range_name}) ptname = "ピボット01" # ピボットテーブルの名前 pivot_cache.CreatePivotTable({ 'TableDestination'=>ss2.Range("A1"), # ピボットテーブルの始点 'TableName'=>ptname}) pt = ss2.PivotTables(ptname) # ピボットテーブルオブジェクトをptに pt.SmallGrid = false ptf1 = pt.PivotFields("氏名") ptf1.Orientation = XlColumnField ptf2 = pt.PivotFields("身長") ptf2.Orientation = XlDataField ptf2.Function = XlAverage # 以下がグループ化の処理 person_names = [%w(安部 伊藤 上村 榎本 小田), %w(佐藤 篠原 杉山 千田 相馬)] person_names.each {|list| param = [] list.each {|name| param << ptf1.PivotItems(name).LabelRange } pt.Application.Union(*param).Group } # 親フィールドに関する設定 ptf1p = ptf1.ParentField # 親フィールド(大きなカテゴリー)のオブジェクト %w(ア行の人々 サ行の人々).each_with_index {|name, i| ptf1p.PivotItems(i+1).Name = name } ptf1p.Subtotals = [true] + [false]*11 ptf1p.SubtotalName = "グループ平均値" # 「氏名」の並び順を「あいうえお」順に変更 i = 0 person_names.each {|list| list.each {|name| i += 1 ptf1.PivotItems(name).Position = i } } wb.save }download pt05_3.rb
#! ruby -Ks # 日付によるグループ化:四半期単位の売上げ合計を集計 require "exlap" Mday = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] data_list = [["日付", "売上げ"]] year = 2010 for month in 1..12 for day in 1..Mday[month-1] dt = sprintf("%d/%d/%d", year, month, day) val = rand(90) + 10 data_list << [dt, val] end end filename = "test05_4.xls" Exlap.new(filename) {|wb| # 元になるデータをワークシートに記録 ss = wb.fes # 最初の空のシートを選択 ss.Name = "元データのシート" data_list.each_with_index {|row, i| rn = i + 1 ss.rr(rn,1, rn,row.size).Value = row } ss.range_autofit # 列幅等の自動調整 y1,x1, y2,x2 = ss.range_address # データ記録領域の番地を取得 # 上記データの領域を「名前付き範囲」に指定 range_name = "日付と売上げ" # 範囲に付ける名前 range_area = sprintf("R%dC%d:R%dC%d", y1, x1, y2, x2) wb.obj.Names.Add({ 'Name'=>range_name, 'RefersTo'=>"=#{ss.Name}!#{range_area}"}) # 次シートにピボットテーブルを設定 ss2 = wb.fes ss2.Name = "ピボットテーブルのシート" ss2.Activate # ピボットテーブルを設けるシートに焦点を当てる pivot_cache = wb.obj.PivotCaches.Add({ 'SourceType'=>XlDatabase, 'SourceData'=>range_name}) ptname = "ピボット01" # ピボットテーブルの名前 pivot_cache.CreatePivotTable({ 'TableDestination'=>ss2.Range("A1"), # ピボットテーブルの始点 'TableName'=>ptname}) pt = ss2.PivotTables(ptname) # ピボットテーブルオブジェクトをptに pt.SmallGrid = false ptf1 = pt.PivotFields("日付") ptf1.Orientation = XlRowField # 行方向(縦方向)に並べるとの指定 ptf2 = pt.PivotFields("売上げ") ptf2.Orientation = XlDataField ptf2.Function = XlSum ary = [false]*5 + [true, false] # 四半期単位の指定 ptf1.LabelRange.Group({'Periods'=>ary}) # ptf1.Orientation = XlColumnField # 列方向に並べ直したい時に指定 wb.save }download pt05_4.rb
#! ruby -Ks # 日付によるグループ化:月単位・四半期単位の売上げ合計を集計 require "exlap" Mday = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] data_list = [["日付", "売上げ"]] year = 2010 for month in 1..12 for day in 1..Mday[month-1] dt = sprintf("%d/%d/%d", year, month, day) val = rand(90) + 10 data_list << [dt, val] end end filename = "test05_5.xls" Exlap.new(filename) {|wb| # 元になるデータをワークシートに記録 ss = wb.fes # 最初の空のシートを選択 ss.Name = "元データのシート" data_list.each_with_index {|row, i| rn = i + 1 ss.rr(rn,1, rn,row.size).Value = row } ss.range_autofit # 列幅等の自動調整 y1,x1, y2,x2 = ss.range_address # データ記録領域の番地を取得 # 上記データの領域を「名前付き範囲」に指定 range_name = "日付と売上げ" # 範囲に付ける名前 range_area = sprintf("R%dC%d:R%dC%d", y1, x1, y2, x2) wb.obj.Names.Add({ 'Name'=>range_name, 'RefersTo'=>"=#{ss.Name}!#{range_area}"}) # 次シートにピボットテーブルを設定 ss2 = wb.fes ss2.Name = "ピボットテーブルのシート" ss2.Activate # ピボットテーブルを設けるシートに焦点を当てる pivot_cache = wb.obj.PivotCaches.Add({ 'SourceType'=>XlDatabase, 'SourceData'=>range_name}) ptname = "ピボット01" # ピボットテーブルの名前 pivot_cache.CreatePivotTable({ 'TableDestination'=>ss2.Range("A1"), # ピボットテーブルの始点 'TableName'=>ptname}) pt = ss2.PivotTables(ptname) # ピボットテーブルオブジェクトをptに pt.SmallGrid = false ptf1 = pt.PivotFields("日付") ptf1.Orientation = XlRowField ptf2 = pt.PivotFields("売上げ") ptf2.Orientation = XlDataField ptf2.Function = XlSum ary = [false]*4 + [true, true, false] ptf1.LabelRange.Group({'Periods'=>ary}) ptf1q = pt.PivotFields("四半期") # 「四半期」のピボットフィールド ptf1q.Subtotals = [true] + [false]*11 # 四半期合計を表示 # ptf1.Orientation = ptf1q.Orientation = XlColumnField # 列方向並びに wb.save }download pt05_5.rb
#! ruby -Ks # 新たに「身長区分」の欄を設けて集計(グループ化の代替手法) require "exlap" data_list = [ # 10人分の氏名、性別、身長、体重 %w(氏名 性別 身長 体重), %w(安部 男 158.9 50.6), %w(伊藤 女 151.0 50.7), %w(上村 男 178.4 73.9), %w(榎本 女 164.0 70.6), %w(小田 男 161.8 64.7), %w(佐藤 女 167.9 62.1), %w(篠原 男 174.6 71.5), %w(杉山 女 173.9 51.5), %w(千田 男 179.6 65.2), %w(相馬 女 151.6 51.3)] filename = "test05_6.xls" Exlap.new(filename) {|wb| # 元になるデータをワークシートに記録 ss = wb.fes # 空のシートを選択 ss.Name = "元データのシート" # ワークシート名 data_list.each_with_index {|row, i| rn = i + 1 ss.rr(rn,1, rn,row.size).Value = row } y1,x1, y2,x2 = ss.range_address # データが書かれている領域の番地 # 「元データのシート」のコピーを作成 ss = wb.fes # 空のシートを選択 ss.Name = "元データの変更版シート" wb.ss("元データのシート").rr(y1,x1, y2,x2).Copy ss.rr(y1,x1, y2,x2) # 項目分類のための新設欄を設定 last_y, last_x = ss.range_last # データ領域の最終番地 height_y, height_x = Exl::yx(ss.findf("身長")) # 見出し「身長」の番地 ss[1, last_x+1] = "身長区分" # 新たな欄の見出しを書き込む for y in 2..last_y height = ss[y, height_x] # 各人の身長欄の値 if height >= 155.0 and height < 165.0 group = "155-165" elsif height >= 165.0 and height < 175.0 group = "165-175" else group = "その他" end ss[y, last_x+1] = group # 各人の身長区分欄の書き込み end y1,x1, y2,x2 = ss.range_address # 上記データの領域を「名前付き範囲」に指定 range_name = "性別・身長・体重" # 範囲に付ける名前 range_area = sprintf("R%dC%d:R%dC%d", y1, x1, y2, x2) wb.obj.Names.Add({ 'Name'=>range_name, 'RefersTo'=>"=#{ss.Name}!#{range_area}"}) # 次シートにピボットテーブルを設定 ss2 = wb.fes ss2.Name = "ピボットテーブルのシート" ss2.Activate # ピボットテーブルを設けるシートに焦点を当てる pivot_cache = wb.obj.PivotCaches.Add({ 'SourceType'=>XlDatabase, 'SourceData'=>range_name}) ptname = "ピボット01" # ピボットテーブルの名前 pivot_cache.CreatePivotTable({ 'TableDestination'=>ss2.Range("A1"), # ピボットテーブルの始点 'TableName'=>ptname}) pt = ss2.PivotTables(ptname) # ピボットテーブルオブジェクトをptに pt.SmallGrid = false ptf1 = pt.PivotFields("身長区分") ptf1.Orientation = XlColumnField ptf2 = pt.PivotFields("身長区分") ptf2.Orientation = XlDataField ptf2.Function = XlCount wb.save }download pt05_6.rb
#! ruby -Ks # 支店×四半期について売上げの合計を算出:クロス集計表 require "exlap" # 元データのファイルを開く xl = Exlap.new source_name = "source06.xls" sheet_name = "支店・日付・売上げのシート" wbs = xl.book_open source_name ss = wbs.ss(sheet_name) source_area = "[#{wbs.obj.Name}]#{ss.Name}!" + ss.UsedRange.Address(true, true, XlR1C1) # ピボットテーブル保存用のワークブックを開く filename = "test06.xls" wb = xl.book_open filename ss = wb.fes ss.Name = "基盤となるシート" ss.Activate # ピボットテーブルを設けるシートに焦点を当てる pivot_cache = wb.obj.PivotCaches.Add({ 'SourceType'=>XlDatabase, 'SourceData'=>source_area}) ptname = "基盤となるピボット" # ピボットテーブルの名前 pivot_cache.CreatePivotTable({ 'TableDestination'=>ss.Range("A1"), # ピボットテーブルの始点 'TableName'=>ptname}) pt = ss.PivotTables(ptname) # ピボットテーブルオブジェクトをptに pt.SmallGrid = false # 集計表の設定 ptf1 = pt.PivotFields("支店") ptf1.Orientation = XlColumnField ptf2 = pt.PivotFields("日付") ptf2.Orientation = XlRowField ptf3 = pt.PivotFields("売上げ") ptf3.Orientation = XlDataField ptf3.Function = XlSum ary = [false]*5 + [true, false] # 四半期のみでのグループ化 ptf2.LabelRange.Group({'Periods'=>ary}) %w(東京 名古屋 大阪).each_with_index {|name, i| ptf1.PivotItems(name).Position = i+1 } wb.save wb.close wbs.close xl.quitdownload pt06.rb
#! ruby -Ks # 支店をページフィールドに指定して売上げ合計を集計 require "exlap" # 元データのファイルを開く xl = Exlap.new source_name = "source06.xls" sheet_name = "支店・日付・売上げのシート" wbs = xl.book_open source_name ss = wbs.ss(sheet_name) source_area = "[#{wbs.obj.Name}]#{ss.Name}!" + ss.UsedRange.Address(true, true, XlR1C1) # ピボットテーブル保存用のワークブックを開く filename = "test06_2.xls" wb = xl.book_open filename ss = wb.fes ss.Name = "基盤となるシート" ss.Activate # ピボットテーブルを設けるシートに焦点を当てる pivot_cache = wb.obj.PivotCaches.Add({ 'SourceType'=>XlDatabase, 'SourceData'=>source_area}) ptname = "基盤となるピボット" # ピボットテーブルの名前 pivot_cache.CreatePivotTable({ 'TableDestination'=>ss.Range("A1"), # ピボットテーブルの始点 'TableName'=>ptname}) pt = ss.PivotTables(ptname) # ピボットテーブルオブジェクトをptに pt.SmallGrid = false # 集計表の設定 ptf1 = pt.PivotFields("支店") ptf1.Orientation = XlPageField ptf2 = pt.PivotFields("日付") ptf2.Orientation = XlRowField ptf3 = pt.PivotFields("売上げ") ptf3.Orientation = XlDataField ptf3.Function = XlSum ary = [false]*5 + [true, false] # 四半期のみでのグループ化 ptf2.LabelRange.Group({'Periods'=>ary}) %w(東京 名古屋 大阪).each_with_index {|name, i| ptf1.PivotItems(name).Position = i+1 } pt.ShowPages wb.save wb.close wbs.close xl.quitdownload pt06_2.rb
#! ruby -Ks # 日付(四半期)をページフィールドに指定して売上げ合計を集計 require "exlap" # 元データのファイルを開く xl = Exlap.new source_name = "source06.xls" sheet_name = "支店・日付・売上げのシート" wbs = xl.book_open source_name ss = wbs.ss(sheet_name) source_area = "[#{wbs.obj.Name}]#{ss.Name}!" + ss.UsedRange.Address(true, true, XlR1C1) # ピボットテーブル保存用のワークブックを開く filename = "test06_3.xls" wb = xl.book_open filename ss = wb.fes ss.Name = "基盤となるシート" ss.Activate # ピボットテーブルを設けるシートに焦点を当てる pivot_cache = wb.obj.PivotCaches.Add({ 'SourceType'=>XlDatabase, 'SourceData'=>source_area}) ptname = "基盤となるピボット" # ピボットテーブルの名前 pivot_cache.CreatePivotTable({ 'TableDestination'=>ss.Range("A1"), # ピボットテーブルの始点 'TableName'=>ptname}) pt = ss.PivotTables(ptname) # ピボットテーブルオブジェクトをptに pt.SmallGrid = false # 集計表の設定 ptf1 = pt.PivotFields("支店") ptf1.Orientation = XlColumnField ptf2 = pt.PivotFields("日付") ptf2.Orientation = XlRowField ptf3 = pt.PivotFields("売上げ") ptf3.Orientation = XlDataField ptf3.Function = XlSum ary = [false]*5 + [true, false] # 四半期のみでのグループ化 ptf2.LabelRange.Group({'Periods'=>ary}) %w(東京 名古屋 大阪).each_with_index {|name, i| ptf1.PivotItems(name).Position = i+1 } ptf2.Orientation = XlPageField ptf2.PivotItems.each {|ptfi| if ptfi.RecordCount < 1 ptfi.Visible = false end } pt.ShowPages wb.save wb.close wbs.close xl.quitdownload pt06_3.rb
#! ruby -Ks # 複数の元データを統合して取り込んだ時の初期状態を確認 require "exlap" # 元データのファイルを開く xl = Exlap.new wbs = xl.book_open "source07.xls" source_data = [] wbs.each {|ss| if ss.Name =~ /^(.+)のシート$/ branch = $1 area = "[#{wbs.obj.Name}]#{ss.Name}!" + ss.UsedRange.Address(true, true, XlR1C1) source_data << [area, branch] end } # ピボットテーブル保存用のワークブックを開く wb = xl.book_open "test07.xls" ss = wb.fes ss.Name = "ピボットテーブルのシート" ss.Activate # ピボットテーブルを設けるシートに焦点を当てる pivot_cache = wb.obj.PivotCaches.Add({ 'SourceType'=>XlConsolidation, 'SourceData'=>source_data}) ptname = "ピボット01" # ピボットテーブルの名前 pt = pivot_cache.CreatePivotTable({ 'TableDestination'=>ss.Range("A1"), # ピボットテーブルの始点 'TableName'=>ptname}) pt.SmallGrid = false pt.ShowPages wb.save wb.close wbs.close xl.quitdownload pt07.rb
#! ruby -Ks # 複数の元データを統合して取り込んだ時の各フィールドを確認 require "exlap" # 元データのファイルを開く xl = Exlap.new wbs = xl.book_open "source07.xls" source_data = [] wbs.each {|ss| if ss.Name =~ /^(.+)のシート$/ branch = $1 area = "[#{wbs.obj.Name}]#{ss.Name}!" + ss.UsedRange.Address(true, true, XlR1C1) source_data << [area, branch] end } # ピボットテーブル保存用のワークブックを開く wb = xl.book_open "test07_2.xls" ss = wb.fes ss.Name = "ピボットテーブルのシート" ss.Activate # ピボットテーブルを設けるシートに焦点を当てる pivot_cache = wb.obj.PivotCaches.Add({ 'SourceType'=>XlConsolidation, 'SourceData'=>source_data}) ptname = "ピボット01" # ピボットテーブルの名前 pt = pivot_cache.CreatePivotTable({ 'TableDestination'=>ss.Range("A1"), # ピボットテーブルの始点 'TableName'=>ptname}) pt.SmallGrid = false output = ["* PageField"] i = 0 pt.PageFields.each {|ptf| output << sprintf("\t"+"field#%d %s", i+=1, ptf.Name) j = 0 ptf.PivotItems.each {|ptfi| output << sprintf("\t\t"+"item#%d %s", j+=1, ptfi.Name) } } puts output.join("\n") ## output = ["* RowField"] i = 0 pt.RowFields.each {|ptf| output << sprintf("\t"+"field#%d %s", i+=1, ptf.Name) j = 0 ptf.PivotItems.each {|ptfi| output << sprintf("\t\t"+"item#%d %s", j+=1, ptfi.Name) } } puts output.join("\n") ## output = ["* ColumnField"] i = 0 pt.ColumnFields.each {|ptf| output << sprintf("\t"+"field#%d %s", i+=1, ptf.Name) j = 0 ptf.PivotItems.each {|ptfi| output << sprintf("\t\t"+"item#%d %s", j+=1, ptfi.Name) } } puts output.join("\n") ## output = ["* DataField"] i = 0 pt.DataFields.each {|ptf| output << sprintf("\t"+"field#%d %s", i+=1, ptf.Name) j = 0 ptf.PivotItems.each {|ptfi| output << sprintf("\t\t"+"item#%d %s", j+=1, ptfi.Name) } } puts output.join("\n") wb.close wbs.close xl.quitdownload pt07_2.rb
#! ruby -Ks # 複数の元データを統合して取り込んだ時の各フィールドを確認・その2 require "exlap" # 各フィールド情報出力用スクリプト(__name__を適宜置き換え) Proc_str = <<EOS output = ["* __name__Field"] i = 0 pt.__name__Fields.each {|ptf| output << sprintf("\\t"+"field#%d %s", i+=1, ptf.Name) j = 0 ptf.PivotItems.each {|ptfi| output << sprintf("\\t\\t"+"item#%d %s", j+=1, ptfi.Name) } } puts output.join("\\n") EOS # 元データのファイルを開く xl = Exlap.new wbs = xl.book_open "source07.xls" source_data = [] wbs.each {|ss| if ss.Name =~ /^(.+)のシート$/ branch = $1 area = "[#{wbs.obj.Name}]#{ss.Name}!" + ss.UsedRange.Address(true, true, XlR1C1) source_data << [area, branch] end } # ピボットテーブル保存用のワークブックを開く wb = xl.book_open "test07_3.xls" ss = wb.fes ss.Name = "ピボットテーブルのシート" ss.Activate # ピボットテーブルを設けるシートに焦点を当てる pivot_cache = wb.obj.PivotCaches.Add({ 'SourceType'=>XlConsolidation, 'SourceData'=>source_data}) ptname = "ピボット01" # ピボットテーブルの名前 pt = pivot_cache.CreatePivotTable({ 'TableDestination'=>ss.Range("A1"), # ピボットテーブルの始点 'TableName'=>ptname}) pt.SmallGrid = false %w(Page Row Column Data).each {|name| eval Proc_str.gsub(/__name__/, name) } wb.close wbs.close xl.quitdownload pt07_3.rb
#! ruby -Ks # 複数の元データを統合して取り込み、一つのクロス集計表を作成 require "exlap" # 元データのファイルを開く xl = Exlap.new wbs = xl.book_open "source07.xls" source_data = [] wbs.each {|ss| if ss.Name =~ /^(.+)のシート$/ branch = $1 area = "[#{wbs.obj.Name}]#{ss.Name}!" + ss.UsedRange.Address(true, true, XlR1C1) source_data << [area, branch] end } # ピボットテーブル保存用のワークブックを開く wb = xl.book_open "test07_4.xls" ss = wb.fes ss.Name = "ピボットテーブルのシート" ss.Activate # ピボットテーブルを設けるシートに焦点を当てる pivot_cache = wb.obj.PivotCaches.Add({ 'SourceType'=>XlConsolidation, 'SourceData'=>source_data}) ptname = "ピボット01" # ピボットテーブルの名前 pt = pivot_cache.CreatePivotTable({ 'TableDestination'=>ss.Range("A1"), # ピボットテーブルの始点 'TableName'=>ptname}) pt.SmallGrid = false # とりあえず各フィールドを変数に代入 ptfp = pt.PageFields(1) ptfr = pt.RowFields(1) ptfc = pt.ColumnFields(1) ptfd = pt.DataFields(1) ptfp.Orientation = XlColumnField # ページフィールドを列フィールドに変更 ary = [false]*5 + [true, false] # 四半期グループ化用の配列 ptfr.LabelRange.Group({'Periods'=>ary}) # 行フィールドを四半期グループ化 ptfc.Orientation = XlHidden # 自動設定された列フィールドを非表示に ptfp.Caption = "支店" ptfr.Caption = "期間" ptfd.Caption = "合計/売上げ" %w(東京 名古屋 大阪).each_with_index {|name, i| ptfp.PivotItems(name).Position = i+1 } wb.save wb.close wbs.close xl.quitdownload pt07_4.rb
#! ruby -Ks # 複数の元データを統合して取り込んだ時の素材ピボットフィールドの確認 require "exlap" # 元データのファイルを開く xl = Exlap.new wbs = xl.book_open "source07.xls" source_data = [] wbs.each {|ss| if ss.Name =~ /^(.+)のシート$/ branch = $1 area = "[#{wbs.obj.Name}]#{ss.Name}!" + ss.UsedRange.Address(true, true, XlR1C1) source_data << [area, branch] end } # ピボットテーブル保存用のワークブックを開く wb = xl.book_open "test07_5.xls" ss = wb.fes ss.Name = "ピボットテーブルのシート" ss.Activate # ピボットテーブルを設けるシートに焦点を当てる pivot_cache = wb.obj.PivotCaches.Add({ 'SourceType'=>XlConsolidation, 'SourceData'=>source_data}) ptname = "ピボット01" # ピボットテーブルの名前 pt = pivot_cache.CreatePivotTable({ 'TableDestination'=>ss.Range("A1"), # ピボットテーブルの始点 'TableName'=>ptname}) pt.SmallGrid = false output = ["素材となるピボットフィールドの一覧"] i = 0 pt.PivotFields.each {|ptf| output << sprintf("field#%d %s", i+=1, ptf.Name) j = 0 ptf.PivotItems.each {|ptfi| output << sprintf("\t"+"item#%d %s", j+=1, ptfi.Name) } } puts output.join("\n") wb.close wbs.close xl.quitdownload pt07_5.rb
#! ruby -Ks # 複数の元データを統合して集計(sql命令文の活用) require "exlap" source_name = "source07_2.xls" cnn = "ODBC;DSN=Excel Files;DBQ=#{Exl::getAbsolutePath(source_name)}" tbl1 = "[性別のシート$]" tbl2 = "[喫煙のシート$]" sql = <<EOS select #{tbl1}.氏名, #{tbl1}.性別, #{tbl2}.喫煙 from #{tbl1}, #{tbl2} where #{tbl1}.氏名 = #{tbl2}.氏名; EOS filename = "test07_6.xls" Exlap.new(filename) {|wb| ss = wb.fes ss.Name = "性別と喫煙の関係のシート" ss.Activate # ピボットテーブルを設けるシートに焦点を当てる pivot_cache = wb.obj.PivotCaches.Add({ 'SourceType'=>XlExternal}) pivot_cache.Connection = cnn pivot_cache.CommandText = sql ptname = "性別と喫煙" # ピボットテーブルの名前 pt = pivot_cache.CreatePivotTable({ 'TableDestination'=>ss.Range("A1"), # ピボットテーブルの始点 'TableName'=>ptname}) pt.SmallGrid = false ptf1 = pt.PivotFields("性別") ptf1.Orientation = XlColumnField ptf2 = pt.PivotFields("喫煙") ptf2.Orientation = XlRowField ptf3 = pt.PivotFields("性別") ptf3.Orientation = XlDataField ptf3.Function = XlCount ptf1.PivotItems("男").Position = 1 ptf1.PivotItems("女").Position = 2 ptf3.Caption = "性別/喫煙" wb.save }download pt07_6.rb
#! ruby -Ks # 複数の元データを統合して集計(sql命令文の活用, ado版) require "exlap" source_name = "source07_2.xls" tbl1 = "[性別のシート$]" tbl2 = "[喫煙のシート$]" sql = <<EOS select #{tbl1}.氏名, #{tbl1}.性別, #{tbl2}.喫煙 from #{tbl1}, #{tbl2} where #{tbl1}.氏名 = #{tbl2}.氏名; EOS # ado接続の準備 cnn_xls = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=#{Exl::getAbsolutePath(source_name)};" + "Extended Properties=\"Excel 8.0;HDR=Yes;\"" cnn_xlsx = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=#{Exl::getAbsolutePath(source_name)};" + "Extended Properties=\"Excel 12.0;HDR=Yes;\"" cnn = nil case File.extname(source_name).downcase when '.xls' cnn = cnn_xls when '.xlsx' cnn = cnn_xlsx end unless cnn exit end cn = WIN32OLE.new("ADODB.Connection") rs = WIN32OLE.new("ADODB.Recordset") rs.CursorLocation = 3 # adUseClient クライアント側カーソルを使用 filename = "test07_7.xls" Exlap.new(filename) {|wb| # シートにピボットテーブルを設定 ss = wb.fes ss.Name = "性別と喫煙の関係のシート" ss.Activate # ピボットテーブルを設けるシートに焦点を当てる cn.Open cnn; rs.Open sql,cn # ado接続 pivot_cache = wb.obj.PivotCaches.Add({ 'SourceType'=>XlExternal}) pivot_cache.Recordset = rs rs.Close; cn.Close # adoを閉じる ptname = "性別と喫煙" # ピボットテーブルの名前 pt = pivot_cache.CreatePivotTable({ 'TableDestination'=>ss.Range("A1"), # ピボットテーブルの始点 'TableName'=>ptname}) pt.SmallGrid = false ptf1 = pt.PivotFields("性別") ptf1.Orientation = XlColumnField ptf2 = pt.PivotFields("喫煙") ptf2.Orientation = XlRowField ptf3 = pt.PivotFields("性別") ptf3.Orientation = XlDataField ptf3.Function = XlCount ptf1.PivotItems("男").Position = 1 ptf1.PivotItems("女").Position = 2 ptf3.Caption = "性別/喫煙" wb.save }download pt07_7.rb