Avatar billede hmann Nybegynder
09. januar 2004 - 13:40 Der er 8 kommentarer og
1 løsning

Delphi + excel

Hej,

er der nogen der kan hjælpe mig med at åbne en .csv fil i excel fra delphi 7?

jeg har en semikolon-separeret tekstfil (.csv) til rådighed!
jeg vil nu gerne fra mit delphi-program åbne Excel og få Excel til at åbne min .csv fil!

har kigget under fanebladet servers og set der ligger noget som hedder TExcelApplication og ExcelOLEObject, men er på rimelig bar bund på dette område...

any ideas?
Avatar billede hmann Nybegynder
09. januar 2004 - 13:48 #1
og hvad nu hvis man vil have dataene fra tekst filen ind i et eksisterende excel-dokument?

altså lidt ligesom hvis man importerede data fra en tekstfil ind i et regneark.
Avatar billede martinlind Nybegynder
09. januar 2004 - 14:08 #2
Du kan godt styre excel fra delphi med TExcelapp. men det er et pille arb. noget med "try and try"
Avatar billede hmann Nybegynder
09. januar 2004 - 14:15 #3
er i fuldt gang med at pille :)
har fundet ud af hvordan man læser sin fil ind - er nu igang med at se hvordan man manipulerer de forskellige cells og deres indhold!
Avatar billede pzw Nybegynder
09. januar 2004 - 14:24 #4
Jeg har lige lavet et delphi program som generere et Excel dokument med mange Sheets, som indeholder variable, headers, formateringskoder og lignende. Har dog ingen erfaring med import af tekstfiler.
Hvis du er intereseret kan jeg lave et simpelt eksempel, men du skal selv gætte dig til hvordan koderne til import virker vha. at indspille macro i Excel.
Læg en beked hvis du vil have eksemplet.
Hvad med en macro i Excel som udfører det du ønsker ? Det er meget lættere.
//PZ
Avatar billede hmann Nybegynder
12. januar 2004 - 13:07 #5
det skal være igennem delphi desværre, men jeg har brugt makroer til at se hvilke parametre der bliver sat når man importerer tekstfiler.. og så prøvet at "efterligne" makroen i delphi igennem noget automation OLE-halløj!

jeg har fundet ud af hvordan man vha automation åbner excel fra delphi og åbner workbooks og worksheets og manipulerer tal/formler/celler, men jeg vil da gerne se dit eksempel - det kan være der er et eller andet jeg kan bruge!

/HMAnn
Avatar billede pzw Nybegynder
12. januar 2004 - 15:19 #6
Hej HMAnn

Hermed eksempel.
Fejlcheck kan jeg ikke finde ud af, men jeg har lavet et større program som bruges internt i et firma og det fungerer fejlfrit.
Du kan jo læse din .CSV fil som text fil og derefter generere excel filen.
Hvis det er en større sag så pas på med hastigheden, meget generelt kan man regne med at et kald tager lige lang tid uanset hvor mange celler der er involveret.

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,
  ComObj;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

const
  xlThick = $00000004;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
  Var
    Excel: OleVariant;
    Range: OleVariant;

begin
    Excel:=CreateOleObject('Excel.Application');
    Excel.WorkBooks.Add;
    Excel.Visible:=False;
    Excel.DisplayAlerts:=False;

    Range:=Excel.Sheets[1].Range['A1'];
    Range.FormulaR1C1:='Hest';

    Range:=Excel.Sheets[1].Range['C3:G6'];
    Range.MergeCells:= True;
    Range.FormulaR1C1:='Stor hest';
    Range.Borders.Weight :=xlThick;
    Range.Font.Name:= 'Ariel';
    Range.Font.Size:= 30;
    Range.Font.Bold:= True;

    Excel.ActiveWorkbook.SaveAs('C:\TestFil.xls');
    Excel.WorkBooks.Close;
    Excel.Quit;
    Excel:=Unassigned;

    Showmessage('Færdig !!!');
end;

end.

//PZ
Avatar billede hmann Nybegynder
13. januar 2004 - 09:45 #7
okay takker, alt det havde jeg nu fundet ud af...
mit problem er ikke at åbne en workbook/et worksheet.
det er heller ikke at skrive data i en workbook!

problemet er at åbne i excel fil ind i en åben fil hvis du forstår?
altså så den ikke åbnes som en ny workbook, men at dataene i filen loades ind i den allerede åbne workbook - som når man importerer data i excel!
Avatar billede pzw Nybegynder
13. januar 2004 - 15:37 #8
Hej
Jeg har udelukkende oprettet en ny Excel fil eller arbejdet videre på en eksisternede Excel fil som ikke er åben.
Har aldrig overført data til en Excel fil som en bruger har åbnet først.
//PZ
Avatar billede hmann Nybegynder
15. januar 2004 - 11:38 #9
Hvis nogen er interesset har jeg fundet en metode til at hente data fra en given .csv-fil ind i en åbent excelfil.. eksemplet tager udgangspunkt i at .csv-filen er kommasepareret.. hvis man som jeg har en semikolon-separeret, skal man bruge delimitedtext property'en istedet for commatext property'en som er brugt i nedenstående eksempel!

lukker....

her er et svar fra experts-exchange.com:
-----------------------------------------------------

OpenText will open a new work sheet, so it isn't really what your after. You could use the QueryTables to import the data, but it is fairly simple if you just want to work with the range object. The example (function) below loads a CSV file, calculates the rows and columns, and then imports this data into your worksheet exactly where you want it (say for example, at cell A1).

Hope this helps,
Russell

*****

procedure MergeCSVFile(WorkSheet: Variant; StartCell: String; FileName: String);
var  Range:      Variant;
    tsFile:    TStringList;
    tsLine:    TStringList;
    vaRange:    Variant;
    dwCount:    Integer;
    dwRows:    Integer;
    dwCols:    Integer;
    dwRow:      Integer;
    dwCol:      Integer;

    function Max(I1, I2: Integer): Integer;
    begin
        if (I1 > I2) then
          result:=I1
        else
          result:=I2;
    end;

begin

  // Create string lists to the hold the file and one to parse the lines in the file
  tsFile:=TStringList.Create;
  tsLine:=TStringList.Create;
  try
    // Attempt to load the file
    tsFile.LoadFromFile(FileName);
    // Calculate the number of rows and max columns in the file
    dwRows:=0;
    dwCols:=0;
    // Iterate the lines
    for dwCount:=0 to Pred(tsFile.Count) do
    begin
        // Check for blank lines which will not get included
        if (Length(Trim(tsFile[dwCount])) > 0) then
        begin
          // Increment the row count
          Inc(dwRows);
          // Clear the line parser
          tsLine.Clear;
          // Set the comma text
          tsLine.CommaText:=tsFile[dwCount];
          // Get the max column count
          dwCols:=Max(dwCols, tsLine.Count);
        end;
    end;
    // If no rows or cols then nothing to do
    if (dwRows > 0) and (dwCols > 0) then
    begin
        // Create variant array to hold the range data
        vaRange:=VarArrayCreate([0, Pred(dwRows), 0, Pred(dwCols)], varVariant);
        try
          // Fill the array in
          dwRow:=0;
          for dwCount:=0 to Pred(tsFile.Count) do
          begin
              // Break if row count has been hit
              if (dwRow = dwRows) then break;
              // Check for blank lines which will not get included
              if (Length(Trim(tsFile[dwCount])) > 0) then
              begin
                // Clear the line parser
                tsLine.Clear;
                // Set the comma text
                tsLine.CommaText:=tsFile[dwCount];
                // Set the columns
                for dwCol:=0 to Pred(dwCols) do
                begin
                    if (dwCol >= tsLine.Count) then
                      vaRange[dwRow, dwCol]:=''
                    else
                      vaRange[dwRow, dwCol]:=tsLine[dwCol];
                end;
                // Increment the row counter
                Inc(dwRow);
              end;
          end;
          // Get the range and resize it
          Range:=WorkSheet.Range[StartCell].Resize[dwRows, dwCols];
          // Set the variant array data to the desired range
          Range.Value:=vaRange;
        finally
          // Clear the variant data
          VarClear(vaRange);
        end;
    end;
  finally
    // Free the string lists
    tsLine.Free;
    tsFile.Free;
  end;

end;

procedure TForm1.Button1Click(Sender: TObject);
var  OleApplication:  Variant;
    OleWorkBook:      Variant;
    OleWorkSheet:    Variant;
begin

  OleApplication:=CreateOleObject('Excel.Application');
  OleApplication.Visible:=True;
  OleWorkBook:=OleApplication.Workbooks.open('c:\temp\book1.xls');
  OleWorkSheet:=OleApplication.ActiveSheet;

  // Param1 - Worksheet to import data into
  // Param2 - Upper/Left cell to start the import at
  // Param3 - CSV file to import in

  MergeCSVFile(OleWorkSheet, 'A2', 'c:\temp\test.csv');

  OleApplication.Quit;
  OleApplication:=Unassigned;

end;



------------------------------------------------
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