Avatar billede anykey Nybegynder
07. november 2002 - 16:31 Der er 10 kommentarer og
1 løsning

ListView til Excel

Hey! Jeg leder efter en funktion/et komponent eller noget helt tredje, der kan eksportere cellerne i et ListView til en excel-fil! Kolonnerne skal også eksporteres!
Jeg ser meget gerne kode-eksempler!

Håber på svar!
/anykey
Avatar billede martinlind Nybegynder
07. november 2002 - 16:37 #1
Du kan bruge de COM servere der er med til delphi, de er lidt tricke at få til at køre men det kan godt lade sig gøre. Du kan også prøve at spørge Jens Borrisholt han har en Classe der kan exportere en Table, det er godt nok ikke en ListView men det kan da være der er noget du kan bruge.

/Martin
Avatar billede anykey Nybegynder
07. november 2002 - 16:48 #2
Jeg er en travl mand og håbede derfor på, at jeg kunne få noget kode med for 200 points. Det ville være helt fint, hvis du kunne spække et eks. med COM-serverne sammen! :o)
/anykey
Avatar billede martinlind Nybegynder
07. november 2002 - 16:52 #3
Jeg er desværre ikke sikker på jeg kan finde det jeg har lavet, men JB's kode var faktisk også ok, så hvis det haster kan du prøve ham.
Avatar billede anykey Nybegynder
07. november 2002 - 16:55 #4
Well.. det haster ikke mere end som så - jeg har desværre bare ikke så meget tid til selv at arbejde på det. Jeg tror, at jeg lader spørgsmålet køre lidt og ser, om der ikke skulle komme lidt flere indlæg...
Men tak for hjælpen :)
Avatar billede pellelil Nybegynder
07. november 2002 - 18:06 #5
Følgende "Snip" er fra et system vi bruger til at modtage vare/prisopdateringer fra vores Leverandører. Den indlæser den (Excel) fil som leverandøren sender og de "linier" den ikke kan fortolke skrives til et "fejl-Excel-fil":

<SNIP>
procedure TImpFilterFileDiasInternExcelItems.ProcessFile(
  ImportOptions: TImportOptions);
var
  InputFile: TextFile;
  //-
  ErrorFileName: String;
  ErrorFileCreated: Boolean;
  ErrorLine: Boolean;
  ErrorLineNo: Integer;
  //-
  InputLine: String;
  TempExportRecord: TTempExportRecord;
  FieldRecordType: Integer;
  FieldEAN: String;
  FieldVareTekst: String;
  FieldKostPris: Currency;
  FieldKolli: Integer;
  FieldSalgsPris: Currency;
  FieldAnbrudsPris: Currency;
  FieldVaregruppeIsenkram: Integer;
  FieldVaregruppeEL: Integer;
  FieldLevVareNr: String;
  FieldHoejde: Integer;
  FieldBredde: Integer;
  FieldDybde: Integer;
  FieldKaedeOpdatPSEL: String;
  FieldKaedeOpdatKopKande: String;
  FieldKaedeOpdatAktive: String;
  qArtInGroup: TQuery;
  OrderGroup: TOrderGroup;
  XlsApp: OleVariant;
  XlsDataWbk: OleVariant;
  XlsDataSheet: OleVariant;
  XlsErrorWbk: OleVariant;
  XlsErrorSheet: OleVariant;
  Row,Col: Integer;
  Value: String;
  CountEOF: Integer;
  TestLine: String;

  Function LogicalEOF: Boolean;
  var
    I: Integer;
    Value: String;
    TmpValue: String;
  begin
    TmpValue := '';
    for I := 1 to 16 do
    begin
      Value := XlsDataSheet.Cells[Row,I].Value;
      TmpValue := TmpValue + Value;
    end;
    if (StrTrimCharRight(StrTrimCharLeft(TmpValue,' '),' ') = '') then Inc(CountEOF)
                                                                  else CountEOF := 0;
    Result := (CountEOF > 10);
  end;

begin
  //---
  ErrorFileCreated := False;
  ErrorFileName := ImportOptions.GenerateErrorFileName(Now, 'XLS');
  ImportOptions.ErrorFileName := '';
  ErrorLineNo := 1;
  //---
  XlsApp := CreateOleObject('Excel.Application');
  try
    XlsDataWbk := XlsApp.WorkBooks.Open(ImportOptions.ImportFile1);
    XlsDataSheet := XlsApp.WorkBooks[1].WorkSheets[1];
    try
      Row := 1;
      CountEOF := 0;
      while not LogicalEOF do
      begin
        ErrorLine := False;
        Value := XlsDataSheet.Cells[Row,1].Value;
        TestLine := Value;
        FieldRecordType := StrToIntSafe(Value);
        Value := XlsDataSheet.Cells[Row,2].Value;
        TestLine := TestLine + Value;
        FieldEAN := StrTrimCharRight(StrTrimCharLeft(StrTrimCharLeft(Value,'0'),' '),' ');
        Value := XlsDataSheet.Cells[Row,3].Value;
        TestLine := TestLine + Value;
        FieldVareTekst := StrTrimCharRight(StrTrimCharLeft(Value,' '),' ');
        Value := XlsDataSheet.Cells[Row,4].Value;
        TestLine := TestLine + Value;
        FieldKostPris := StrToFloatSafe(Value) / 100.0;
        Value := XlsDataSheet.Cells[Row,5].Value;
        TestLine := TestLine + Value;
        FieldKolli := StrToIntSafe(Value);
        Value := XlsDataSheet.Cells[Row,6].Value;
        TestLine := TestLine + Value;
        FieldSalgsPris := StrToFloatSafe(Value) / 100.0;
        if ImportOptions.UseRounding then
        begin
          FieldSalgsPris := ImportOptions.PriceRoundSuppliers.RoundPrice(ImportOptions.SupplierId, FieldSalgsPris);
        end;
        Value := XlsDataSheet.Cells[Row,7].Value;
        TestLine := TestLine + Value;
        FieldAnbrudsPris := StrToFloatSafe(Value) / 100.0;
        Value := XlsDataSheet.Cells[Row,8].Value;
        TestLine := TestLine + Value;
        FieldVaregruppeIsenkram := StrToIntSafe(Value);
        Value := XlsDataSheet.Cells[Row,9].Value;
        TestLine := TestLine + Value;
        FieldVaregruppeEL := StrToIntSafe(Value);
        Value := XlsDataSheet.Cells[Row,10].Value;
        TestLine := TestLine + Value;
        FieldLevVareNr := StrTrimCharRight(StrTrimCharLeft(Value,' '),' ');
        Value := XlsDataSheet.Cells[Row,11].Value;
        TestLine := TestLine + Value;
        FieldHoejde := StrToIntSafe(Value);
        Value := XlsDataSheet.Cells[Row,12].Value;
        TestLine := TestLine + Value;
        FieldBredde := StrToIntSafe(Value);
        Value := XlsDataSheet.Cells[Row,13].Value;
        TestLine := TestLine + Value;
        FieldDybde := StrToIntSafe(Value);
        Value := XlsDataSheet.Cells[Row,14].Value;
        TestLine := TestLine + Value;
        FieldKaedeOpdatPSEL := AnsiUpperCase(Value);
        Value := XlsDataSheet.Cells[Row,15].Value;
        TestLine := TestLine + Value;
        FieldKaedeOpdatKopKande := AnsiUpperCase(Value);
        Value := XlsDataSheet.Cells[Row,16].Value;
        TestLine := TestLine + Value;
        FieldKaedeOpdatAktive := AnsiUpperCase(Value);
        TestLine := StrRemoveChars(TestLine, [' ']);
        if Length(TestLine) > 0 then
        begin
          if HasMandatoryFields(FieldRecordType, FieldEAN, FieldVareTekst, FieldKostPris, FieldKolli,
                                FieldSalgsPris, FieldAnbrudsPris, FieldVaregruppeIsenkram,
                                FieldVaregruppeEL, FieldLevVareNr, FieldHoejde, FieldBredde,
                                FieldDybde, FieldKaedeOpdatPSEL, FieldKaedeOpdatKopKande,
                                FieldKaedeOpdatAktive) then
          begin
            TempExportRecord := ImportOptions.ImpFilter.TempExportBuffer.FindEAN(FieldEAN);
            if Assigned(TempExportRecord) then
            begin
              ImportOptions.MemoProgress.Lines.Add('Gen-Indlæser oplysninger for: '+FieldEAN);
            end else begin
              TempExportRecord := ImportOptions.ImpFilter.TempExportBuffer.AddEAN(FieldEAN);
              ImportOptions.MemoProgress.Lines.Add('Indlæser oplysninger for: '+FieldEAN);
            end;
            with TempExportRecord do
            begin
              Recordtype := FieldRecordType;
              Varetekst := FieldVareTekst;
              Kostpris := FieldKostPris;
              Kolli := FieldKolli;
              Salgspris := FieldSalgsPris;
              if ImportOptions.UseRounding then
              begin
                SalgsPris := ImportOptions.PriceRoundSuppliers.RoundPrice(ImportOptions.SupplierId, SalgsPris);
              end;
              Anbrudspris := FieldAnbrudsPris;
              VaregruppeIsenkram := FieldVaregruppeIsenkram;
              VaregruppeEL := FieldVaregruppeEL;
              LevVareNr := FieldLevVareNr;
              Hoejde := FieldHoejde;
              Bredde := FieldBredde;
              Dybde := FieldDybde;
              KaedeOpdatPSEL := (AnsiUpperCase(FieldKaedeOpdatPSEL) = 'J');
              KaedeOpdatKopKande := (AnsiUpperCase(FieldKaedeOpdatKopKande) = 'J');
              KaedeOpdatAktive := (AnsiUpperCase(FieldKaedeOpdatAktive) = 'J');
              if ImportOptions.UseExcludeArticleGroups then
              begin
                qArtInGroup := TQuery.Create(Nil);
                qArtInGroup.DatabaseName := DataModuleSBoss2Paradox.dbSBoss2Paradox.DatabaseName;
                qArtInGroup.SQL.Text := 'SELECT ARTICLES.OrderGroup,' + #13#10 +
                                        'ArticlesPLUNumbers.PLU' + #13#10 +
                                        'FROM ArticlesPLUNumbers'  + #13#10 +
                                        'INNER JOIN ARTICLES ON (ArticlesPLUNumbers.MasterId = ARTICLES.ArticleId)' + #13#10 +
                                        'WHERE ArticlesPLUNumbers.PLU = ' + Chr(39) +
                                        StrStripNonNumberChars(FieldEAN) + Chr(39);
                try
                  qArtInGroup.Open;
                  if qArtInGroup.RecordCount > 0 then begin
                    OrderGroup := TOrderGroup(ImpFixSettings.OrderGroups.LocateOrderGroupID(qArtInGroup.FieldByName('OrderGroup').AsInteger));
                    if Assigned(OrderGroup) then
                    begin
                      if OrderGroup.Checked then ExcludeCode := 1;
                    end;
                  end;
                finally
                  qArtInGroup.Close;
                  qArtInGroup.Free;
                end;
              end;
            end;
          end else ErrorLine := True;
        end;
        if ErrorLine then
        begin
          if not(ErrorFileCreated) then
          begin
            ErrorFileCreated := True;
            XlsErrorWbk := XlsApp.WorkBooks.Add;
            XlsErrorSheet := XlsApp.WorkBooks[2].WorkSheets[1];
            ImportOptions.ErrorFileName := ErrorFileName;
          end;
          for Col := 1 to 16 do
          begin
            Value := XlsDataSheet.Cells[Row,Col].Value;
            XlsErrorSheet.Cells[ErrorLineNo,Col].Value := Value;
            {
            XlsErrorSheet.Cells[ErrorLineNo,Col].Font.Bold := XlsDataSheet.Cells[Row,Col].Font.Bold;
            XlsErrorSheet.Cells[ErrorLineNo,Col].Font.Size := XlsDataSheet.Cells[Row,Col].Font.Size;
            XlsErrorSheet.Cells[ErrorLineNo,Col].Font.Color := XlsDataSheet.Cells[Row,Col].Font.Color;
            XlsErrorSheet.Cells[ErrorLineNo,Col].Interior.Color := XlsDataSheet.Cells[Row,Col].Interior.Color;
            XlsErrorSheet.Cells[ErrorLineNo,Col].NumberFormat := XlsDataSheet.Cells[Row,Col].NumberFormat;
            }
          end;
          inc(ErrorLineNo);
        end;
        Inc(Row);
      end;
    finally
      if ErrorFileCreated then
      begin
        XlsErrorWbk.SaveAs(ErrorFileName,,,,,,,,);
        ImportOptions.MemoProgress.Lines.Add('***** FEJL***** : '+ErrorFileName);
      end;
      XlsApp.WorkBooks.Close;
    end;
  finally
    XlsApp.Application.Quit;
  end;
end;
</SNIP>
Avatar billede borrisholt Novice
08. november 2002 - 08:03 #6
Hvis du har en DataBase så kan jeg Xportere det for dig ...

UDEN du har Excel på din maskine :-)

Jens B
Avatar billede pellelil Nybegynder
08. november 2002 - 09:36 #7
borrisholt> via ADO kan du rent faktisk også tage-fat i en Excel-fil, men jeg er ikke 100% sikker på hvorvidt Excel i så fald skal være på maskinen !?
Avatar billede borrisholt Novice
08. november 2002 - 09:40 #8
Det skal den .. :-)

Det andet kræver en ægte heste hacker, og ikke bare en Wanna-Be Hest !

Jens B
Avatar billede pellelil Nybegynder
08. november 2002 - 16:06 #9
LOL - Du ka' sgu selv være en "Wanna-Be Hest"
Avatar billede anykey Nybegynder
11. februar 2003 - 22:26 #10
Hmm.. Øhm.. tror bare, jeg lukker det her spørgsmål ;O) - fik ikke rigtig noget brugbart ud af det
Avatar billede borrisholt Novice
12. februar 2003 - 08:03 #11
anykey >> Nøh og du bad aldrig om det kode jeg havde ...
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