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 Fichier
→ Enregistrer 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 :
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