Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1

    [DELPHI]: Esportare dati da StringGrid a foglio di Excel

    Salve,
    ho trovato il seguente codice su Planet Source Code che consente di esportare i dati contenuti in un controllo StringGrid in un foglio di Excel:

    codice:
    uses
      ComObj;
    
    function RefToCell(ARow, ACol: Integer): string;
    begin
      Result := Chr(Ord('A') + ACol - 1) + IntToStr(ARow);
    end;
    
    function SaveAsExcelFile(AGrid: TStringGrid; ASheetName, AFileName: string): Boolean;
    const
      xlWBATWorksheet = -4167;
    var
      Row, Col: Integer;
      GridPrevFile: string;
      XLApp, Sheet, Data: OLEVariant;
      i, j: Integer;
    begin
      // Prepare Data
      Data := VarArrayCreate([1, AGrid.RowCount, 1, AGrid.ColCount], varVariant);
      for i := 0 to AGrid.ColCount - 1 do
        for j := 0 to AGrid.RowCount - 1 do
          Data[j + 1, i + 1] := AGrid.Cells[i, j];
      // Create Excel-OLE Object
      Result := False;
      XLApp := CreateOleObject('Excel.Application');
      try
        // Hide Excel
        XLApp.Visible := False;
        // Add new Workbook
        XLApp.Workbooks.Add(xlWBatWorkSheet);
        Sheet := XLApp.Workbooks[1].WorkSheets[1];
        Sheet.Name := ASheetName;
        // Fill up the sheet
        Sheet.Range[RefToCell(1, 1), RefToCell(AGrid.RowCount,
          AGrid.ColCount)].Value := Data;
        // Save Excel Worksheet
        try
          XLApp.Workbooks[1].SaveAs(AFileName);
          Result := True;
        except
          // Error ?
        end;
      finally
        // Quit Excel
        if not VarIsEmpty(XLApp) then
        begin
          XLApp.DisplayAlerts := False;
          XLApp.Quit;
          XLAPP := Unassigned;
          Sheet := Unassigned;
        end;
      end;
    end;
    
    // Example:
    
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      if SaveAsExcelFile(stringGrid1, 'My Stringgrid Data', 'c:\MyExcelFile.xls') then
        ShowMessage('StringGrid saved!');
    end;
    Il mio problema è che purtroppo una colonna della StringGrid contiene numeri di telefono che vengono convertiti automaticamente in valori numerici da Excel.

    Ciò comporta che, quando c'è uno zero all'inizio del numero, questo viene cancellato.

    Ho bisogno, pertanto, di modificare il codice di sopra affinché venga aggiunto un apice all'inizio di ciascun campo della StringGrid prima dell'esportazione in Excel. Tutti i campi, infatti, sono di tipo stringa.

    Qualcuno sa fornirmi indicazioni al riguardo?

    Grazie in anticipo.
    http://www.espositosoftware.it

  2. #2
    Dopo aver selezionato la cella e prima di scriverci il dato dentro prova con

    "XLApp.Selection.NumberFormat := '@';"

    T dovrebbe impostare il formato numerico come testo.


    Ciao

  3. #3
    Originariamente inviato da Nikk11
    Dopo aver selezionato la cella e prima di scriverci il dato dentro prova con

    "XLApp.Selection.NumberFormat := '@';"

    T dovrebbe impostare il formato numerico come testo.


    Ciao
    Grazie per la risposta. Ho provato a mettere la tua riga di codice sopra

    codice:
    Sheet.Range[RefToCell(1, 1), RefToCell(AGrid.RowCount,
    ma il risultato non cambia.

    Devo apportare altre modifiche?

    Thanks again.
    http://www.espositosoftware.it

  4. #4
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,322
    Non è una risposta diretta alla domanda posta, ma se conti di interagire spesso con Excel per svariate esigenze, ti segnalo un set di componenti davvero eccezionali (e rilasciati OpenSource dopo che l'azienda produttrice ha deciso di focalizzare altrove il proprio business): TurboPower OfficePartner.

    C'è anche un PDF con tutta la documentazione.

    Magari offre qualche opzione più maneggevole per ottenere l'effetto richiesto e altre funzionalità.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  5. #5
    Grazie, gli darò senz'altro un'occhiata.

    Ad ogni modo, il codice che ho postato in realtà è più che sufficiente per esportare tutto il contenuto della StringGrid in un file di Excel. L'unica pecca è che non trasforma in automatico tutti i dati in valori testuali.

    Basterebbe riuscire a mettere il segno dell'apostrofo davanti al contenuto delle celle prima di esportarle in Excel per renderle di tipo testuale, ma non sono riuscito a capire come si fa.
    http://www.espositosoftware.it

  6. #6
    RISOLTO!!! Bastava modificare la riga

    codice:
    Data[j + 1, i + 1] := AGrid.Cells[i, j];
    in questo modo:

    codice:
    Data[j + 1, i + 1] := '''' + AGrid.Cells[i, j];
    All the best.
    http://www.espositosoftware.it

  7. #7
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,322
    Non credo che l'apice faccia effettivamente parte del dato della cella, anche se visualizzato; probabilmente, distingue il dato a livello visuale.

    In merito alla porzione di codice

    codice:
    // Fill up the sheet
    Sheet.Range[RefToCell(1, 1), RefToCell(AGrid.RowCount, AGrid.ColCount)].Value := Data;
    forse potresti tentare di utilizzare la proprietà Text al posto di Value.

    codice:
    // Fill up the sheet
    Sheet.Range[RefToCell(1, 1), RefToCell(AGrid.RowCount, AGrid.ColCount)].Text := Data;
    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  8. #8
    In effetti, l'apice che ho aggiunto NON deve fare parte del dato della cella, dato che il mio obiettivo era semplicemente quello di fare in modo che i valori numerici contenuti nella StringGrid per indicare i numeri di telefono si trasformassero in dati testuali in Excel.

    Ho notato che anche le date possono giocare brutti scherzi dato che a volte, in Excel, vengono tradotte automaticamente nel formato americano (mese/giorno/anno anziché giorno/mese/anno). Penso quindi che la presenza dell'apice davanti a tutte le celle sia la soluzione migliore.

    Ciao.
    http://www.espositosoftware.it

  9. #9
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,322
    Hai provato ad usare Text? Ero solo curioso di sapere se sortiva qualche effetto...
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  10. #10
    Originariamente inviato da alka
    Hai provato ad usare Text? Ero solo curioso di sapere se sortiva qualche effetto...
    Sostituendo "Text" a "Value", si ottiene il seguente messaggio di errore: "Impossibile impostare la proprietà Text per la classe Range". Comunque il problema è ora risolto.

    Saluti.
    http://www.espositosoftware.it

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.