+ Rispondi al messaggio
Visualizzazione dei risultati da 1 a 2 su 2

Creare file di testo, Word e Excel da Delphi (arrivando da VBA)

  1. #1
    kar64 non è in linea Scolaretto
    Salve a tutti.
    Sono un programmatore (amatoriale) di vb (soprattutto vba excel e access 2003).
    Vorrei iniziare con un nuovo linguaggio e guardando un po' in giro e sentendo un po' di consigli di amici, sono arrivato alla conclusione che quello giusto è proprio delphi.
    Cosi' ho scaricato l'ultima versione di delphi XE3 (e per 30 giorni posso provarla).
    Avrei pensato come prima base per imparare, cercare di riscrivere un breve programma (attualmente in vba access) in delphi.
    Di seguito vi posto alcune linee di codice del mio prg:

    Public Function comp_i4()
    On Error GoTo i4_err
    
    'evidenzio il tab relativo
    TabCtl100.Value = 2
    
    ic = ""
    If tipo_attivita = "I" Then
       ic = "I4"
    Else
       ic = "A6"
    End If
    
    Set objWorksheet = objWorkbook.Worksheets(ic)
    objWorkbook.Worksheets(ic).Select
    If i4neg = True Then
      If tipo_attivita = "I" Then
          objWorksheet.Cells(47, 2).Value = "N E G A T I V O"
      Else
          objWorksheet.Cells(38, 2).Value = "N E G A T I V O"
    End If
    comp_i4 = True
    Exit Function
    End If
       
    filedacercare = ""
    filedacercare = (Trim(Testo99.Value & "")) + "\" + (Trim(tab4.Value & ""))
    If Len(Trim(tab4.Value & "")) <> 0 And FileEsiste3(filedacercare) = True Then
      Close #4
      Open Trim(filedacercare) For Input As #4
      ri4 = 0
       If tipo_attivita = "I" Then
         riga = 10
       Else
         riga = 12
       End If
       Do While Not EOF(4)
       ri4 = ri4 + 1
        Line Input #4, RigaTesto
       ' se compreso nell'intervallo è ok
        If ri4 >= rig4in And ri4 <= rig4fi Then
       ' finito
        If (InStr(RigaTesto, "T O T A L E") <> 0) Then
           comp_i4 = True
           GoTo uscita4
        End If
       ' E' una riga che interessa
       If Mid(RigaTesto, 26, 4) = "1234" Then
          riga = riga + 1
          ' Ho superato le righe disponibili !!
           If riga > 33 Then
            MsgBox "Attenzione !! Non posso più scrivere righe sul foglio 4.", vbCritical
            comp_i4 = False
            Exit Function
           End If
        ' estraggo i dati 1
         objWorksheet.Cells(riga, 2).Font.Size = 9
         objWorksheet.Cells(riga, 2).HorizontalAlignment = xlCenter
         objWorksheet.Cells(riga, 2).Value = Mid(RigaTesto, 37, 11)
        ' estraggo i dati 2
         objWorksheet.Cells(riga, 3).Font.Size = 9
         objWorksheet.Cells(riga, 3).HorizontalAlignment = xlRight
         objWorksheet.Cells(riga, 3).Value = Mid(RigaTesto, 12, 8)
        ' estraggo i dati 3
         If Len(Trim(Mid(RigaTesto, 72, 11))) <> 0 Then
           objWorksheet.Cells(riga, 5).Font.Size = 9
           objWorksheet.Cells(riga, 5).HorizontalAlignment = xlRight
           objWorksheet.Cells(riga, 5).Value = CDbl(Mid(RigaTesto, 72, 12))
         Else
           objWorksheet.Cells(riga, 5).Font.Size = 9
           objWorksheet.Cells(riga, 5).HorizontalAlignment = xlRight
           objWorksheet.Cells(riga, 5).Value = 0
         End If
         Line Input #4, RigaTesto
         ' intestazione
         objWorksheet.Cells(riga, 4).Font.Size = 9
         objWorksheet.Cells(riga, 4).HorizontalAlignment = xlLeft
         objWorksheet.Cells(riga, 4).Value = Mid(RigaTesto, 3, 25)
         ' data
         if Len(Trim(Mid(RigaTesto, 60, 10))) <> 0 Then
            objWorksheet.Cells(riga, 1).Font.Size = 9
            objWorksheet.Cells(riga, 1).HorizontalAlignment = xlCenter
            objWorksheet.Cells(riga, 1).NumberFormat = "dd/mm/yy;@"
            objWorksheet.Cells(riga, 1).Value = CDate(Mid(RigaTesto, 60, 10))
         End If
    End If
    End If
    Loop
    comp_i4 = True
    End If
    
    uscita4:
    If tipo_attivita = "I" Then
        If riga = 10 Then
            objWorksheet.Cells(47, 2).Value = "N E G A T I V O"
            comp_i4 = True
            Exit Function
        End If
    Else
        If riga = 12 Then
            objWorksheet.Cells(38, 2).Value = "N E G A T I V O"
            comp_i4 = True
            Exit Function
        End If
    End If
    
    Exit Function
    
    i4_err:
    MsgBox Err.Number & Err.Description
    comp_i4 = False
    Call chiudi_excel
    Set appExcel = Nothing
    Exit Function
    End Function
    
    
    ------------------------------------------------------------------------------
    
    scrivi_ga234:
    If t3neg = True Then
    ' file TXT esiste ma non ci sono dati dentro
        nomefiletab = ""
        nomefiletab = (Trim(Testo99.Value & "")) + "\" + Right("000" + Trim(CasellaCombinata34), 3) + "_G4.DOC"
    
        objWord.Documents.Add
        objWord.Visible = False
       
        objWord.Selection.Font.Name = "Courier New"
        objWord.Selection.Font.Size = 8
        objWord.Selection.PageSetup.Orientation = wdOrientLandscape
    
        ' non controlla gli errori ortografici
        objWord.Options.CheckGrammarAsYouType = False
        objWord.ActiveDocument.ShowGrammaticalErrors = False
    
        ' intestazione di pagina
        objWord.ActiveWindow.ActivePane.View.SeekView = wdSeekCurrentPageHeader
        objWord.Selection.ParagraphFormat.Alignment = wdAlignParagraphCenter
        objWord.Selection.Font.Name = "Courier New"
        objWord.Selection.Font.Size = 7
        objWord.Selection.Font.Bold = True
        objWord.Selection.TypeText Text:="Estrazione del " & Testo188.Value
        objWord.ActiveWindow.ActivePane.View.SeekView = wdSeekMainDocument
       
        objWord.Selection.ParagraphFormat.Alignment = wdAlignParagraphCenter
        objWord.Selection.Font.Name = "Courier New"
        objWord.Selection.Font.Size = 14
        objWord.Selection.Font.Bold = True
           
        objWord.Selection.TypeText Text:=Chr(13)
        objWord.Selection.TypeText Text:=Chr(13)
        objWord.Selection.TypeText Text:=Chr(13)
        If Len(Trim(datacreazione)) <> 0 Then
            objWord.Selection.TypeText Text:="N E S S U N  dato presente all'interno del tabulato "
            objWord.Selection.TypeText Text:=Chr(13)
            objWord.Selection.TypeText Text:=(Trim(tabst3)) & "(" & tipotab3.Caption & ") del " & datacreazione
            objWord.Selection.TypeText Text:=Chr(13)
        Else
            objWord.Selection.TypeText Text:="N E S S U N  dato presente all'interno del tabulato "
            objWord.Selection.TypeText Text:=Chr(13)
            objWord.Selection.TypeText Text:=(Trim(tabst3)) & "(" & tipotab3.Caption & ") "
            objWord.Selection.TypeText Text:=Chr(13)
        End If
        objWord.Selection.Font.Size = 16
        objWord.Selection.TypeText Text:="( N E G A T I V O )"
        objWord.Selection.TypeParagraph
        objWord.ActiveDocument.SaveAs nomefiletab
        objWord.ActiveDocument.Close
         
        objWord.Quit SaveChanges:=wdDoNotSaveChanges
        Close #4
        test_g4 = 2
        Exit Function
    End If
    
     
    -----------------------------------------------------------------------------
    
    
    '******************************************************
    ' STAMPA G4
    '******************************************************
    nomefiletab = Trim(Testo99.Value) & "\" & Right("000" + Trim(CasellaCombinata34), 3) & "_G4.DOC"
    If tabst3co <> 0 Then
        If Dir(nomefiletab) <> "" Then
            Set objWord = New Word.Application
            objWord.Visible = False
                For nco = 1 To Val(tabst3co)
                    If nco = 1 Then
                        If tipo_attivita = "I" Then
                            piepag = ""
                            piepag = "Tabulato G4 (estratto da G4.TXT) - Allegato 3"
                        Else
                            piepag = ""
                            piepag = "Tabulato G4 (estratto da G4.TXT) - Allegato 1"
                        End If
                    ElseIf nco = 2 Then
                        If tipo_attivita = "I" Then
                            piepag = ""
                            piepag = "Tabulato G4 (estratto da G4.TXT) - Allegato 5"
                        Else
                            piepag = ""
                            piepag = "Tabulato G4 (estratto da G4.TXT) - Allegato 2"
                        End If
                    Else
                        piepag = ""
                        piepag = "Tabulato G4 (estratto da G4.TXT)"
                    End If
                   
                    Set wDoc = objWord.Documents.Open(nomefiletab, AddToRecentFiles:=False)
                    With wDoc
                        With .Sections.First.Footers(wdHeaderFooterPrimary).Range
                            'cancella il pie' di pagina vecchio & aggiunge il pie' di pagina nuovo
                            .Text = piepag
                            .ParagraphFormat.Alignment = wdAlignParagraphRight
                                With .Font
                                .Name = "Courier New"
                                .Size = 7
                                .Bold = True
                                End With
                        End With
                        ' stampa il documento
                        .PrintOut Range:=wdPrintAllDocument
                        .Close SaveChanges:=wdDoNotSaveChanges
                    End With
                Next nco
            objWord.Quit
            Set wDoc = Nothing
            Set objWord = Nothing
            S3OK.Visible = True
        Else
            t(2, 1) = "NO"
        End If
    Else
            t(2, 1) = "NO"
    End If
    
    
    -----------------------------------------------------------------------------
    
    Public Function chiudi_excel()
    
    If IsProcessRunning("EXCEL.EXE") Then
       
        On Error Resume Next
        Shell "CMD /C TASKKILL /IM EXCEL.EXE /F"
        On Error GoTo 0
        Do
            If Not IsProcessRunning("EXCEL.EXE") Then Exit Do
            DoEvents: If Timer > (myT2 + 2) Or Timer < myT2 Then Exit Do
        Loop
           
    End If
    End Function
    
    -----------------------------------------------------------------------------
    

    con varie varianti, quello che faccio, fondamentalmente, e'
    1) leggere un file txt (ovviamente dopo aver controllato che esiste, ecc, ecc)
    2) estrarne dei dati
    3) scriverli in vari fogli di un file xls
    4) leggere sempre lo stesso file txt
    5) estrarre le righe che soddisfano alcune condizioni
    6) creare dei file DOC con relativa intestazione
    7) stampare i doc creati inserendo pie' di pagina diversi (per lo stesso tabulato) in base ad alcune condizioni.

    Ed eccomi alle prime domande:

    La Xe3 conviene per iniziare ? Consigliate qualche versione precedente (2007 o cosa -ed eventualmente dove la trovo-) ?

    ci sono librerie native ( o camandi gia' presenti nel linguaggio) con cui si puo' fare questo ? Occorre utilizzare librerie esterne ? Ce ne sono di gratuite ? Dove potrei cercare un po' di materiale ?

    Grazie in anticipo.

  2. #2
    L'avatar di _alka_
    _alka_ non è in linea Very Important Person
    Premetto che - a mio avviso - qualsiasi versione di Delphi va bene per cominciare, e che comunque si tratta di un prodotto commerciale sottoposto a licenza, per cui va acquistato (e la licenza consente di utilizzare anche versioni precedenti, se occorre).

    Detto questo, sicuramente ti suggerisco di approfondire i principi rudimentali del linguaggio, dell'ambiente e della libreria RTL/VCL prima di iniziare a svolgere compiti più complessi, in quanto sono la base per poter sviluppare le applicazioni ed è importante approfondire il paradigma della programmazione ad oggetti che il linguaggio da cui provieni non supporta appieno, mentre in Delphi costituisce una parte fondamentale.

    Passando al tuo problema, Delphi supporta la tecnologia COM/ActiveX, che è quella impiegata nell'accesso alle funzionalità degli applicativi di Microsoft Office.

    Ci sono dei componenti già presenti in Delphi per fare la maggior parte delle operazioni, oppure si può ricorrere direttamente alle interfacce COM registrate dagli applicativi.

    A meno che tu non intenda accedere "nativamente" al file, cioè riconoscere direttamente il formato del documento Word, è richiesta ovviamente la presenza di Office installato sulla macchina.

    Prova a studiare questo esempio per farti un'idea di come istanziare l'applicazione e accedere ai suoi membri.

    Si tratta comunque di una problematica già di un certo livello, per cui se stai muovendo i primi passi nel linguaggio, non dimenticare quello che è il mio primo suggerimento.

    Ciao!
    ℹ️ Leggi di più su _alka_ ...

+ Rispondi al messaggio

Potrebbero interessarti anche ...

  1. Risposte: 0
    Ultimo Post: 17-03-2015, 11:17
  2. Risposte: 8
    Ultimo Post: 27-03-2013, 16:40
  3. Risposte: 2
    Ultimo Post: 17-02-2013, 17:42
  4. Risposte: 0
    Ultimo Post: 20-06-2011, 12:04
  5. Creare un Excel da un file di testo
    Da ile987 nel forum Python
    Risposte: 0
    Ultimo Post: 17-07-2007, 07:36