フォーラム


ゲスト  

ようこそ ゲスト さん。このフォーラムに投稿するには 登録が必要です。

ページ: [1]
トピック: Excel でコピーした複数の画像を取得
Mr.XRAY
メンバー
投稿数: 192
Excel でコピーした複数の画像を取得
on: 2014/01/17 14:43 Fri

[クリップボードに、複数の画像を出し入れするには?]
http://hpcgi1.nifty.com/MADIA/DelphiBBS/wwwlng.cgi?print+201311/13110026.txt
のレス用記事です.
以下のコードで,エクセルで [コピー] した複数の画像を取得して保存することができます.

  • 取得可能なのは [画像] だけです.下のコードでは [図形] は取得できません.
  • Excel 2007 以降の xlsx 形式のブックのみで可能です.
  • 提示したコードは Delphi XE2 以降専用です.
  • 動作確認環境は,Windows 7 U64(SP1) + Delphi XE2(UP4) + Excel 2010 です.

{$R *.dfm}

//=============================================================================
// Art::GVML Clipformat形式のクリップボードデータの検出と保存
// docxまたはxlsx形式の文書でないと動作不可
//
// ワードの場合
// [挿入][図]はInllineでもInlineでなくとても保存可能
// [挿入][図形](オートシェイプ)はInllineでは保存不可
//
// エクセルの場合
// 画像のみ保存可能
//
// usesにClipbrd, System.Zip, StrUtilsが必要
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
const
CustomDataStr: String = 'Art::GVML Clipformat';
var
zipStream : TMemoryStream;
hBuffer : THandle;
pBuffer : Pointer;
DataFormat : UINT;
ZipClass : TZipFile;
DestFileDir : String;
FileListArr : TArray<string>;
strText : String;
begin
//クリップボードのデータフォーマット形式の値を取得
DataFormat := RegisterClipboardFormat(PChar(CustomDataStr));

if Clipboard.HasFormat(DataFormat) then begin
//その形式だったらクリップボードからZipStreamにデータを取得
zipStream := TMemoryStream.Create;
try
ClipBoard.Open;

hBuffer := Clipboard.GetAsHandle(DataFormat);
pBuffer := GlobalLock(hBuffer);

zipStream.WriteBuffer(pBuffer^, GlobalSize(hBuffer));
zipStream.SaveToFile(ExtractFilePath(Application.ExeName) + 'AAA.zip');
GlobalUnlock(hBuffer);
Clipboard.Close;

//データ(図・画像)の保存先のフォルダを作成
DestFileDir := ExtractFilePath(Application.ExeName) + 'AAA';
ForceDirectories(DestFileDir);

//Art::GVML Clipformat形式はZip形式なのでZipからデータを取出して保存
ZipClass := TZipFile.Create;
try
zipStream.Position := 0;
ZipClass.Open(zipStream, zmRead);
FileListArr := ZipClass.FileNames;
for strText in FileListArr do begin
if ContainsText(StrText, 'clipboard/media/image') then begin
ZipClass.Extract(strText, DestFileDir, False);
end;
end;
finally
ZipClass.Close;
FreeAndNil(ZipClass);
end;
finally
FreeAndNil(zipStream);
end;
end;
end;

    
下の図は,添付のブックで,複数の図形と画像を選択した状態です.

取得しして [AAA] というフォルダに保存された画像です.
図形は取得できません.

上のコードは,[ワードの画像・図形を保存] [選択中の複数の画像または図形を個別の画像で保存]
http://mrxray.on.coocan.jp/Delphi/plWordEx/T_ImageSave.htm#03
の以下の部分を削除したものとなっています.
  //選択したオブジェクトをクリップボードにコピー
  wdfWordApp.Selection.Copy;

Mr.XRAY
メンバー
投稿数: 192
Re: Excel でコピーした複数の画像を取得
on: 2014/01/18 23:29 Sat

>[クリップボードに、複数の画像を出し入れするには?]
>http://hpcgi1.nifty.com/MADIA/DelphiBBS/wwwlng.cgi?print+201311/13110026.txt

のスレッドをご覧になった方への追記です.
上のコードは,2013/12/05(木) 07:56:34 に私がレスしたコードで, if XXXX then begin のネストが少し違うだけです.
後は全て同じです.

ページ: [1]
WP Forum Server by ForumPress | LucidCrew
バージョン: 1.7.5 ; ページロード: 0.029 sec.