[Risolto]Esportare range in file csv

Creare una macro - Scrivere uno script - Usare le API
Rispondi
ferro0099
Messaggi: 72
Iscritto il: giovedì 28 ottobre 2021, 18:44

[Risolto]Esportare range in file csv

Messaggio da ferro0099 »

Buon di , navigando per cercare un modo per esportare in csv, mi sono imbattuto in una macro di "Patel" che potebbe fare al mio caso ma mi dà sempre un errore in:
"oRange = oSheet.getCellRangeByName(srange)"

Allego semplice file

la macro utilizzata è questa:

Codice: Seleziona tutto

Sub CreateCSVFile

   oSheet = ThisComponent.getCurrentController.ActiveSheet
   srange =  oSheet.getCellRangeByName("D5").String
   oRange = oSheet.getCellRangeByName(srange)
   CellContentArray = oRange.getDataArray()
   
   sFileName = "C:\Users\Ferro\Desktop\prova.csv" '<<<<<<<<<<<<<<<< modificare
   n = FreeFile()
   Open  ConvertToUrl(sFileName) For Output As #n
   For i = 0 To UBound(CellContentArray)
     For j = 0 To UBound(CellContentArray(i))
       print #n, str(CellContentArray(i)(j)) +";";
      
     next
     print #n    
   Next
   
   Close #n

End Sub
Allegati
Senza nome 2.ods
(10.28 KiB) Scaricato 16 volte
Ultima modifica di ferro0099 il venerdì 22 marzo 2024, 13:24, modificato 4 volte in totale.
Windows 10 - Open Office 4.1.1
patel
Volontario attivo
Volontario attivo
Messaggi: 4020
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Esportare range in file csv

Messaggio da patel »

Che senso ha esportare una sola cella ? non capisco.
-------------------
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
ferro0099
Messaggi: 72
Iscritto il: giovedì 28 ottobre 2021, 18:44

Re: Esportare range in file csv

Messaggio da ferro0099 »

Scusami ... ma in D5 ho scritto =B5&":"&B7 ...nel senso che volevo esportare la cella B5 (carlo) e B7 (matteo) ...cioè celle non contigue
Windows 10 - Open Office 4.1.1
patel
Volontario attivo
Volontario attivo
Messaggi: 4020
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Esportare range in file csv

Messaggio da patel »

Prova così

Codice: Seleziona tutto

Sub CreateCSVFile

   oSheet = ThisComponent.getCurrentController.ActiveSheet
   srange = "B5:B7"
   oRange = oSheet.getCellRangeByName(srange)
   CellContentArray = oRange.getDataArray()
   sFileName = "C:\Users\Ferro\Desktop\prova.csv" '<<<<<<<<<<<<<<<< modificare   
   n = FreeFile()
   Open  ConvertToUrl(sFileName) For Output As #n
   For i = 0 To UBound(CellContentArray)
     For j = 0 To UBound(CellContentArray(i))
       if j = UBound(CellContentArray(i))  then
         print #n, str(CellContentArray(i)(j))
       Else
         print #n, str(CellContentArray(i)(j)) +";";
       End If
     next
   Next
   
   Close #n

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
ferro0099
Messaggi: 72
Iscritto il: giovedì 28 ottobre 2021, 18:44

Re: Esportare range in file csv

Messaggio da ferro0099 »

Grazie , si funziona ...... ma solo con 2 celle se aggingo un altra cella esempio "B5:B7:C9" mi dà errore
Windows 10 - Open Office 4.1.1
patel
Volontario attivo
Volontario attivo
Messaggi: 4020
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Esportare range in file csv

Messaggio da patel »

Ma a cosa ti serve ? non capisco, comunque funziona soltanto con un range tipo B5:C9, altrimenti prova questa che esporta tutto il contenuto del foglio

Codice: Seleziona tutto

sub Main
dim document   as object
dim dispatcher as object
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dim args1(2) as new com.sun.star.beans.PropertyValue
args1(0).Name = "URL"
args1(0).Value = "file:///C:/Download/prova.csv"
args1(1).Name = "FilterName"
args1(1).Value = "Text - txt - csv (StarCalc)"
args1(2).Name = "FilterOptions"
args1(2).Value = "44,34,ANSI,1,,0,false,true,true"

dispatcher.executeDispatch(document, ".uno:SaveAs", "", 0, args1())


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
ferro0099
Messaggi: 72
Iscritto il: giovedì 28 ottobre 2021, 18:44

Re: Esportare range in file csv

Messaggio da ferro0099 »

Grazie... mi serve solo per esportare determinate celle in un file csv, per poi andarle a importare in un file csv di magazzino che riesco a gestirmi con il cellulare, non c'è modo di poter esportare più di sole 2 celle e non tutto il foglio?

Se fossimo stati amici ti avrei chiamato al cellulare :) ...quà è molto lunga da spiegare

Grazie comunque del tuo impegno
Windows 10 - Open Office 4.1.1
ferro0099
Messaggi: 72
Iscritto il: giovedì 28 ottobre 2021, 18:44

Re: Esportare range in file csv

Messaggio da ferro0099 »

Scusami ancora ...tenendo tutto il foglio in csv se non volgio che venga sovrascritto ma salvato con un nome con riferimento alla dicitura di una cella?
Windows 10 - Open Office 4.1.1
patel
Volontario attivo
Volontario attivo
Messaggi: 4020
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Esportare range in file csv

Messaggio da patel »

ferro0099 ha scritto: venerdì 8 marzo 2024, 18:02 non c'è modo di poter esportare più di sole 2 celle e non tutto il foglio?
Un range non è fatto soltanto da 2 celle, ma da tutte le celle comprese tra le due indicate nel range, quindi quando scrivo B5:C9 sono comprese tutte le celle tra i 2 estremi.
Allega un esempio realistico di quello che ti serve ed anche il risultato desiderato, probabilmente a te non serve la struttura del csv. ma basta un elenco del contenuto delle celle.
-------------------
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
ferro0099
Messaggi: 72
Iscritto il: giovedì 28 ottobre 2021, 18:44

Re: Esportare range in file csv

Messaggio da ferro0099 »

patel ha scritto: venerdì 8 marzo 2024, 17:50 Ma a cosa ti serve ? non capisco, comunque funziona soltanto con un range tipo B5:C9, altrimenti prova questa che esporta tutto il contenuto del foglio

Codice: Seleziona tutto

sub Main
dim document   as object
dim dispatcher as object
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dim args1(2) as new com.sun.star.beans.PropertyValue
args1(0).Name = "URL"
args1(0).Value = "file:///C:/Download/prova.csv"
args1(1).Name = "FilterName"
args1(1).Value = "Text - txt - csv (StarCalc)"
args1(2).Name = "FilterOptions"
args1(2).Value = "44,34,ANSI,1,,0,false,true,true"

dispatcher.executeDispatch(document, ".uno:SaveAs", "", 0, args1())


end sub
Ciao Patel , eccomi .... allora ti allego il file di lavoro chiedendoti i vari punti che dovrei riuscire a correggere

1 - Ho inserito nelgli eventi del foglio "SchedaCliente" negli eventi foglio una macro "InsData"che mi inserisca la data corrente nella cella "M2" ma dovrebbe cambiare solo quando modifico esclusivamente la Cella "E4"
2 -Ho cambiato il tuo codice " args1(2).Value = "44,34,ANSI,1,,0,false,true,true" " in " args1(2).Value = "59/4" " per evitare tutte le virgole , ma mi servirebbe che mi venga esportato come indico sotto :

Cliente : ;Gialli
Prodotto : ;Toner Giallo1
Codice : ;2224
Ricetta : ;15

; peso - (Kg); Peso + (Kg);nr prodotti; Totale pesi (Kg)
Toner Nero: ;0.00;00.00;0;0.00
Toner Magenta: ;00.00;00.00;0;0.00
Toner Ciano: ;0.00;0.00;0;0.00
Toner Giallo : ;0.00;0.00;0;0.00

TOT;;;0;0.00

3 - Quando Salva dovrebbe non sovrascrivere ma salvare Prendendo come riferimento la cella "Cliente (E4) + il Codice (la Cella E8)

Grazie
Allegati
Prova.ods
(35.37 KiB) Scaricato 20 volte
Windows 10 - Open Office 4.1.1
patel
Volontario attivo
Volontario attivo
Messaggi: 4020
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Esportare range in file csv

Messaggio da patel »

Non so aiutarti, chiedi all'amministratore Charlie di spostare la discussione nella sezione Macro e UNO API, che è frequentata da esperti
-------------------
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
ferro0099
Messaggi: 72
Iscritto il: giovedì 28 ottobre 2021, 18:44

Re: Esportare range in file csv

Messaggio da ferro0099 »

Grazie comunque , c'è un modo ben preciso di chiedere di spostare la discussione ?
Windows 10 - Open Office 4.1.1
patel
Volontario attivo
Volontario attivo
Messaggi: 4020
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Esportare range in file csv

Messaggio da patel »

L'ho fatto io cliccando sul punto esclamativo
-------------------
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
ferro0099
Messaggi: 72
Iscritto il: giovedì 28 ottobre 2021, 18:44

Re: Esportare range in file csv

Messaggio da ferro0099 »

patel ha scritto: giovedì 14 marzo 2024, 11:08 L'ho fatto io cliccando sul punto esclamativo
:super:
Windows 10 - Open Office 4.1.1
Avatar utente
charlie
Site Admin
Site Admin
Messaggi: 8819
Iscritto il: mercoledì 19 dicembre 2012, 10:50
Contatta:

Re: Esportare range in file csv

Messaggio da charlie »

Argomento spostato.
charlie
macOS 14.4.1 Sonoma: Open Office 4.1.15 - LibreOffice 7.5.7.2
http://www.charlieopenoffice.altervista.org
Gaetanopr
Volontario
Volontario
Messaggi: 3300
Iscritto il: mercoledì 21 novembre 2012, 20:07

Re: Esportare range in file csv

Messaggio da Gaetanopr »

ferro0099 ha scritto: venerdì 8 marzo 2024, 17:00 Grazie , si funziona ...... ma solo con 2 celle se aggingo un altra cella esempio "B5:B7:C9" mi dà errore
Ti basta inserire tutti i range in un array e le celle non contigue che devono essere esportate sulla stessa riga del csv le indichi all' interno di un altro array nidificato come nell'esempio.

Codice: Seleziona tutto

Sub CreateCSVFile

   oSheet = ThisComponent.getCurrentController.ActiveSheet
   srange = Array("C4:E4", "C6:E6", "C8:E8", "C10:E10", Array("F14", "I14", "L14", "O14"), Array("C16","I16", "L16", "O16" ), Array("C18","I18", "L18", "O18" ), Array("C20","I20", "L20", "O20" ), Array("C22","I22", "L22", "O22"), Array("C24","L24", "O24" ) )

  
   sFileName = tuo indirizzo" '<<<<<<<<<<<<<<<< modificare   
   n = FreeFile()
   Open  ConvertToUrl(sFileName) For Output As #n
For x = 0 To ubound(srange)
  if IsArray(srange(x)) = False Then
    oRange = oSheet.getCellRangeByName(srange(x))
    CellContentArray = oRange.getDataArray()
		   For i = 0 To UBound(CellContentArray)
		     For j = 0 To UBound(CellContentArray(i))
		       if j = UBound(CellContentArray(i))  then
		         print #n, str(CellContentArray(i)(j))
		       Else
		         print #n, str(CellContentArray(i)(j)) +";";
		       End If
		     next
		   Next
  else 
     For arr = 0 To Ubound(srange(x))
        oRange = oSheet.getCellRangeByName(srange(x)(arr))
		   CellContentArray = oRange.getDataArray()
		   For i = 0 To UBound(CellContentArray)
		     For j = 0 To UBound(CellContentArray(i))
		       if arr = UBound(srange(x))  then
		         print #n, str(CellContentArray(i)(j))
		       Else
		         print #n, str(CellContentArray(i)(j)) +";";
		       End If
		     next
		   Next
      Next arr
   end if
next x   
   Close #n

End Sub
LibreOffice 7.2.2.2 windows 10
Openoffice 4.1.13 su windows 10
ferro0099
Messaggi: 72
Iscritto il: giovedì 28 ottobre 2021, 18:44

Re: Esportare range in file csv

Messaggio da ferro0099 »

Grazie Gaetanopr , perfetto!!

Però mi salva sempre giustamente sovrascivendo il file , se voleesi dare il nome al file prendendo in riferimento una cella ? è possibile?
Windows 10 - Open Office 4.1.1
Gaetanopr
Volontario
Volontario
Messaggi: 3300
Iscritto il: mercoledì 21 novembre 2012, 20:07

Re: Esportare range in file csv

Messaggio da Gaetanopr »

Supponendo che l'indirizzo si trovi scritto in A1

Codice: Seleziona tutto

sFileName = oSheet.GetCellRangeByName("A1").String
LibreOffice 7.2.2.2 windows 10
Openoffice 4.1.13 su windows 10
ferro0099
Messaggi: 72
Iscritto il: giovedì 28 ottobre 2021, 18:44

Re: Esportare range in file csv

Messaggio da ferro0099 »

Gaetanopr ha scritto: lunedì 18 marzo 2024, 9:17 Supponendo che l'indirizzo si trovi scritto in A1

Codice: Seleziona tutto

sFileName = oSheet.GetCellRangeByName("A1").String
Che dire ?!?! .... perfetto :bravo:

Ultima questione :
1 - Ho inserito nelgli eventi del foglio "SchedaCliente" negli eventi foglio una macro "InsData"che mi inserisca la data corrente nella cella "M2" ma dovrebbe cambiare solo quando modifico esclusivamente la Cella "E4" e invece mi aggiorna la data al cambiamento di qualsiasi altra cella :ucrazy:
Windows 10 - Open Office 4.1.1
Gaetanopr
Volontario
Volontario
Messaggi: 3300
Iscritto il: mercoledì 21 novembre 2012, 20:07

Re: Esportare range in file csv

Messaggio da Gaetanopr »

ferro0099 ha scritto: lunedì 18 marzo 2024, 14:14 1 - Ho inserito nelgli eventi del foglio "SchedaCliente" negli eventi foglio una macro "InsData"che mi inserisca la data corrente nella cella "M2" ma dovrebbe cambiare solo quando modifico esclusivamente la Cella "E4" e invece mi aggiorna la data al cambiamento di qualsiasi altra cella :ucrazy:
Cambia la tua macro con questa

Codice: Seleziona tutto

Sub InsData(Target) 
    If NOT Target.supportsService("com.sun.star.sheet.SheetCell") then exit sub
    Sh = Target.getSpreadsheet()
    addr = Target.getCellAddress()
    rng = sh.getCellRangeByName("E4")
    range2 = rng.queryintersection(Target.rangeaddress()) 
   If range2.RangeAddressesAsString = "" Then 
       Exit Sub
   Else  
       Sh.GetCellrangeByName("M2").Value = Now()
   End if
End Sub
LibreOffice 7.2.2.2 windows 10
Openoffice 4.1.13 su windows 10
ferro0099
Messaggi: 72
Iscritto il: giovedì 28 ottobre 2021, 18:44

Re: Esportare range in file csv

Messaggio da ferro0099 »

Gaetanopr ha scritto: lunedì 18 marzo 2024, 15:07
ferro0099 ha scritto: lunedì 18 marzo 2024, 14:14 1 - Ho inserito nelgli eventi del foglio "SchedaCliente" negli eventi foglio una macro "InsData"che mi inserisca la data corrente nella cella "M2" ma dovrebbe cambiare solo quando modifico esclusivamente la Cella "E4" e invece mi aggiorna la data al cambiamento di qualsiasi altra cella :ucrazy:
Cambia la tua macro con questa

Codice: Seleziona tutto

Sub InsData(Target) 
    If NOT Target.supportsService("com.sun.star.sheet.SheetCell") then exit sub
    Sh = Target.getSpreadsheet()
    addr = Target.getCellAddress()
    rng = sh.getCellRangeByName("E4")
    range2 = rng.queryintersection(Target.rangeaddress()) 
   If range2.RangeAddressesAsString = "" Then 
       Exit Sub
   Else  
       Sh.GetCellrangeByName("M2").Value = Now()
   End if
End Sub
Sono al PC .... provato il tutto , che dire ...Eccellente!!!!
Windows 10 - Open Office 4.1.1
ferro0099
Messaggi: 72
Iscritto il: giovedì 28 ottobre 2021, 18:44

Re: Esportare range in file csv

Messaggio da ferro0099 »

Buon dì "Gaetanopr" .... ho modificato come da te suggerito e ti conferma che funziona tutto ... provandolo mi è venuta l'esigenza di salvare anche le celle "L2:M2" che identificano la data e l'ora di creazione della richiesta.

Quando salvo , mi indica la data come segnato sotto :

Cliente;;Bianchi
Data; 45373.4059837963
Prodotto;;Toner Giallo 1
CODICE;; 5555
Ricetta;; 15
Totale;Peso;NR PRODOTTI;PESO TOTALE (Kg)
Toner Nero;;;
Toner Magenta;;;
Toner Ciano;;;
Toner Viola;;;
TOTALE;;

Vorrei se fosse possibile che sia scritto : GG/MM/AAAA HH:MM
Allegati
Prova.ods
(35.37 KiB) Scaricato 12 volte
Windows 10 - Open Office 4.1.1
Gaetanopr
Volontario
Volontario
Messaggi: 3300
Iscritto il: mercoledì 21 novembre 2012, 20:07

Re: Esportare range in file csv

Messaggio da Gaetanopr »

Nel file allegato non ci sono le macro da me proposte, in particolare la InsData(Target) ti basterebbe cambiare la parte finale

Codice: Seleziona tutto

Sh.GetCellrangeByName("M2").Value = Now()
con

Codice: Seleziona tutto

Sh.GetCellrangeByName("M2").String = Now()
In questo modo avresti una data testuale.
LibreOffice 7.2.2.2 windows 10
Openoffice 4.1.13 su windows 10
ferro0099
Messaggi: 72
Iscritto il: giovedì 28 ottobre 2021, 18:44

Re: Esportare range in file csv

Messaggio da ferro0099 »

Gaetanopr ha scritto: venerdì 22 marzo 2024, 11:12 Nel file allegato non ci sono le macro da me proposte, in particolare la InsData(Target) ti basterebbe cambiare la parte finale

Codice: Seleziona tutto

Sh.GetCellrangeByName("M2").Value = Now()
con

Codice: Seleziona tutto

Sh.GetCellrangeByName("M2").String = Now()
In questo modo avresti una data testuale.

Scusami ho inserito il vecchio file ti allego quello da te modificato e funzionante, ho modificato in InsData(Target)

Codice: Seleziona tutto

Sh.GetCellrangeByName("M2").String = Now()
e nella macro CreateCSVfile ho inserito srange = Array("C4:E4", "L2:M2" ......ma non m cambia niente quando esporto il file il csv è sempre

Cliente;;Gialli
DATA; 45363.7040625
Prodotto;;Toner Giallo 1
CODICE;; 2224
Ricetta;; 15
;Totale;Peso;NR PRODOTTI;PESO TOTALE (Kg)
;;;;
;;;;
;;;;
;;;;
TOTALE;;;;
Allegati
Prova.ods
(35.44 KiB) Scaricato 15 volte
Windows 10 - Open Office 4.1.1
Gaetanopr
Volontario
Volontario
Messaggi: 3300
Iscritto il: mercoledì 21 novembre 2012, 20:07

Re: Esportare range in file csv

Messaggio da Gaetanopr »

Devi effettuare almeno una modifica, avrai il file con la data inserita come valore e non come testo, prova a cambiare cliente ed esegui l'esportazione
LibreOffice 7.2.2.2 windows 10
Openoffice 4.1.13 su windows 10
ferro0099
Messaggi: 72
Iscritto il: giovedì 28 ottobre 2021, 18:44

Re: Esportare range in file csv

Messaggio da ferro0099 »

Gaetanopr ha scritto: venerdì 22 marzo 2024, 13:19 Devi effettuare almeno una modifica, avrai il file con la data inserita come valore e non come testo, prova a cambiare cliente ed esegui l'esportazione

:crazy: :super: :bravo: :knock:
Windows 10 - Open Office 4.1.1
Rispondi