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

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

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

Re[5]: 教えてください!!


(過去ログ 89 を表示中)

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

■53217 / inTopicNo.1)  教えてください!!
  
□投稿者/ なつき (1回)-(2010/09/07(Tue) 11:37:43)

分類:[.NET 全般] 

エクセルに画像を貼り付けたいのですが、Excel.xxx型を使わない方法ってありますか??

引用返信 編集キー/
■53218 / inTopicNo.2)  Re[1]: 教えてください!!
□投稿者/ shu (10回)-(2010/09/07(Tue) 12:24:39)
2010/09/07(Tue) 12:30:41 編集(投稿者)


No53217 (なつき さん) に返信
> エクセルに画像を貼り付けたいのですが、Excel.xxx型を使わない方法ってありますか??
>
Excel参照設定しないで使いたいってことですか?目的がよくわからなのでそう解釈します。

Dim objExcel = CreateObject("Excel.Application")
Dim objBooks = OBjProperty(objExcel, "Workbooks")
Dim objBook = ObjInvoke(objBooks, "Add")
Dim objSheets = OBjProperty(objBook, "Sheets")
Dim objSheet = OBjProperty(objBook, "ActiveSheet")
Dim objPictures = ObjProperty(objSheet, "Pictures")
Dim objPicture = ObjInvoke(objPictures, "Insert", "画像ファイル名")
OBjProperty(objExcel , "DisplayAlerts") = False
ObjInvoke(objBook, "SaveAs", "Excelファイル名")
OBjProperty(objExcel , "DisplayAlerts") = true

OBjProperty(objExcel , "DisplayAlerts") = False
ObjInvoke(objExcel , "Quit")

Marshal.ReleaseComObject(objPicture)
Marshal.ReleaseComObject(objPictures)
Marshal.ReleaseComObject(objSheet)
Marshal.ReleaseComObject(objSheets)
Marshal.ReleaseComObject(objBook)
Marshal.ReleaseComObject(objBooks)
Marshal.ReleaseComObject(objExcel)

大体こんな感じかな?
以下はObjInvoke,OBjPropertyの定義

Public Property OBjProperty(ByVal obj As Object, ByVal PropName As String, ByVal ParamArray args() As Object) As Object
Get
Try
Dim tpObj = obj.GetType

Return tpObj.InvokeMember(PropName, BindingFlags.GetProperty, Nothing, obj, args)
Catch ex As Exception
Return Nothing
End Try
End Get
Set(ByVal value As Object)
Try
Dim tpObj = obj.GetType
tpObj.InvokeMember(PropName, BindingFlags.SetProperty, Nothing, obj, New Object() {value})
Catch ex As Exception
End Try
End Set
End Property

Public Function ObjInvoke(ByVal obj As Object, ByVal MethodName As String, ByVal ParamArray args() As Object) As Object
Try
Dim tpObj = obj.GetType

Return tpObj.InvokeMember(MethodName, BindingFlags.InvokeMethod, Nothing, obj, args)
Catch ex As Exception
Return Nothing
End Try
End Function


引用返信 編集キー/
■53219 / inTopicNo.3)  Re[2]: 教えてください!!
□投稿者/ なつき (3回)-(2010/09/07(Tue) 13:01:18)
2010/09/07(Tue) 13:50:23 編集(投稿者)
2010/09/07(Tue) 13:50:18 編集(投稿者)
No53218 (shu さん) に返信
> 2010/09/07(Tue) 12:30:41 編集(投稿者)
>
返信ありがとうございます。

>Excel参照設定しないで使いたいってことですか?目的がよくわからなのでそう解釈します。
既存ソースでは、object型で宣言していましたので、「Excel.xxx型を使わない方法」を知りたかったんです。
説明不足ですみません。途中まで、他のサイトを引用して作成したんですが、画像貼り付けの部分がわからなかったので
投稿しました。

private void ExcelBtn_Click(object sender, EventArgs e)
{
object xlsApp = null;
object xlsBooks = null;
object xlsBook = null;
object xlsSheets = null;
object xlsSheet = null;
object xlsRange = null;
object xlsShapes = null;
object xlsShape = null;

// Excelファイルのパス
string xlsPath = @"xxx\uuu.xls";

// Excelのクラスのタイプとインスタンスを取得する
Type objClassType;

objClassType = Type.GetTypeFromProgID("Excel.Application");
xlsApp = Activator.CreateInstance(objClassType);
// xlsApp = CreateObject("Excel.Application");

//ワークブックコレクションオブジェクト
xlsBooks = xlsApp.GetType().InvokeMember("Workbooks", BindingFlags.GetProperty, null, xlsApp, null);

//Excelファイルのオープン
xlsBook = xlsBooks.GetType().InvokeMember("Open", BindingFlags.InvokeMethod, null,xlsBooks,
new object[] { xlsPath
, Type.Missing
, Type.Missing
, Type.Missing
, Type.Missing
, Type.Missing
, Type.Missing
, Type.Missing
, Type.Missing
, Type.Missing
 , Type.Missing
 , Type.Missing
 , Type.Missing});

  xlsSheets = xlsBook.GetType().InvokeMember("WorkSheets", BindingFlags.GetProperty, null, xlsBook, null);
  xlsSheet = xlsSheets.GetType().InvokeMember("Item", BindingFlags.GetProperty, null, xlsSheets, new object[]   { 1 });
  xlsRange = xlsSheet.GetType().InvokeMember("Range", BindingFlags.GetProperty, null, xlsSheet, new object[]   { "A1" });
  string a1 = (string)xlsRange.GetType().InvokeMember("Value", BindingFlags.GetProperty, null, xlsRange,     null);
  MessageBox.Show(xlsShapes.ToString());

  xlsRange = xlsSheet.GetType().InvokeMember("Range", BindingFlags.GetProperty, null, xlsSheet, new object[]   { "B1" });
  string b1 = (string)xlsRange.GetType().InvokeMember("Value", BindingFlags.GetProperty, null, xlsRange,     null);
  MessageBox.Show(b1);
}
引用返信 編集キー/
■53220 / inTopicNo.4)  Re[3]: 教えてください!!
□投稿者/ shu (11回)-(2010/09/07(Tue) 13:12:56)
No53219 (なつき さん) に返信
合ってたみたいですね。

ここです
> Dim objPictures = ObjProperty(objSheet, "Pictures")
> Dim objPicture = ObjInvoke(objPictures, "Insert", "画像ファイル名")
画像はRange関係ないです。シートのPicturesプロパティにInsertすれば良いです。後は位置の移動が必要になると思います。
Excelにはマクロ記録があるのでやりたいことをマクロ記録すれば、だいたい処理が
分かりますよ。
引用返信 編集キー/
■53221 / inTopicNo.5)  Re[4]: 教えてください!!
□投稿者/ なつき (4回)-(2010/09/07(Tue) 13:35:19)
No53220 (shu さん) に返信
> ■No53219 (なつき さん) に返信
> 合ってたみたいですね。
>
> ここです
>>Dim objPictures = ObjProperty(objSheet, "Pictures")
>>Dim objPicture = ObjInvoke(objPictures, "Insert", "画像ファイル名")
> 画像はRange関係ないです。シートのPicturesプロパティにInsertすれば良いです。後は位置の移動が必要になると思います。
> Excelにはマクロ記録があるのでやりたいことをマクロ記録すれば、だいたい処理が
> 分かりますよ。
ありがとうございます。でも、このままくっつけたらエラーになりました。(Dimが見つかりませんなど・・・)
どこを置き換える必要がありますか??
引用返信 編集キー/
■53223 / inTopicNo.6)  Re[5]: 教えてください!!
□投稿者/ shu (12回)-(2010/09/07(Tue) 13:44:39)
No53221 (なつき さん) に返信
VB.NETなのでC#化する必要があります。VBソース全然読めないとExcelのマクロもちょっときついですね。
objPicturesの取得は xlsSheetsの取得と同じように
objPictures = xlsSheet.GetType().InvokeMember("Pictures", BindingFlags.GetProperty, null, xlsSheet, null);
です。

objPictureの取得は
objPicture = objPictures.GetType().InvokeMember("Insert", BindingFlags.InvokeMethod, null,objPictures,
new object[] { "ファイル名"});
です。

GetType.Invokemember(〜)をいちいち記述するのが大変なので私はObjProperty,ObjInvokeを用意してます。
引用返信 編集キー/
■53225 / inTopicNo.7)  Re[5]: 教えてください!!
□投稿者/ 魔界の仮面弁士 (1797回)-(2010/09/07(Tue) 15:26:28)
No53221 (なつき さん) に返信
> でも、このままくっつけたらエラーになりました。(Dimが見つかりませんなど・・・)
C# での回答を望むなら、最初の質問時に、
 分類:[.NET 全般]
ではなく、
 分類:[C#]
を選択しておいた方が良かったですね。

> どこを置き換える必要がありますか??
.NET Framework 4 だとこんな感じで書けます。

手元に VS2010 が無かったので、メモ帳でコーディング + 手動コンパイルです。

// ファイル名
//   C:\sample.cs
// コンパイル コマンドライン
//   %WINDIR%\Microsoft.NET\Framework\v4.0.30319\CSC.exe /out:C:\sample.exe C:\sample.cs

using System;
using System.Drawing;
using System.Runtime.InteropServices;

public class Sample {
  public static void Main() {
    string xlsPath = @"C:\book1.xls";
    string imgPath = @"C:\sample.png";

    Rectangle rect = new Rectangle(10, 10, 300, 300);

    Console.Write("Excel を起動します。Enter を押してください。");
    Console.ReadLine();

    var t = Type.GetTypeFromProgID("Excel.Application");
    dynamic xlsApp = Activator.CreateInstance(t);
    xlsApp.Visible = true;
    dynamic xlsBooks  = xlsApp.Workbooks;
    dynamic xlsBook   = xlsBooks.Open(xlsPath);
    dynamic xlsSheets = xlsBook.Worksheets;
    dynamic xlsSheet  = xlsSheets[1];
    dynamic xlsShapes = xlsSheet.Shapes;

    Console.Write("画像を貼り付けます。Enter を押してください。");
    Console.ReadLine();

    dynamic xlsShape = xlsShapes.AddPicture(imgPath, false, true,
      rect.Left, rect.Top, rect.Width, rect.Height);

    Console.Write("貼り付けました。保存して終了します。Enter を押してください。");
    Console.ReadLine();

    xlsBook.Save();
    if(Marshal.IsComObject(xlsShape )) Marshal.ReleaseComObject(xlsShape );
    if(Marshal.IsComObject(xlsShapes)) Marshal.ReleaseComObject(xlsShapes);
    if(Marshal.IsComObject(xlsSheet )) Marshal.ReleaseComObject(xlsSheet );
    if(Marshal.IsComObject(xlsSheets)) Marshal.ReleaseComObject(xlsSheets);
    if(Marshal.IsComObject(xlsBook  )) Marshal.ReleaseComObject(xlsBook  );
    if(Marshal.IsComObject(xlsBooks )) Marshal.ReleaseComObject(xlsBooks );
    xlsApp.Quit();
    if(Marshal.IsComObject(xlsApp   )) Marshal.ReleaseComObject(xlsApp   );

    Console.Write("終了しました。Enter を押してください。");
    Console.ReadLine();
  }
}

引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -