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

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

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

Re[4]: Re: Excelの選択範囲をjpgで保存したい(C#)


(過去ログ 137 を表示中)

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

■80400 / inTopicNo.1)  Excelの選択範囲をjpgで保存したい(C#)
  
□投稿者/ くびこ (1回)-(2016/07/14(Thu) 18:23:11)

分類:[C#] 

はじめて質問させていただきます。

Microsoft Visual C# 2010で、Excelの選択範囲をjpgで保存するプログラムを作成中です。
下記のようにPG中なのですが、★ココの部分でdataがnullとなり、その下の行でSystem.NullReferenceExceptionが発生してしまいます。
range.CopyPictureでコピーされたクリップボードから、Clipboard.GetDataObjectを使用して取得できないのでしょうか?
C#は初心者のため、困っています。
どうか、ご教示ください。よろしくお願い致します。


Microsoft.Office.Interop.Excel.Application ExcelApp = new Microsoft.Office.Interop.Excel.Application();
// エクセルを非表示
ExcelApp.Visible = false;

// Excelファイル名
string excelName = "D:\\temp\\test.xlsx";

// Excelファイルのオープン
Microsoft.Office.Interop.Excel.Workbook WorkBook = ExcelApp.Workbooks.Open(excelName);

// 1シート目の選択
Microsoft.Office.Interop.Excel.Worksheet sheet = WorkBook.Sheets[1];
sheet.Select();

// jpg保存したい範囲を選択し、クリップボードにコピー
Microsoft.Office.Interop.Excel.Range range = sheet.Range[sheet.Cells[3, 1], sheet.Cells[9, 2]];
range.CopyPicture(Microsoft.Office.Interop.Excel.XlPictureAppearance.xlScreen, Microsoft.Office.Interop.Excel.XlCopyPictureFormat.xlBitmap);

// クリップボードに格納された画像の取得
IDataObject data = Clipboard.GetDataObject(); // ★ココ
if (data.GetDataPresent(DataFormats.Bitmap))
{
Bitmap bmp = (Bitmap)data.GetData(DataFormats.Bitmap);
// 取得した画像の保存
bmp.Save(@"d:\temp\ttt.jpg", ImageFormat.Jpeg);
}

引用返信 編集キー/
■80401 / inTopicNo.2)  Re[1]: Excelの選択範囲をjpgで保存したい(C#)
□投稿者/ 魔界の仮面弁士 (770回)-(2016/07/14(Thu) 19:01:02)
No80400 (くびこ さん) に返信
> Microsoft Visual C# 2010で、Excelの選択範囲をjpgで保存するプログラムを作成中です。
解放処理(RelaseComObject)の観点で問題がありそうなコードですが、その話は脇に置いといて:


> 下記のようにPG中なのですが、★ココの部分で
> dataがnullとなり、その下の行でSystem.NullReferenceExceptionが発生してしまいます。

当方環境では再現しませんでした。

下記で同様の事象が報告されていますが、思い当たる点は無いでしょうか。
https://social.msdn.microsoft.com/Forums/ja-JP/52c6c7b7-6d28-431d-95da-d1daab857acc/clipboardgetdataobjectnull?forum=csharpgeneralja
引用返信 編集キー/
■80406 / inTopicNo.3)  Re: Excelの選択範囲をjpgで保存したい(C#)
□投稿者/ くびこ (2回)-(2016/07/15(Fri) 10:33:58)
2016/07/15(Fri) 10:39:44 編集(投稿者)

No80401 (魔界の仮面弁士 さん) に返信

同様の事象を拝見し、dataがnullとなる原因がわかり解決しました。

Clipboadを使用する場合、STA(Single Thread Apartment)でないといけないのですね。
その指定が無かったため、正常に動作しなかったようです。
[STAThread]
を追記することで正常に動作し、Excelの選択部分をクリップボードにコピーし
それをjpgで保存することができました。

解放処理につきましては、
// workbookを閉じる
WorkBook.Close();

// エクセルを閉じる
ExcelApp.Quit();
のみしていますが、足りないでしょうか?


今回の質問は、初歩的なことが出来ていなかったのが原因ですよね。
C#ははじめたばかりですので、覚えなければならないことが多いですが頑張ります。

魔界の仮面弁士様、ありがとうございました。
とても助かりました!!

解決済み
引用返信 編集キー/
■80416 / inTopicNo.4)  Re[3]: Re: Excelの選択範囲をjpgで保存したい(C#)
□投稿者/ 魔界の仮面弁士 (771回)-(2016/07/16(Sat) 00:31:47)
No80406 (くびこ さん) に返信
>> 解放処理(RelaseComObject)の観点で問題がありそうなコードですが、その話は脇に置いといて:

問題が解決したようなので、解決済みロックはつけたまま、先の話をもう一度持ってきて、と:

> 解放処理につきましては、
(中略)
> のみしていますが、足りないでしょうか?

それをは Excel の終了処理であって、オブジェクトの解放処理とは別ですね。

https://support.microsoft.com/ja-jp/kb/317109
https://blogs.msdn.microsoft.com/office_client_development_support_blog/2012/02/09/office-5/
http://jeanne.wankuma.com/tips/csharp/programming/releasecom.html
http://devlights.hatenablog.com/entry/20100223/p1
解決済み
引用返信 編集キー/
■80455 / inTopicNo.5)  Re[4]: Re: Excelの選択範囲をjpgで保存したい(C#)
□投稿者/ くびこ (3回)-(2016/07/19(Tue) 10:09:31)
No80416 (魔界の仮面弁士 さん) に返信

> それをは Excel の終了処理であって、オブジェクトの解放処理とは別ですね。
>
> https://support.microsoft.com/ja-jp/kb/317109
> https://blogs.msdn.microsoft.com/office_client_development_support_blog/2012/02/09/office-5/
> http://jeanne.wankuma.com/tips/csharp/programming/releasecom.html
> http://devlights.hatenablog.com/entry/20100223/p1

教えていただき、ありがとうございました。
オブジェクトの解放処理を確実に行うようにし、他への影響がないようにしたいと思います。

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


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

このトピックに書きこむ

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

管理者用

- Child Tree -