Avatar billede hugopedersen Nybegynder
03. februar 2010 - 08:11 Der er 4 kommentarer og
1 løsning

Udskrive graf fra Excel ark

Jeg har et Excel regneark som jeg åbner fra mit Delphi program og indsætter nogle værdier i sheet 'Data'. Disse værdier er grundlag for en graf på sheet 'Graph'
Efterfølgende vil jeg gerne udskrive den graf, men der hopper kæden af for mig.
Avatar billede nop Nybegynder
10. februar 2010 - 16:01 #1
Jeg gemmer filen i temp mappen og skriver den ud vha shell:
ShellExecuteW(0,'open',pWideChar(FdestinationName),NIL,NIL,SW_SHOW);

Filnavnet er i FdestinationName strengen.

Alt. i string: ShellExecute(0,'open',pChar(FdestinationName),NIL,NIL,SW_SHOW);

--nop
Avatar billede nop Nybegynder
10. februar 2010 - 16:02 #2
Og så må brugeren selv trykke skriv...
Avatar billede nop Nybegynder
10. februar 2010 - 16:07 #3
Ja, det er så kun halv rigtigt..
Brugeren skal selv trykke skriv.

Det her er tættere på, men mangler parametere til printOut, de andre parametere virker.

procedure print(const sourceName: WideString);
    var
        xls:      _Application;
    begin
        xls:=CoExcelApplication.Create;
        xls.DisplayAlerts[0]:=False;
        xls.Workbooks.Open(sourceName,EmptyParam,EmptyParam,EmptyParam,EmptyParam,
                          EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,
                          EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,0);
        xls.ActiveWorkbook.PrintOut( ? ? ?)
        xls.Quit;
        xls:=nil;
    end;
Avatar billede hugopedersen Nybegynder
04. marts 2010 - 06:55 #4
Resultatet blev:

procedure SaveXLS_Day;
var
  sWorkbook: string;
  xlSheets: Variant;
begin
  sWorkbook := AppDir + conDirectory_Data + conExcel_SMS_Day;
  try
    xlApp := GetActiveOleObject('Excel.Application');
  except
    xlApp := CreateOleObject('Excel.Application');
  end;
  xlApp.Visible := True;

  xlApp.Workbooks.Open(sWorkbook);
  HandleDataDay(sWorkbook); //Fylder tal i Excel arket
  xlSheets := XLApp.Sheets;
  xlSheets.Item['Graph'].Select;
  xlApp.ActiveSheet.ChartObjects(1).Activate;
  xlApp.ActiveSheet.PrintOut;
  xlApp.ActiveWorkBook.Save;
  if not VarIsEmpty(xlApp) then
    begin
      xlApp.DisplayAlerts := False;
      xlApp.Quit;
    end;
end;

Måske ikke så elegant, men det virker. Eneste catch er at jeg ikke kan greje vordan jeg sender printer oplysninger med som jeg normalt gør i VBA for at skrive ud på en betemt printer.
Men det er en detalje.
Avatar billede nop Nybegynder
04. marts 2010 - 09:29 #5
Måske kan du sætte default printer.

procedure SetDefaultPrinter(const PrinterName: String);
var
    I: Integer;
    Device: PChar;
    Driver: PChar;
    Port: PChar;
    HdeviceMode: THandle;
    aPrinter: TPrinter;
begin
    Printer.PrinterIndex := -1;
    GetMem(Device, 255);
    GetMem(Driver, 255);
    GetMem(Port, 255);
    aPrinter := TPrinter.Create;
    try
        for I := 0 to Printer.Printers.Count - 1 do begin
            if Printer.Printers[i] = PrinterName then begin
                aprinter.PrinterIndex := i;
                aPrinter.getprinter(device, driver, port, HdeviceMode);
                StrCat(Device, ',');
                StrCat(Device, Driver);
                StrCat(Device, Port);
                WriteProfileString('windows', 'device', Device);
                StrCopy(Device, 'windows');
                SendMessage(HWND_BROADCAST, WM_WININICHANGE, 0, Longint(@Device));
            end;
        end;
    finally
        aPrinter.Free;
    end;
    FreeMem(Device, 255);
    FreeMem(Driver, 255);
    FreeMem(Port, 255);
end;

Gem evt current først: FtempPrinter:=Printer.Printers[Printer.PrinterIndex];

Og sæt FtempPrinter tilbage bagefter vha: SetDefaultPrinter(FtempPrinter);
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester