[Risolto] Importare tutti i fogli da un altro file Calc

Creare una macro - Scrivere uno script - Usare le API
Rispondi
ihinnfmna
Messaggi: 8
Iscritto il: domenica 9 novembre 2014, 15:01

[Risolto] Importare tutti i fogli da un altro file Calc

Messaggio da ihinnfmna »

Ciao a tutti! Il mio obiettivo è craere una macro che importi nel file Calc da cui viene eseguita tutti i fogli, comprensivi del loro contenuto, di un altro file Calc a scelta. In pratica, vorrei che la macro eseguisse ciò che si fa dal menu "Inserisci" -> "Foglio da file" -> "Dopo il foglio corrente", per tutti i fogli del file. Allego i due file calc, quello in cui si esegue la macro (Principale.ods) e quello dal quale devono essere copiati i fogli (OrigineDati.ods). Preciso che i fogli di OrigineDati.ods hanno sicuramente tutti un nome diverso dall'unico foglio contenuto in Principale.ods. Se si riesce a fare questo, l'ideale poi sarebbe che fosse possibile selezionare attraverso un'apposita finestra di dialogo il file da cui copiare i fogli. Grazie mille!
Allegati
Principale.ods
File da cui vengono importati i fogli
(8.82 KiB) Scaricato 188 volte
OrigineDati.ods
File da cui copio i fogli
(8.85 KiB) Scaricato 188 volte
Ultima modifica di charlie il sabato 23 aprile 2016, 19:16, modificato 2 volte in totale.
Motivazione: Aggiunto segno di spunta verde
OpenOffice 3.1 su Windows 7
patel
Volontario attivo
Volontario attivo
Messaggi: 4020
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Importare tutti i fogli da un altro file Calc

Messaggio da patel »

prova questa macro

Codice: Seleziona tutto

Sub CopiaFogli
Dim args(0) As New com.sun.star.beans.PropertyValue
Doc1 = ThisComponent
sUrl = ConvertToURL("F:\Download\OrigineDati.ods") ' <<<<< modificare percorso
args(0).Name  = "Hidden"
args(0).Value = true
Doc2=StarDesktop.loadComponentFromURL(sUrl,"_blank",0, args()) 
sSheet = Doc1.getSheets()
for n=0 to doc2.Sheets.getCount()-1
  nomefoglio = doc2.Sheets(n).Name
  sSheet.insertNewByName(nomefoglio, doc1.Sheets.getCount())
  lSheet = sSheet.getByName(nomefoglio)
  lSheet.link(sURL, nomefoglio, "calc8", "", com.sun.star.sheet.SheetLinkMode.NORMAL)
  lSheet.setLinkMode(com.sun.star.sheet.SheetLinkMode.NONE)

next
Doc2.close(true)
End Sub
-------------------
Libre Office 7.5.3.2 su Windows 11
allega un file di esempio, guadagnerai tempo tu e lo farai risparmiare a chi ti aiuta
ihinnfmna
Messaggi: 8
Iscritto il: domenica 9 novembre 2014, 15:01

Re: Importare tutti i fogli da un altro file Calc

Messaggio da ihinnfmna »

Perfetta patel, fa esattamente quello che mi serve! In più senza aprire in modo visibile il foglio OrigineDati.ods! Grazie mille, sei stato anche velocissimo a rispondermi :) Ora, l'obiettivo di questa operazione è cancellare tutti i fogli a parte il primo da Principale.ods e reimportarli (dopo che chi di dovere li ha aggiornati) da OrigineDati.ods. Ma poiché questo secondo file in realtà cambia nome dopo l'aggiornamento, deve essere possibile scegliere per l'utente il file "nuovo", in modo che appunto una procedura automatica cancelli i fogli i vecchi da Principale.ods e importi dal file aggiornato (scelto dall'utente) quelli nuovi. Come è realizzabile, se lo è, tutto questo con un solo pulsante? Ho visto che si può creare un pulsante di tipo FilePicker ma credo che consentirebbe soltanto di selezionare il file, mentre bisognerebbe premerne eventualmente un altro per attivare poi in base al file scelto le altre operazioni richieste, o mi sbaglio?

EDIT: se pensi che sia meglio portare questo thread in RISOLTO e aprirne nuovo, dì pure.
OpenOffice 3.1 su Windows 7
patel
Volontario attivo
Volontario attivo
Messaggi: 4020
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Importare tutti i fogli da un altro file Calc

Messaggio da patel »

ihinnfmna ha scritto:Ora, l'obiettivo di questa operazione è cancellare tutti i fogli a parte il primo da Principale.ods e reimportarli (dopo che chi di dovere li ha aggiornati) da OrigineDati.ods..
Non ho capito, puoi spiegarti meglio ?
-------------------
Libre Office 7.5.3.2 su Windows 11
allega un file di esempio, guadagnerai tempo tu e lo farai risparmiare a chi ti aiuta
ihinnfmna
Messaggi: 8
Iscritto il: domenica 9 novembre 2014, 15:01

Re: Importare tutti i fogli da un altro file Calc

Messaggio da ihinnfmna »

Certamente! Principale.ods contiene un foglio con un form e relativi controlli, chiamiamo questo foglio "Form". Il foglio Form è fisso all'interno di Principale.ods. Un pulsante all'interno di Form dovrebbe attivare una macro che faccia questo:

1) cancellare ogni altro foglio eventualmente presente in Principale.ods a parte Form;
2) consentire all'utente di scegliere un altro file Calc dal file system (supponiamo OrigineDati.ods)
3) importare tuti i fogli contenuti nel file OrigineDati.ods in Principale.ods in aggiunta a Form (quello che è stato già realizzato con la macro da te gentilissimamente fornita :))

Questa operazione di cancellazione fogli esistenti/reimportazione fogli aggiornati andrebbe fatta ogni volta che il file da cui importare i fogli viene aggiornato (e cambia anche nome). Mi interessa quindi renderla un'operazione più immediata possibile per l'utente finale. Ti ringrazio per l'aiuto :)
OpenOffice 3.1 su Windows 7
patel
Volontario attivo
Volontario attivo
Messaggi: 4020
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Importare tutti i fogli da un altro file Calc

Messaggio da patel »

Codice: Seleziona tutto

Sub CopiaFogli
Dim args(0) As New com.sun.star.beans.PropertyValue
Dim filterNames(1) As String
filterNames(0) = "*.ods"
filterNames(1) = "*.xls"
call eliminafogli
Doc1 = ThisComponent
sUrl = GetAFileName(filterNames())
if surl ="" then exit sub
args(0).Name  = "Hidden"
args(0).Value = true
Doc2=StarDesktop.loadComponentFromURL(sUrl,"_blank",0, args()) 
sSheet = Doc1.getSheets()
for n=0 to doc2.Sheets.getCount()-1
  nomefoglio = doc2.Sheets(n).Name
  sSheet.insertNewByName(nomefoglio, doc1.Sheets.getCount())
  lSheet = sSheet.getByName(nomefoglio)
  lSheet.link(sURL, nomefoglio, "calc8", "", com.sun.star.sheet.SheetLinkMode.NORMAL)
  lSheet.setLinkMode(com.sun.star.sheet.SheetLinkMode.NONE)

next
Doc2.close(true)
End Sub


Function GetAFileName(Filternames()) As String
Dim oFileDialog as Object, iAccept as Integer, sPath as String, InitPath as String
Dim RefControlName as String, oUcb as object
GlobalScope.BasicLibraries.LoadLibrary("Tools")
oFileDialog = CreateUnoService("com.sun.star.ui.dialogs.FilePicker")
oUcb = createUnoService("com.sun.star.ucb.SimpleFileAccess")
AddFiltersToDialog(FilterNames(), oFileDialog)
InitPath = ConvertToUrl("F:\Download\") ' <<<<<< cartella iniziale in cui cercare
If InitPath = "" Then
  InitPath = GetPathSettings("Work")
End If
If oUcb.Exists(InitPath) Then
  oFileDialog.SetDisplayDirectory(InitPath)
End If
iAccept = oFileDialog.Execute()
If iAccept = 1 Then
  sPath = oFileDialog.Files(0)
  GetAFileName = sPath
End If
oFileDialog.Dispose()
End Function

sub eliminafogli
Doc = ThisComponent
Sheets = Doc.Sheets
for n=Sheets.getCount()-1 to 0 step -1
  if Sheets(n).Name <> "Form" then  Sheets.removeByName(Sheets(n).Name)
next
end sub
-------------------
Libre Office 7.5.3.2 su Windows 11
allega un file di esempio, guadagnerai tempo tu e lo farai risparmiare a chi ti aiuta
ihinnfmna
Messaggi: 8
Iscritto il: domenica 9 novembre 2014, 15:01

Re: Importare tutti i fogli da un altro file Calc

Messaggio da ihinnfmna »

Grazie mille! Fa proprio quello che mi serve :) ho verificato che per i file Excel non riesce a importare i fogli, ho risolto cambiando il parametro "calc8" con "MS Excel 97" (o con una stringa vuota) dopo aver fatto qualche ricerca in merito sul web. Segno come risolto e ti ringrazio infinitamente! :)
OpenOffice 3.1 su Windows 7
Rispondi