PDA

Ver la Versión Completa : grafico excel


valeria
11-12-2008, 19:58:02
hola mi nombre es Valeria ,ando en problemas....necesito importar un grafico de excel a un reporte trate de hacer con lo que sugirieron en los post anteriores pero me tira error...paso a explicar un poco mejor:
tengo un grafico que lo creo con el componente TEXcelChart lo mando al portapapeles pero cuando quiero levantar esta imagen para guardarla en disco me tira error: parte del codigo es la sigueinte:
var
bitmap: TBitMap;
begin
try
bitmap:= TBitmap.Create;
ExcelChart.CopyPicture(100,100,100);
Image6.Picture.RegisterClipboardFormat(cf_BitMap,TBitmap);
self.Image6.Picture.LoadFromClipboardFormat(cf_BitMap,ClipBoard.GetAsHandle(cf_Bitmap),0);
bitmap.LoadFromClipboardFormat(cf_BitMap,ClipBoard.GetAsHandle(cf_Bitmap),0);

en uses pongo ClipBrd pero me tira el sigueinte error:
'Unsupported Clipboard format'...ya no se que mas probar.....tambien trate de usar la instruccion ExcelChart1.Export(ExtractFilePath( Application.ExeName )+ 'Libro.bmp');
pero esta anda para office 2007 pero no para versiones anteriores....les agradeceria mucho si alguien me puede ayudar.....
muchas gracias

coso
12-12-2008, 00:16:33
Hola, el TExcelChart tiene el metodo 'Export' el cual en teoria exporta a un fichero grafico (en teoria, a mi no me ha funcionado). Quiza deberias grabar un gif o bmp temporal y luego cargarlo en tu image. Sobre el formato del clipboard, deberias usar el cf_metafilepict, pues el chart se copia al portapapeles con este formato. Lo malo es que no he encontrado ningun componente que lo soporte :mad:. Dejo aqui este codigo (aunque no me ha funcionado tampoco :confused::confused:)


var
x ,
c : olevariant;
begin
x := CreateOleObject('excel.application');
x.WorkBooks.Open('c:\test.xls');
c := x.WorkBooks[1].WorkSheets[1].ChartObjects[1].Chart;

c.Export('c:\test.GIF','GIF',false);

x.Quit;
end;
y el link (http://support.microsoft.com/kb/163103/es)

saludos, aunque la ayuda sea algo pobre :o

Robert01
12-12-2008, 01:12:41
Hola, podrias usar ese código


unit EG_ClipboardBitmap32;
{
Author William Egge. egge@eggcentric.com
January 17, 2002
Compiles with ver 1.2 patch #1 of Graphics32

This unit will copy and paste Bitmap32 pixels to the clipboard and retain the
alpha channel.

The clipboard data will still work with regular paint programs because this
unit adds a new format only for the alpha channel and is kept seperate from
the regular bitmap storage.
}

interface

uses
ClipBrd, Windows, SysUtils, GR32;

procedure CopyBitmap32ToClipboard(const Source: TBitmap32);
procedure PasteBitmap32FromClipboard(const Dest: TBitmap32);
function CanPasteBitmap32: Boolean;

implementation

const
RegisterName = 'G32 Bitmap32 Alpha Channel';
GlobalUnlockBugErrorCode = ERROR_INVALID_PARAMETER;

var
FAlphaFormatHandle: Word = 0;

procedure RaiseSysError;
var
ErrCode: LongWord;
begin
ErrCode := GetLastError();
if ErrCode <> NO_ERROR then
raise Exception.Create(SysErrorMessage(ErrCode));
end;

function GetAlphaFormatHandle: Word;
begin
if FAlphaFormatHandle = 0 then
begin
FAlphaFormatHandle := RegisterClipboardFormat(RegisterName);
if FAlphaFormatHandle = 0 then
RaiseSysError;
end;
Result := FAlphaFormatHandle;
end;

function CanPasteBitmap32: Boolean;
begin
Result := Clipboard.HasFormat(CF_BITMAP);
end;

procedure CopyBitmap32ToClipboard(const Source: TBitmap32);
var
H: HGLOBAL;
Bytes: LongWord;
P, Alpha: PByte;
I: Integer;
begin
Clipboard.Assign(Source);
if not OpenClipboard(0) then
RaiseSysError
else
try
Bytes := 4 + (Source.Width * Source.Height);
H := GlobalAlloc(GMEM_MOVEABLE and GMEM_DDESHARE, Bytes);
if H = 0 then
RaiseSysError;
P := GlobalLock(H);
if P = nil then
RaiseSysError
else
try
PLongWord(P)^ := Bytes - 4;
Inc(P, 4);
// Copy Alpha into Array
Alpha := Pointer(Source.Bits);
Inc(Alpha, 3); // Align with Alpha
for I := 1 to (Source.Width * Source.Height) do
begin
P^ := Alpha^;
Inc(Alpha, 4);
Inc(P);
end;
finally
if (not GlobalUnlock(H)) then
if (GetLastError() <> GlobalUnlockBugErrorCode) then
RaiseSysError;
end;
SetClipboardData(GetAlphaFormatHandle, H);
finally
if not CloseClipboard then
RaiseSysError;
end;
end;

procedure PasteBitmap32FromClipboard(const Dest: TBitmap32);
var
H: HGLOBAL;
ClipAlpha, Alpha: PByte;
I, Count, PixelCount: LongWord;
begin
if Clipboard.HasFormat(CF_BITMAP) then
begin
Dest.BeginUpdate;
try
Dest.Assign(Clipboard);
if not OpenClipboard(0) then
RaiseSysError
else
try
H := GetClipboardData(GetAlphaFormatHandle);
if H <> 0 then
begin
ClipAlpha := GlobalLock(H);
if ClipAlpha = nil then
RaiseSysError
else
try
Alpha := Pointer(Dest.Bits);
Inc(Alpha, 3); // Align with Alpha
Count := PLongWord(ClipAlpha)^;
Inc(ClipAlpha, 4);
PixelCount := Dest.Width * Dest.Height;
Assert(Count = PixelCount,
'Alpha Count does not match Bitmap pixel Count,
PasteBitmap32FromClipboard(const Dest: TBitmap32);');

// Should not happen, but if it does then this is a safety catch.
if Count > PixelCount then
Count := PixelCount;

for I := 1 to Count do
begin
Alpha^ := ClipAlpha^;
Inc(Alpha, 4);
Inc(ClipAlpha);
end;
finally
if (not GlobalUnlock(H)) then
if (GetLastError() <> GlobalUnlockBugErrorCode) then
RaiseSysError;
end;
end;
finally
if not CloseClipboard then
RaiseSysError;
end;
finally
Dest.EndUpdate;
Dest.Changed;
end;
end;
end;

end.


Necesitas unit GR32 (http://www.g32.org/files/graphics32/graphics32-1_5_1.zip)

Está en Torry's Delphi pages
No lo puedo probar porque no se puede accder al sitio, espero q tengas esa unidad
Saludos


Para probar

uses jpeg;


procedure TForm1.Button1Click(Sender: TObject);
var
bmp: TBitmap32;
begin
bmp := TBitmap32.Create;
try
bmp.LoadFromFile('C:\test.jpg');
CopyBitmap32ToClipboard(bmp);
finally
bmp.Free;
end;
end;

valeria
12-12-2008, 13:07:20
no tengo la unidad GR32...nadie sabe donde la puedo bajar...
gracias por su ayuda....:(

Robert01
13-12-2008, 11:54:11
Hola

de aquí (http://sourceforge.net/project/showfiles.php?group_id=112985&package_id=122211)

Saludos

valeria
15-12-2008, 19:46:26
Muchisimas gracias roberto....pude instalar la unidad...igualmente no se por que cuando trato de compilar me salta error ( tipos incompatibles en la linea Count := PixelCount; ( del procedimiento PasteBitmap32FromClipboard)
trate de usar solo el procedimiento Copybitmap 32 ,osea primero el self.ExcelChart1.CopyPicture();
CopyBitmap32ToClipboard(bmp);
bmp.savetofile('C:\test.jpg');

pero no sirvio de nada no me copio absolutamente nada.,.,no se si necesitaria antes el metodo de pegado....
pero a mi sorpresa me sirvio el metodo de 'Coso' el de export el cual me sirvio no solo para office 2007 sino para 97 para mi sorpresa....mi unica duda ahora si alguien save es como puedo transformar esa imagen gif que guardo en disco a una imagen bmp o metafile...ya que rave soporta estos dos tipos de imagenes....bueno disculpen que sea tan pesada y un millon de gracias

coso
15-12-2008, 20:34:31
No lo he probado, pero creo que si haces

c.Export('c:\test.bmp','bmp',false);


te funcionara. saludos.

valeria
15-12-2008, 22:14:23
Aunque paresca increible no funciona asi....fue lo primero que probe....la verdad que " supuestamente tendria que funcionar" pero bueno es la magia de microsoft....":mad: