C#のExcel操作備忘録

Excel.Worksheet sheet = null;
Excel.Range range = null;

 

 

縦書きにしたセルを印刷の時に切れちゃうので大きくする

range = sheet.get_Range("A5");
range.RowHeight = range.Height + 30;
range = null;

 

 

印刷可能サイズの取得(A4の場合)

double printable_height;
double printable_width;
double paper_height;
double paper_width;

if (sheet.PageSetup.Orientation == Excel.XlPageOrientation.xlPortrait)
{
//縦 297mm 1mm = 2.83pt;
paper_height = 297 * 2.83;
paper_width = 210 * 2.83;
}
else
{
//横 210mm 1mm = 2.83pt;
paper_height = 210 * 2.83;
paper_width = 297 * 2.83;
}



double BottomMargin = sheet.PageSetup.BottomMargin;//pt
double TopMargin = sheet.PageSetup.TopMargin;//pt
printable_height = paper_height - BottomMargin - TopMargin;

double RightMargin = sheet.PageSetup.RightMargin;//pt
double LeftMargin = sheet.PageSetup.LeftMargin;//pt
printable_width = paper_width - RightMargin - LeftMargin;



System.Diagnostics.Debug.Print("印刷可能高さ:" + printable_height.ToString() + "pt");
System.Diagnostics.Debug.Print("印刷可能幅:" + printable_width.ToString() + "pt");

 

 

ページ縮小率のチェック(横1ページ・縦自動の場合)

「印刷可能サイズの取得」から続きます
last_colnameに一番右のセル列を設定しておきます(ループで探してもよいが、時間がかかるのでどこかの処理で取得しておく)
例:last_colname = “AA”;

range = sheet.get_Range("A1", last_colname + "1");
last_col_x = range.Width;
range = null;
if (printable_width < last_col_x)
{
printable_height = printable_height * (last_col_x / printable_width);
}

 

グラフや図を切れないように改ページさせる

セルの高さをグラフや図の大きさに変えてやれば縦で切られない。
同様に横で切られる場合にはセルの横サイズを大きくすればいい。

ただし、結合セルは不可。
単一セルにしたときのみ改ページで切られない。

↑こんなイメージ↓

chart_row = 10;//入れ込む行
chartwidth = 300;
chartheight = 200;
top_margin = 10;
bottom_margin = 10;

location_x = 10;
location_y = sheet.get_Range("A" + chart_row).Top + top_margin;

range = sheet.get_Range("A1");
range.RowHeight = chartheight + top_margin + bottom_margin;

chart = sheet.ChartObjects().Add(location_x, location_y, chartwidth, chartheight);

 

散布図関連

一気にまとめるとこんな感じです。
最後のソースに問題点3つまとめています。

散布図グラフに使えるX軸、Y軸の設定

単純にrangeで”A1:B2″とかだとX軸Y軸の設定ができないので以降を参照してください。
XValuesとValuesを使用します。

 

散布図グラフの点の縁取り(枠線)を消す

マーカーをよく見ると縁取りになっているので同職を使って消します。
線を軟化いじるとマーカーからマーカーの間に線が入るので、
そうではない設定でツボりました。

◆ー◆の線ではなく◆の縁取り◇を同じ色にして消したかった。

 

X軸、Y軸のラベルを変える

既出ですがついでにです

 

まとめるとこんな感じ↓

//値A×値B
chart_row = 10;//10行目に書く
chart_margin_vertical = 10;//グラフの上下マージン
location_x = sheet.Range["A"+ chart_row].Width / 2;
location_y = sheet.get_Range("A" + chart_row, "A" + chart_row).Top + chart_margin_vertical / 2;
chartwidth = 300;
chart = sheet.ChartObjects().Add(location_x, location_y, chartwidth, chartHeight);
chartpage = chart.Chart;
chartrange = sheet.get_Range("A1:A2");//これはダミーレンジ

chart.Placement = Excel.XlPlacement.xlFreeFloating;//グラフのサイズをセル幅に合わせて変更しない&場所を動かさない


//グラフの作成
chartpage.SetSourceData(chartrange);
chartpage.HasLegend = false;        //凡例
chartpage.HasTitle = true;          //タイトル
chartpage.PlotArea.Format.Fill.ForeColor.RGB = Color.LightGray.ToArgb();//背景色
chartpage.PlotArea.Format.Line.ForeColor.RGB = Color.Black.ToArgb();//文字色
chartpage.ChartType = Excel.XlChartType.xlXYScatter;
chartpage.ChartTitle.Format.TextFrame2.TextRange.Font.Size = standardFontSize;
chartpage.ChartTitle.Text = "値A×値B";
chartpage.ChartGroups(1).GapWidth = 200;

//データの場所は値Aが"A100:A200"、値Bが"B100:B200"とする
start_row = 100;
end_row = 200;

tmp_objSeries = chartpage.SeriesCollection(1);
tmp_objSeries.XValues = sheet.get_Range("A" + start_row + ":" + "A" + end_row);
tmp_objSeries.Values = sheet.get_Range("B"+ start_row  + ":" + "B"+ end_row);
tmp_objSeries.MarkerBackgroundColor = ColorTranslator.ToWin32(Color.Blue);//マーカーの中
tmp_objSeries.MarkerForegroundColor = ColorTranslator.ToWin32(Color.Blue);//マーカーの外線
tmp_objSeries.MarkerSize = markersize;

valueAxis = chartpage.Axes(Excel.XlAxisType.xlCategory, Excel.XlAxisGroup.xlPrimary);
valueAxis.HasTitle = true;
valueAxis.AxisTitle.Text = "値A";
valueAxis.TickLabels.NumberFormatLocal = "#0";

valueAxis = chartpage.Axes(Excel.XlAxisType.xlValue, Excel.XlAxisGroup.xlPrimary);
valueAxis.HasTitle = true;
valueAxis.AxisTitle.Text = "値B";
valueAxis.TickLabels.NumberFormatLocal = "#0";

 

短納期で必死だったから何をやったかも、うろ覚えだけど

備忘録として…です。

 

コメントを残す