Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

OpenOffice & LibreOffice Discussion :

Importer fichier .csv dans une table LO Base


Sujet :

OpenOffice & LibreOffice

  1. #1
    Membre régulier
    Importer fichier .csv dans une table LO Base
    Bonjour,

    Je cherche depuis un moment à importer un fichier.csv dans une table de libreOffice Base. Je ne trouve aucun exemple mais peut-être ai-je mal cherché.
    Auriez vous une idée pour réaliser cette opération avec une macro?

    Cordialement

    PS; Je travaille avec LO 6.2. La base est sous Firebird

  2. #2
    Membre éclairé
    Bonjour El Bosc,

    Je ne vous serais pas d'un grand secours, vous avez surement déjà tenté ce que je vous propose

    Editer votre table LO Base dans Calc pour la modifier du contenu du fichier CSV, puis reconnecter le fichier obtenu à Base.
    LibreOffice 6.3.5.2 (x64) FR-YT 07-03-20
    OS : Windows 10.0

  3. #3
    Membre régulier
    Macro importation fichier.csv
    Bonjour,

    Merci de l' intèrêt que vous portez à ce sujet. J' ai trouvé un début de solution qui fonctionne parfaitement sous Base HSQL. Malheureusement, j' ai démarré sous Base Firebird. Je ne sais pas si le problème provient de cette différence mais il subsiste une difficulté. La ligne
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    .insertRow
    provoque l' erreur ci-dessous:
    Une exception c' est produite:
    Type: com.sun.star.sdbc.SQL.Exception
    Message: Erreur de séquence de fonction.
    Je vous joins le code de la macro:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
        Dim maConnexion as Object, oConnexion as Object, oForm As Object
     
        Sub AjoutDonnees
           Dim DrvMan As Object, maRequete as Object, Coding as Object
           Dim cheminCSV As String, URLbdcsv As String, instrSQL as String
           Dim Infos(3) As New com.sun.star.beans.PropertyValue
           Dim x As Long         '***
           Dim sNomFichier As String '***
           Dim lsNomFichier As Integer '***
     
           ThisDatabaseDocument.CurrentController.connect("","")
           maConnexion = ThisDatabasedocument.CurrentController.ActiveConnection
           DrvMan = CreateUnoService("com.sun.star.sdbc.DriverManager")
           Coding = CreateUnoService("com.sun.star.sdbc.FLATConnectionProperties")
           cheminCSV = "/home/elfouste/Documents/Python/Svg_Csv/DnExif.csv"
     
           ' extraction du nom de fichier sélectionné '***
           sNomFichier = cheminCSV
           lsNomFichier = len(sNomFichier)
           x = lsNomFichier
           while mid(sNomFichier,x,1) <> "/"
              x = x-1
           wend
           sNomFichier = mid(sNomFichier,x + 1,lsNomFichier-x-4)
     
           URLbdcsv = "sdbc:flat:" & cheminCSV
           Infos(0).Name = "HeaderLine"
           Infos(0).Value = True
           Infos(1).Name = "FieldDelimiter"
           Infos(1).Value = chr(44)
           Infos(2).Name = "StringDelimiter"
           Infos(2).Value = ","
           Infos(3).Name = "Extension"
           Infos(3).Value = "csv"
     
           oConnexion = DrvMan.getConnectionWithInfo(URLbdcsv, Infos())
           maRequete = maConnexion.createStatement()
           oForm = thisComponent
           instrSQL = "DELETE FROM ""Tp_Pht"""
           maRequete.executeUpdate(instrSQL)
           CopierDonnees(sNomFichier)
     
        End Sub
        '========================================================================================================
        Sub CopierDonnees(NomFichier)
     
           On Error GoTo CopierDonnees_Err
     
           Dim unRowSet as Object, maRequete as Object, resuQuery as Object, maRequete2 as object, Resultat as Object
           Dim Fenetre as Object, FenetreForm as Object, avance as Object
           Dim instrSQL as String, instrSQL2 as String, i as Integer, dteNaiss as Date, Compte as Integer, x as Integer
     
           Fenetre = ThisDatabaseDocument.CurrentController.Frame.ContainerWindow
           FenetreForm = oForm.currentcontroller.Frame.ContainerWindow
           Fenetre.Enable = False
           FenetreForm.Enable = False
           avance = oForm.CurrentController.StatusIndicator
           unRowSet = createUnoService("com.sun.star.sdb.RowSet")
     
           instrSQL = "SELECT * FROM " & NomFichier
           instrSQL2 = "SELECT COUNT(*) as ""nb"" FROM " &  NomFichier   
     
           maRequete = oConnexion.createStatement()
           maRequete2 = oConnexion.createStatement()
           Resultat = maRequete2.executeQuery(instrSQL2)
           Resultat.Next
           Compte = resultat.getInt(1)
           resuQuery = maRequete.executeQuery(instrSQL)
     
           With unRowSet
              .ActiveConnection = maConnexion
              .CommandType = com.sun.star.sdb.CommandType.TABLE
              .Command = "Tp_Pht"
              .Execute
              x = 1
              avance.start("Veuillez patienter ...", Compte)
              Do While resuQuery.Next
                 .moveToInsertRow
                 For i = 1 to 17
                    Select Case .Columns.getByIndex(i -1).TypeName
                       Case "INTEGER"
                          .Columns.getByIndex(i -1).updateInt(resuQuery.getInt(i))
                       Case "VARCHAR"
                          .Columns.getByIndex(i -1).updateString(resuQuery.getString(i))
                       Case "NUMERIC"
                          .Columns.getByIndex(i -1).updateInt(resuQuery.getInt(i))               
                    End Select
                       If i = 1 Then
                          .insertRow
                          Else
                             .UpdateRow
                       End If   
                 Next i
                 avance.Value = x
                 avance.Text = "Ligne " & x & " recopiée"
                 x = x + 1               
              Loop
                avance.Text = "Terminé " & Compte & " lignes recopiées"
           End With
           oConnexion.Dispose
           unRowSet.Dispose
           Wait 800
           avance.End
           FenetreForm.Enable = True
           Fenetre.Enable = True 
           CopierDonnees_Exit:   
              On Error GoTo 0
                 Exit Sub
           CopierDonnees_Err:
           MsgBox(Error, 16)
           FenetreForm.Enable = True
           Fenetre.Enable = True
           oConnexion.Dispose
           unRowSet.Dispose
           Resume CopierDonnees_Exit     
        End Sub

    Si vous voulez faire un essai, je joins un fichier csv et une ébauche de base de données

    Cordialement

  4. #4
    Membre éclairé
    Bonsoir El Bosc,

    Je n'y connais rien, mais d'après ce que je crois comprendre, vous identifiez vos colonnes avec le même identifiant que la ligne à insérer "i", c'est une origine possible au pb...
    Je serais une machine logique, je buguerais...
    LibreOffice 6.3.5.2 (x64) FR-YT 07-03-20
    OS : Windows 10.0

  5. #5
    Membre régulier
    Connaitre le résultat d' une requête
    Bonsoir njhub,

    Sur le principe, vous avez raison. Malgré tout j' ai effectué des tests avec une base LO sous HSQL et elle fonctionne parfaitement. La macro etait identique à la base sous Firebird et le fichier csv est le même dans les deux cas.
    En fait, la boucle sélectionne les données les une dernières les autres et si i = 1, le champ se trouve documenté.
    En Hsql, la boucle tourne 17 fois car il ya 17 champs à remplir. En Firebird, le système plante à la première boucle. Aussi, pour comprendre ce qu' il se passe sous Firebord, je voudrai savoir ce que contient le resuQuery qui est à l' origine de la boucle.

    Bonne soirée

  6. #6
    Membre régulier
    Bogue Libre Office Base Firebird
    Bonsoir,

    Visiblement, c' est un bogue du au changement de HSQL en Firebird. Donc, en attendant mieux(Message demandant de passer à Firebird), je suis retourné sous HSQL. Voir le rapport de bogue https://bugs.documentfoundation.org/....cgi?id=118094.

    Cordialement

###raw>template_hook.ano_emploi###