C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: ページ毎の印刷タイトル設定方法


(過去ログ 122 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■73235 / inTopicNo.1)  ページ毎の印刷タイトル設定方法
  
□投稿者/ さとすけ (12回)-(2014/08/29(Fri) 21:45:07)

分類:[C#] 

# 連続の質問恐れ入ります

印刷タイトルにつきまして、
以下の2点について教えてください。

1. ページ毎の印刷タイトルを設定する方法

2. 印刷タイトルに複数行を設定する方法


@やりたいこと
--------------------------------------------
以下のデータを持つExcelにおいて


固定のタイトル
グループ1のタイトル
20 21
30 31
40 41
グループ2のタイトル	
60 61
70 71
80 81



次のように印刷したい(第一希望)。

--- 1ページ目 ---
固定のタイトル
グループ1のタイトル
20 21
30 31

--- 2ページ目 ---
固定のタイトル
グループ1のタイトル
40 41

--- 3ページ目 ---
固定のタイトル
グループ2のタイトル	
60 61
70 71

--- 4ページ目 ---
固定のタイトル
グループ2のタイトル	
80 81


または次のように(第二希望)。

--- 1ページ目 ---
固定のタイトル
グループ1のタイトル
20 21
30 31

--- 2ページ目 ---
グループ1のタイトル
40 41

--- 3ページ目 ---
グループ2のタイトル	
60 61
70 71

--- 4ページ目 ---
グループ2のタイトル	
80 81


@現状
--------------------------------------------
当方の実装では次のようになってしまった。

--- 1ページ目 ---
固定のタイトル
グループ1のタイトル
20 21
30 31

--- 2ページ目 ---
40 41

--- 3ページ目 ---
グループ2のタイトル	
60 61
70 71

--- 4ページ目 ---
グループ2のタイトル	
80 81


第二希望に近いのですが、2ページ目のタイトルが何故かなくなってしまいました。

度々でもうしわけございませんが、もし情報お持ちの方いらっしゃいましたらご提供下さい。



@ソース(メイン)
--------------------------------------------
Excel.Application ExcelApp = new Excel.Application();
Excel.Workbooks books = ExcelApp.Workbooks;
Excel.Workbook Book = books.Add();
Excel.Sheets sheets = Book.Sheets;
Excel.Worksheet sheet = (Excel.Worksheet)sheets[1];

// データ設定
int maxX = 2;
int maxY = 9;
object[,] data = new object[maxY, maxX];

// <- 1ページ目
data[0, 0] = "固定のタイトル"; 
data[1, 0] = "グループ1のタイトル";
data[2, 0] = 20;
data[2, 1] = 21;
data[3, 0] = 30;
data[3, 1] = 31;

// <- 2ページ目
data[4, 0] = 40; 
data[4, 1] = 41;

// <- 3ページ目
data[5, 0] = "グループ2のタイトル"; 
data[6, 0] = 60;
data[6, 1] = 61;
data[7, 0] = 70;
data[7, 1] = 71;

// <- 4ページ目
data[8, 0] = 80; 
data[8, 1] = 81;

SetData(sheet, 1, 1, maxX, maxY, data);

// タイトル設定と改ページ
// 1ページ目
// ----
// 固定のタイトル
// グループ1のタイトル
// ----
// →理想通り
SetTitle(sheet, "$1:$2");

// 2ページ目
// ----
// 固定のタイトル
// グループ1のタイトル
// ----
// →どちらのタイトルも表示されず
SetKaiPage(sheet, 5);

// 3ページ目
// ----
// 固定のタイトル
// グループ2のタイトル
// ----
// →「グループ2のタイトル」のみ表示
// →「$1:$1,$6:$6」の指定をするとエラーになってしまった
SetKaiPage(sheet, 6);
SetTitle(sheet, "$6:$6");

// 4ページ目
// ----
// 固定のタイトル
// グループ2のタイトル
// ----
// →「グループ2のタイトル」のみ表示
SetKaiPage(sheet, 9);

Book.SaveAs(@"d:\tmp\a.xlsx");
Book.Close(false, Missing.Value, Missing.Value);

ExcelApp.Quit();

Marshal.ReleaseComObject(sheet);
if (Marshal.IsComObject(sheets)) Marshal.ReleaseComObject(sheets);
Marshal.ReleaseComObject(Book);
if (Marshal.IsComObject(books)) Marshal.ReleaseComObject(books);
Marshal.ReleaseComObject(ExcelApp);


@ソース(関数群)
--------------------------------------------
private void SetTitle(Excel.Worksheet sheet, String address)
{
	Excel.PageSetup page = sheet.PageSetup;

	page.PrintTitleRows = address;

	Marshal.ReleaseComObject(page);
}

private void SetKaiPage(Excel.Worksheet sheet, int y)
{
	Excel.Range range0 = sheet.Cells;
	Excel.Range range1 = range0.Item[y, 1];
	Excel.Range range2 = range0.Item[y, 1];
	Excel.Range range3 = sheet.Range[range1, range2];

	range3.PageBreak = (int)Excel.XlPageBreak.xlPageBreakManual;

	Marshal.ReleaseComObject(range0);
	Marshal.ReleaseComObject(range1);
	Marshal.ReleaseComObject(range2);
	Marshal.ReleaseComObject(range3);
}

private void SetData(Excel.Worksheet sheet, int startX, int startY, int endX, int endY, object[,] data)
{
	Excel.Range range0 = sheet.Cells;
	Excel.Range range1 = range0.Item[startY, startX];
	Excel.Range range2 = range0.Item[endY, endX];
	Excel.Range range3 = sheet.Range[range1, range2];

	range3.Value2 = data;

	Marshal.ReleaseComObject(range0);
	Marshal.ReleaseComObject(range1);
	Marshal.ReleaseComObject(range2);
	Marshal.ReleaseComObject(range3);
}
--------------------------------------------


引用返信 編集キー/
■73249 / inTopicNo.2)  Re[1]: ページ毎の印刷タイトル設定方法
□投稿者/ shu (618回)-(2014/09/03(Wed) 09:08:17)
No73235 (さとすけ さん) に返信

PrintTitleRows で指定できるのは連続する行を1カ所しか指定出来ないしページ毎に
変えるとか出来ないので共通の『固定のタイトル』部分だけにして
後は同じ行をコピーしないと駄目かと思います。
引用返信 編集キー/
■73250 / inTopicNo.3)  Re[2]: ページ毎の印刷タイトル設定方法
□投稿者/ さとすけ (13回)-(2014/09/03(Wed) 10:10:45)
shu様

ご回答ありがとうございます。

> PrintTitleRows で指定できるのは連続する行を1カ所しか指定出来ない
> ページ毎に変えるとか出来ない

なるほど、当方が勘違いしていました。
あれこれ調べましたがどれもうまくいかず、
ひょっとして実現不可能なことをやろうとしているのでは・・と悩んでいました。

> 後は同じ行をコピーしないと駄目かと思います

了解しました。ありがとうございます。
実装可能なものをいくつかサンプルを作って設計者と相談してみます。

お忙しいところありがとうございました。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -