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

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

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

Re[2]: C# Excelファイルへの画像挿入。


(過去ログ 122 を表示中)

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

■72855 / inTopicNo.1)  C# Excelファイルへの画像挿入。
  
□投稿者/ amagi (2回)-(2014/07/27(Sun) 14:43:13)

分類:[C#] 

C# shapes.AddPictureによるExcelファイルへの画像挿入。

現在、C#でExcelファイル(xls)にPNG画像を貼り付けるツールを作成しています。
以下のプログラムを実行したのですが、
shapes.AddPicture(@"C:\test.png", MsoTriState.msoFalse,MsoTriState.msoFalse,fx, fy, 100,100);
の部分で以下の様なエラーが表示されました。

----------------
エラー文
----------------
型 'System.Runtime.InteropServices.COMException' のハンドルされていない例外が mscorlib.dll で発生しました

追加情報: 指定された値は境界を超えています。
----------------

つきましては解決方法を教えてください。



-----------------------
プログラム
-----------------------
Excel.Application exApp = new Excel.Application();

Excel.Workbook wkbook;

Excel.Workbooks wkbooks = exApp.Workbooks;

exApp.Visible = true;

exApp.DisplayAlerts = false;

wkbook = (Excel.Workbook)wkbooks.Open(@"C:\test.xls", Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);

Excel.Sheets sheets = wkbook.Worksheets;

Excel.Worksheet wksheet = (Excel.Worksheet)sheets["test"];

Excel.Range cells = wksheet.Cells;

Excel.Range range = (Excel.Range)cells[1, 21];

range.Select();

Excel.Shapes shapes = wksheet.Shapes;
float fx = float.Parse(range.Left.ToString());

float fy = float.Parse(range.Top.ToString());

shapes.AddPicture(@"C:\test.png", MsoTriState.msoFalse,MsoTriState.msoFalse,fx, fy, 100,100);

引用返信 編集キー/
■72856 / inTopicNo.2)  Re[1]: C# Excelファイルへの画像挿入。
□投稿者/ 魔界の仮面弁士 (54回)-(2014/07/28(Mon) 10:42:18)
No72855 (amagi さん) に返信
> wkbook = (Excel.Workbook)wkbooks.Open(@"C:\test.xls", Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);

この構文を使っているということは、VS2008(C# 3.0)以降ではなく、
VS2005(C# 2.0)以下のバージョンをお使いのようですね。


> shapes.AddPicture(@"C:\test.png", MsoTriState.msoFalse,MsoTriState.msoFalse,fx, fy, 100,100);
> 追加情報: 指定された値は境界を超えています。

第二引数 LinkToFile、第三引数 SaveWithDocument の組み合わせが不正だからです。

LinkToFile に msoFalse (図を、独立したファイルのコピーとして貼り付け)を指定した場合は、
SaveWithDocument は msoTrue (文書内に画像ファイルも保存)を指定せねばなりません。今回は、
両方とも msoFalse にしたため、エラーが表示されることになります。

LinkToFile が msoTrue (図を、作成元画像ファイルへのリンクとする)にした場合は、
SaveWithDocument は、msoFalse (文書内のリンク情報だけを保存する)であっても、
msoTrue (文書内に画像ファイルも保存) であっても構いません。


なお画像を挿入した後、そのExcel文書を、元の画像ファイルを参照できない環境下で
開きなおした場合、SaveWithDocument = msoFalse だと、画像は表示されず、かわりに
赤×アイコンで表示されることになります。
一方、SaveWithDocument = msoTrue にした場合は、元画像が削除されていても表示されますが、
その分、Excel 文書ファイルのサイズは肥大化しますのでご注意下さい。



> つきましては解決方法を教えてください。

回答ついでに、2点ほど指摘を。


まず、AddPicture メソッドは Shape オブジェクトを返却しますので、
 Excel.Shape shape = shapes.AddPicture(……);
のように記述するようにしましょう。後々、Shepe オブジェクトを解放するためにも。


それから、以下の座標取得処理。
> float fx = float.Parse(range.Left.ToString());
> float fy = float.Parse(range.Top.ToString());
double → string → float という多段階変換にされていますが、これは
意図的なものでしょうか。 double → float でも十分かと思いますが…。

float fx = (float)range.Left;
float fy = (float)range.Top;
引用返信 編集キー/
■72859 / inTopicNo.3)  Re[2]: C# Excelファイルへの画像挿入。
□投稿者/ amagi (3回)-(2014/07/28(Mon) 21:31:31)
質問の回答、さらに2点の指摘を頂き、有難うございました。

参考にさせて頂きます。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -