|
分類:[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);
}
--------------------------------------------
|