[Résolu][Calc] Ouverture CSV avec données séparées par ;

Discussions et questions sur tout ce qui concerne la programmation tous langages et tous modules confondus.

Modérateur : Vilains modOOs

Règles du forum
:alerte: Balisage obligatoire dans cette section !
Aidez-nous à vous aider au mieux en balisant correctement votre question : reportez-vous sur les règles de cette section avant de poster !
thibdb13
Membre lOOyal
Membre lOOyal
Messages : 45
Inscription : 25 mai 2007 13:06

[Résolu][Calc] Ouverture CSV avec données séparées par ;

Message par thibdb13 »

Bonjour,

j'ai besoin de créer une macro me permettant d'ouvrir automatiquement des fichiers CSV dont les données sont séparées horizontalement par des points-virgule.
Après quelques recherche, j'ai pu trouver la macro suivante:

Code : Tout sélectionner

REM  *****  BASIC  *****
'Copyright (c) 2007 Winfried Rohr, re-Solutions Software Test Engineering
'mailto: ooo@re-solutions.de  Untere Zahlbacher Strasse 18, D-55131 Mainz
 
'This program is free software; you can redistribute it and/or modify it under 
'the terms of the GNU General Public License as published by the Free Software
'Foundation; either version 2 of the License, or (at your option) any later 
'version.

'This program is distributed in the hope that it will be useful, but WITHOUT 
'ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
'FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

'You should have received a copy of the GNU General Public License along with 
'this program; if not, write to the Free Software Foundation, Inc., 59 Temple 
'Place, Suite 330, Boston, MA 02111-1307 USA
' ========================================================================


' Main routine
' 
' 1. determine your CSV filter options and edit this 
' 2. run insertCSV2Calc with your target calc open

Sub insertCSV2Calc

sMakroName = "insertCSV2Calc "
sMakroVersion = "1.4.2 " ' Niko plus ,4
'sMakroDatum = "20070615 "
'sMakroDatum = "20080202 " ' 1.4.1 CopyError calling function name
sMakroDatum = "20080711 " ' 1.4.2 typo "iiZeile"

oImport2Calc = StarDesktop.getCurrentComponent().getCurrentController().getModel()
' Prüfen, ob aus Calc aufgerufen
If NOT oImport2Calc.supportsService(_
	"com.sun.star.sheet.SpreadsheetDocument" ) Then
	MsgBox _
	"Makro wurde nicht von einem Calc-Dokument aufgerufen. No CALC" & CHR(10) _
	& CHR(10) & "Erklärung:" _
	& CHR(10) & "Dieses Makro importiert eine CSV-Datei mit festen" _
    & CHR(10) & "Filtereinstellungen nach Calc - es wurde aber nicht" _
    & CHR(10) & "aufgerufen von einem Calc-Dokument" _
    & CHR(10) _
    & CHR(10) & "Makro " & sMakroName & " wird nun beendet." _
    , 48 , sMakroName & "Version " & sMakroVersion
    Exit Sub
    
    
    ' CALC SHEET HAS TO CALL THIS ROUTINE
    
    
End If

' laden von Hilfsfunktionen
GlobalScope.BasicLibraries.LoadLibrary( "Tools" )

' Dateidialog zur Auswahl des CSV
oFileDialog = _
 CreateUnoService( "com.sun.star.ui.dialogs.FilePicker" )
With oFileDialog
 .appendFilter( "Textdatei (TAB getrennt)", "*.csv" )
 .Title = "CSV-Datei zum Import wählen"
' .setDisplayDirectory( ConvertToURL( "U:\Eigene Dateien\") )
 .setDisplayDirectory( ConvertToURL( "U:\AALST\PDF\CA150") )
End With 

' wenn ausgewählt und mit OK geschlossen
If oFileDialog.execute() = _
	com.sun.star.ui.dialogs.ExecutableDialogResults.OK then
	' ausgewählter Dateiname
    sUrl = oFileDialog.Files(0)
	' Tabellenblatt abfragen 
    sBlattName = Inputbox( "Name der Tabelle zum Einfügen", _
	sMakroName & " -Tabellen-Name", "neuesteDaten" ) 
	if sBlattName > "" then
		' wenn vorhanden: nicht OK
		if oImport2Calc.Sheets().hasByName( sBlattName ) then 
	MsgBox _
	"Beende das Makro: Tabelle bereits vorhanden." & CHR(10) _
	& CHR(10) & "Erklärung:" _
	& CHR(10) & "Eine Tabelle mit dem eingegebenen Namen existiert " _
    & CHR(10) & "Deshalb importiere ich die Daten nicht" _
    & CHR(10) & "Makro " & sMakroName & " wird nun beendet." _
    , 48 , sMakroName & "Version " & sMakroVersion
    Exit Sub
		End If

	    ' nicht vorhanden: angelegen nach letztem Blatt
	    if oImport2Calc.Sheets().getCount() < 255 then
    		oImport2Calc.Sheets().insertNewByName( sBlattName , _
			 oImport2Calc.Sheets().getCount() )
		else
	MsgBox _
	"Beende das Makro: Max. Tabellenanzahl." & CHR(10) _
	& CHR(10) & "Erklärung:" _
	& CHR(10) & "Diese Calc-Datei hat die maximale Anzahl an Tabellen" _
    & CHR(10) & "Deshalb importiere ich die Daten nicht" _
    & CHR(10) & "Makro " & sMakroName & " wird nun beendet." _
    , 48 , sMakroName & "Version " & sMakroVersion
    Exit Sub
			 
		End If
	Else
    	msgbox "kein Tabellename bestimmt - Makro endet ohne Aktion" _
		 ,,  sMakroName & sMakroVersion
        Exit Sub
	End If
        
    ' Objekt für das neue Blatt     
    oNeuBlatt = _
	 oImport2Calc.Sheets().getByName( sBlattName )

	' Filter festlegen
	Dim FileProperties(1) As New com.sun.star.beans.PropertyValue
	FileProperties(0).Name = "FilterName"
    FileProperties(0).Value ="Text - txt - csv (StarCalc)"
    FileProperties(1).Name = "FilterOptions"
	' FilterOptions 
	FileProperties(1).Value ="59/44,34,ANSI,1,"
	' Datei öffnen
	oCSV = _
	 StarDesktop.loadComponentFromURL( _
	 sUrl, "_blank", 0, FileProperties())
        
	' Bereich der Daten ermitteln
	oQuellBlatt = oCSV.Sheets( 0 ) 
	
	Dim iiSpalten as Long
	Dim iiZeilen as Long
	iiSpalten = _
		iC2C_getLastUsedColumn( oQuellBlatt ) 
    iiZeilen = _
		iC2C_getLastUsedRow( oQuellBlatt ) 
        
	' alle Daten als Array rausziehen
	oQuellBereich = _
     oQuellBlatt.getCellRangeByPosition( _
	 0, 0, iiSpalten, iiZeilen )
        
	alleDaten = _
	 oQuellBereich.getDataArray()
        
	' Zielbereich in gleicher Grösse festlegen 
	oZielBereich = _
     oNeuBlatt.getCellRangeByPosition( _
	 0, 0, iiSpalten, iiZeilen )
	 ' Datenarray reinschreiben
	 oZielBereich.setDataArray( alleDaten() ) 
	
	' CSV-Datei schliessen  
	oCSV.close( TRUE )      
        
End If
        
End Sub 

' ========================================================================
' rein: Sheet als Object 
' raus: Nummer der letzten Zeile/Spalte (bei Null beginnend)
Function iC2C_getLastUsedColumn(oSheet as Object) as Integer
Dim oCell As Object
Dim oCursor As Object
Dim aAddress As Variant
oCell = oSheet.GetCellbyPosition( 0, 0 )
oCursor = oSheet.createCursorByRange(oCell)
oCursor.GotoEndOfUsedArea(True)
aAddress = oCursor.RangeAddress
iC2C_getLastUsedColumn = aAddress.EndColumn
End Function

Function iC2C_getLastUsedRow(oSheet as Object) as Integer
Dim oCell As Object
Dim oCursor As Object
Dim aAddress As Variant
oCell = oSheet.GetCellbyPosition( 0, 0 )
oCursor = oSheet.createCursorByRange(oCell)
oCursor.GotoEndOfUsedArea(True)
aAddress = oCursor.RangeAddress
iC2C_GetLastUsedRow = aAddress.EndRow
End Function

' Filtre sur virgule
' =========================
' Zum Ermitteln der Filteroptionen für *Deine* CSV-Datei: öffne sie (aus OOo, über
' Dateidialog, unter Verwendung des Import-Dialogs, mit allen nötigen
' Einstellungen), dann lasse folgendes laufen. Notiere die Rückgabe und ersetze im
' Code oben die Werte:

' http://www.oooforum.org/forum/viewtopic.phtml?t=40544
' Villeroy Aug 02, 2006 12:08 am
Sub showFilterOptions
Dim args(),i%
   args() = thisComponent.getArgs
   for i = 0 to uBound(Args())
      if args(i).Name = "FilterOptions" then inputbox "","",args(i).value
   next
End Sub 
' =========================
C'était exactement ce dont j'avais besoin à un petit détail près: j'aurais souhaité que la macro reconnaisse le point-virgule comme séparateur.
Je ne connais quasi rien en VBA et donc je m'étais dis qu'il devrait suffire de remplacer "","" par "";"" dans la partie showFilterOptions...

Code : Tout sélectionner

Sub showFilterOptions
Dim args(),i%
   args() = thisComponent.getArgs
   for i = 0 to uBound(Args())
      if args(i).Name = "FilterOptions" then inputbox "","",args(i).value
   next
End Sub 
... mais évidemment (?), ça ne marche pas.
Quelqu'un aurait-il une idée?

Merci d'avance
Dernière modification par thibdb13 le 16 nov. 2009 15:02, modifié 1 fois.
LibreOffice 7.1.4 OpenSUSE Leap
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 26195
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Calc] Ouverture CSV avec données séparées par ;

Message par Dude »

Salut,

Même question passée en début de mois : http://user.services.openoffice.org/fr/ ... 19337.html

Il suffit de suivre les pistes exposées.
Poser une question, c'est bien. Répondre aux autres, c'est encore mieux.
Améliorez AOO et votez pour les issues
thibdb13
Membre lOOyal
Membre lOOyal
Messages : 45
Inscription : 25 mai 2007 13:06

Re: [Calc] Ouverture CSV avec données séparées par ;

Message par thibdb13 »

Bonjour,

merci pour la communication de l'autre question qui est très semblable mais qui malheureusement ne répond pas à la mienne.
La référence donnée parle de "'," et non de ";".
Comme je l'ai déjà dit, je n'y connais (presque) rien en VB et le simple passage de la virgule au point-virgule comme séparateur est pour moi un gros problème.
LibreOffice 7.1.4 OpenSUSE Leap
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 26195
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Calc] Ouverture CSV avec données séparées par ;

Message par Dude »

thibdb13 a écrit :mais qui malheureusement ne répond pas à la mienne.
La référence donnée parle de "'," et non de ";".
Relis mieux le fil. La réponse y est pourtant donnée :
Dans ce [url=http://user.services.openoffice.org/fr/forum/ftopic3133.html]fil[/url], il y a écrit :J'ai donc remplacé la valeur "44" par la valeur "59" (";")
Si cela ne fonctionne pas, joins ton classeur et un CSV qu'il faut importer.
thibdb13 a écrit :Comme je l'ai déjà dit, je n'y connais (presque) rien en VB
Aucune importance, le VB c'est pour Microsoft. Ici, on fait du OOo Basic.
Poser une question, c'est bien. Répondre aux autres, c'est encore mieux.
Améliorez AOO et votez pour les issues
thibdb13
Membre lOOyal
Membre lOOyal
Messages : 45
Inscription : 25 mai 2007 13:06

Re: [Calc] Ouverture CSV avec données séparées par ;

Message par thibdb13 »

Entretemps, j'ai résolu le problème.
Comme Dude l'a indiqué et après consultation de la documentation dont référence dans le fil qu'il m'a recommandé, je me suis en effet rendu compte que j'avais cherché au mauvais endroit.
Le bon morceau de code (corrigé) était donc le suivant:

Code : Tout sélectionner

	' Définir le filtre
	Dim FileProperties(1) As New com.sun.star.beans.PropertyValue
	FileProperties(0).Name = "FilterName"
    FileProperties(0).Value ="Text - txt - csv (StarCalc)"
    FileProperties(1).Name = "FilterOptions"
	' Options du filtre
	FileProperties(1).Value ="59/9,34,ANSI,1,"
	' Ouvrir les données
	oCSV = _
	 StarDesktop.loadComponentFromURL( _
	 sUrl, "_blank", 0, FileProperties())
où j'ai donc remplacé le 59/44 existant par 59/9
LibreOffice 7.1.4 OpenSUSE Leap