Comment sauvegarder en CSV une feuille de calcul Calc avec une macro

bonjour,

Je cherche le moyen d’exporter une feuille de calcul au format CSV

Tableau à synchroniser.ods

Le tableau peut contenir jusqu’à 210 lignes

j’ai trouvé ici une macro

REM  *****  BASIC  *****

REM Listings in the comments - http://www.pitonyak.org/oo.php
Sub exportToCSV()
Dim sURL$ As String ' URL of current workbook
Dim FileN As String ' URL of target CSV-file
Dim oCurrentController As Object ' Before save - activate sheet sSheetName
Dim storeParms(2) as new com.sun.star.beans.PropertyValue 
Const sSheetName = "To CSV"
   GlobalScope.BasicLibraries.LoadLibrary("Tools") ' Only for GetFileName
   sURL = thisComponent.getURL()
   FileN = GetFileNameWithoutExtension(sURL) & ".csv"
REM Options to StoreTo:
   storeParms(0).Name = "FilterName"
   storeParms(0).Value = "Text - txt - csv (StarCalc)" 
REM See name of your filter vs Listing 5.45: Enumerate all supported filter names.
   storeParms(1).Name = "FilterOptions"
   storeParms(1).Value = "44,34,76,1,,0,true,true,true"
REM About this string see 12.4.6.Loading and saving documents in "OOME_3_0"
   storeParms(2).Name = "Overwrite"
   storeParms(2).Value = True 
REM Activate sheet for export - select "To CSV"
   thisComponent.getCurrentController().setActiveSheet(thisComponent.getSheets().getByName(sSheetName))
REM storeToURL can raises com.sun.star.io.IOException! Only now:
On Error GoTo Errorhandle
REM Export
   thisComponent.storeToURL(FileN,storeParms())
   MsgBox ("No Error Found,Upload file is saved : """ + ConvertFromUrl(FileN) + """.")
Exit Sub

Errorhandle:
    MsgBox ("Modifications Are Not Saved,Upload File Not Generated" & chr(13) _
    & "May be table " & ConvertFromUrl(FileN) & " is open in another window?")
    Exit Sub
    Resume
End Sub

Mais je ne parviens pas la transformer pour tenir compte automatiquement de la plage de mon tableau.

Avez-vous une idée?

Merci

Avertissement

Parfois, ce qui est le plus simple est ce qui fonctionne le mieux. Pourquoi se casser la tête avec une macro ? Pourquoi ne pas simplement utiliser la fonction appropriée, à savoir FichierEnregistrer sous... et de sélectionner le format CSV ?

Si vous voulez réduire à une plage de ligne, supprimez simplement les colonnes et lignes dont vous n’avez pas besoin directement depuis Calc.

Edit : L’utilisateur a bien compris qu’il existait cette fonctionnalité mais veut toutefois fournir une solution tout en un pour ses utilisateurs qui ne sont pas à l’aise avec l’informatique.

Utilisation d’une extension

L’extension proposée par Valioud fonctionne malheureusement uniquement avec Base :

preuve de l'extension qui ne fonctionne pas

Utilisation d’une macro

Comme il n’existe pas d’extension à l’heure actuelle qui permette ce genre de fonctionnalité, écrivons notre propre macro.

La macro qui suit est commentée et s’auto-suffit à sa compréhension. Quoi qu’il en soit, en guise d’explication, l’idée principale de cette macro est de copier la sélection dans une feuille temporaire et de sauvegarder cette feuille en CSV. En effet, l’export CSV de LibreOffice exporte la feuille toute entière, d’où le besoin d’utiliser une feuille temporaire.

Voici le document incorporant la macro, que vous pouvez utiliser à des fins de test. Le document comporte un bouton qui exécute la macro : Document Calc avec macro de sauvegarde de feuille partielle

Le code de la macro :

function SaveFile(pDefaultFileName as string) as string
    dim lFilePicker as object
    dim lFileSelected as string
    dim lSelectedFiles as object
    dim lFilePickerType(0) as integer
    
    lFileSelected = ""
    lFilePicker = CreateUnoService("com.sun.star.ui.dialogs.FilePicker")
    lFilePickerType(0) = com.sun.star.ui.dialogs.TemplateDescription.FILESAVE_SIMPLE
    lFilePicker.initialize(lFilePickerType())
    lFilePicker.setMultiSelectionMode(False)
    lFilePicker.DefaultName = pDefaultFileName
    if (lFilePicker.execute = com.sun.star.ui.dialogs.ExecutableDialogResults.OK) then
        lSelectedFiles = lFilePicker.getSelectedFiles
        SaveFile = lSelectedFiles(0)
        goto SaveFileReturn
    end if
    
    SaveFile = ""
    SaveFileReturn:
end function

sub Main

' Get destination CSV  file name
dim destinationFile as string
destinationFile = SaveFile("export_to_csv.csv")
if destinationFile = "" then
    MsgBox("You avez annulé la sauvegarde en CSV")
    exit sub
end if

dim currentSheet as object
currentSheet = ThisComponent.CurrentController.ActiveSheet

' Generate unique random sheet name
dim sheetAlreadyExists as boolean
dim randomNumber as integer
dim randomSheetName as string
sheetAlreadyExists = false
do
    randomNumber = rnd * 9999 - 1000
    randomSheetName = currentSheet.Name + randomNumber
    dim i
    for i = 0 to ThisComponent.Sheets.Count - 1
        if randomSheetName = ThisComponent.Sheets(i).Name then
            sheetAlreadyExists = true
        end if
    next i
    if i = ThisComponent.Sheets.Count then
        sheetAlreadyExists = false
    end if
loop while sheetAlreadyExists = true

' Create that unique temporary sheet name
ThisComponent.Sheets.insertNewByName(randomSheetName, ThisComponent.Sheets.Count)
dim randomSheet as object
randomSheet = ThisComponent.Sheets(ThisComponent.Sheets.Count - 1)

' Copy selection to new temporary sheet
dim selectedRange as new com.sun.star.table.CellRangeAddress
selectedRange =  ThisComponent.getCurrentSelection().getRangeAddress()
dim destinationCell as new com.sun.star.table.CellAddress
destinationCell.Sheet = ThisComponent.Sheets.Count - 1
destinationCell.Column = 0
destinationCell.Row = 0
randomSheet.copyRange(destinationCell, selectedRange)

' Switch to temporary sheet
ThisComponent.CurrentController.setActiveSheet(randomSheet)

' Save temporary sheet to CSV
dim dispatchConfig(2) as new com.sun.star.beans.PropertyValue
dispatchConfig(0).Name = "URL"
dispatchConfig(0).Value = destinationFile
dispatchConfig(1).Name = "FilterName"
dispatchConfig(1).Value = "Text - txt - csv (StarCalc)"
dispatchConfig(2).Name = "FilterOptions"
dispatchConfig(2).Value = "44,34,76,1,,0,false,true,true,false,false"
dim dispatcher as object
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dispatcher.executeDispatch(ThisComponent.CurrentController.Frame, ".uno:SaveAs", "", 0, dispatchConfig())

' Switch back to old sheet
ThisComponent.CurrentController.setActiveSheet(currentSheet)

' Remove temporary sheet
ThisComponent.Sheets.removeByname(randomSheetName)

end sub

Oui, effectivement, sauf que le tableur est destiné à être utilisé par différentes personnes dont des personnes pas très à l’aise avec l’informatique en général.

@micmor Voilà j’ai fourni une macro ci-dessus qui répond aux prérequis demandés. Bon réveillon!

Rien à dire, un très grand merci pour on aide.

je te souhaite mes meilleurs voeux pour 2019

@micmor. N’hésitez pas à upvoter la réponse, si elle vous a aidé :slight_smile: Je vous souhaite une excellente année 2019 également :slight_smile:

C’est fait non, en mettant résolu et en cliquant sur ^ ? Ou alors est-ce que je me trompe ? Merci

@micmor Oui en effet :slight_smile:

Bonjour micmor,

La fonction que vous présentez dans votre question réalise un export CSV global de la feuille nommée “To CSV”.

Si vous n’êtes intéressé que par une plage d’une feuille, il faut réaliser une boucle qui lit les lignes de cette plage et génère le fichier CSV à la volée. Un fichier CSV étant un fichier texte, l’opération n’est pas compliquée. vous devriez trouver dans deux des aide-mémoire ici, les ingrédients pour réaliser votre objectif :

  • Aide-mémoire n°3 : Calc

  • Aide-mémoire n°7 : Fichiers

Cordialement,

EDIT: la fonction de wget implémente cette fonctionnalité, vous pouvez donc l’utiliser.

J’ai mis à jour votre commentaire pour les futurs lecteurs, car il se montrait imprécis après que ma réponse ait été choisie. On croyait en effet que vous vous adressiez à moi alors que vous parliez bien de la fonction proposée par micmor dans sa question.

Pour exporter une table en CSV, il y a une extension :

https://forum.openoffice.org/fr/forum/viewtopic.php?f=18&t=49582

Ne fonctionne qu’avec Base. :confused:

Si on parle de table, c’est forcément avec le module Base.
Pour un tableur, on parle de feuille.

Ok merci. J’ai modifié la question en conséquence.

Ok, effectivement, erreur de langage. Je parlais bien d’une feuille avec un tableau (comme en html). merci pour la correction.

Bonjour à tous,

Je tiens à féliciter wget pour sa macro, je la trouve très bien même si j’aurais aimé comprendre comment elle fonctionne.
En effet, je souhaite la modifier pour répondre à mon besoin que je vous expose ici.
Mon document LibreOffice Calc génère un code de fichier SVG après avoir calculé tout un tas de points d’un plan.
J’ai un onglet dans lequel est généré le code SVG, l’autre onglet ne contient que les calculs.
J’ai copié toutes les informations de mon fichier dans celui fourni dans cette conversion mais je rencontre un gros problème. En effet, alors que mon onglet de code SVG est correcte sa version copiée avant la sauvegarde n’est plus bonne puisque toutes les références à l’autre onglet sont cassées. Chaque ligne de formule ne contient que “#REF !” !!!
Je pense qu’il s’agit de changer la ligne “randomSheet.copyRange(destinationCell, selectedRange)” mais j’ignore par laquelle la changer !
De plus, la macro, actuellement, ne sauvegarde que les cellules sélectionnées. J’aurais aimé qu’elle prenne toutes les cellules non vides de l’onglet actif.
Que représentent les nombres de la dernière ligne de cette partie de code de la macro ?

dispatchConfig(1).Value = "Text - txt - csv (StarCalc)"
dispatchConfig(2).Name = "FilterOptions"
dispatchConfig(2).Value = "44,34,76,1,,0,false,true,true,false,false"

Voici une formule de la génération du code SVG.

=CONCATENER("    <path id=""cd-25-";Coordonnées.D11;"-";Coordonnées.E11;""" d=""m ";Coordonnées.F11;",";Coordonnées.G11;" h 175 v 50 h -175 z"" style=""fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"" />")

Admirez les doubles signes ’ " ’ ! Ils sont nécessaires pour conserver une double apostrophe dans le code affiché. Dans une précédente version de test de votre macro, calculs et code SVG étaient dans le même onglet et quand je sauvegardais toutes mes cellules, y compris les calculs, les doubles " étaient affichées et toutes les cellules étaient encadrées par une " le code est donc invalide.

Pour résumer, je cherche :

  • à sauvegarder la seule colonne qui sera dans mon document définitif, le code SVG
  • ne plus avoir de double " mais une seule
  • ne pas avoir de cellules encadrées par des : "
  • ne plus rencontrer de problème de références cassées

Je vous remercie de votre patience d’être arrivé à lire cette ligne.

Cordialement,

LeDub

@LeDub.

Merci pour votre commentaire. Etant donné que ça concerne un nouveau sujet d’une question résolue, si votre question s’applique toujours, pouvez-vous reposer votre question en créant un nouvelle question distincte ?