Esportare risultato query in un file Excel

sabato 03 aprile 2010 - 00.21

nikkysixx Profilo | Junior Member

Ciao a tutti,volevo porre un quesito abbastanza ricorrente e comune,ma nonostante abbia letto diverse cose a riguardo da fonti diverse , continuo a non capire come si possa esportare il risultato di una query in un file excel

O meglio, in vba/access ci riuscivo con semplicita' col comando
DoCmd.OutputTo acOutputQuery, "query", acFormatXLS, Path & "NomeFile.xls", True

Ma non so proprio come tradurla...

Grazie ;)

p.s. utilizzo vb2008

kataklisma Profilo | Senior Member

Ciao!


La procedura totale è un po lunghetta, ma ho trovato un'esempio, quindi ti riporto su una pagina del support Microsoft che spiega un po la procedura :)

C#
http://support.microsoft.com/default.aspx?scid=kb;en-us;311194

VB.Net
http://support.microsoft.com/default.aspx?scid=kb;en-us;308247

fammi sapere se è quello che ti serve altrimenti troviamo un'altra soluzione ;)
Ignazio Catanzaro

http://blogs.dotnethell.it/swdev/

nikkysixx Profilo | Junior Member

Ci siamo quasi :D Il problema è in questa parte,ovvero il percorso da dare al file generato


'Set a virtual folder to save the file.
'Make sure that you change the application name to match your folder.
filePath = "c:"
fileName = filePath & "\" & fileExcel

'Use FileStream to create the .xls file.
objFileStream = New FileStream(fileName, FileMode.OpenOrCreate, FileAccess.Write)
objStreamWriter = New StreamWriter(objFileStream)

'Use a DataReader to connect to the Pubs database.
cnn.Open()
Dim sql As String = "select au_id,au_lName,au_fname,phone," & _
"address,city,state,zip,contract from authors"
Dim cmd As SqlCommand = New SqlCommand(sql, cnn)
Dim dr As SqlDataReader
dr = cmd.ExecuteReader()

'Enumerate the field names and records that are used to build the file.
For i = 0 To dr.FieldCount - 1
strLine = strLine & dr.GetName(i).ToString & Chr(9)
Next

'Write the field name information to file.
objStreamWriter.WriteLine(strLine)

'Reinitialize the string for data.
strLine = ""

'Enumerate the database that is used to populate the file.
While dr.Read()
For i = 0 To dr.FieldCount - 1
strLine = strLine & dr.GetValue(i) & Chr(9)
Next
objStreamWriter.WriteLine(strLine)
strLine = ""
End While

'Clean up.
dr.Close()
cnn.Close()
objStreamWriter.Close()
objFileStream.Close()


Cosi facendo viene creato un file excel in c:\ col risultato della query...ma vorrei se possibile o metterlo sul desktop,o aprirlo in automatico...è possibile?

Spero riuscirai ad illuminarmi di nuovo ^^



kataklisma Profilo | Senior Member

Per trovare dinamicamente il percorso della cartella desktop puoi usare questa procedura :

string path = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);


(ovviamente aggiungi \nomeFile.xml)

Per aprire il file in automatico con excel puoi usare la Process.Start();

Fammi sapere ;)
Ignazio Catanzaro

http://blogs.dotnethell.it/swdev/

nikkysixx Profilo | Junior Member

Complimenti,sia per la velocità sia per la competenza,funziona perfettamente con
System.Diagnostics.Process.Start(fileName, filePath) e anche l altra procedura

Ora c è solo un piccolissimo problema,cui magari puoi darmi risposta, in pratica nel utilizzare questo metodo,all apertura di ogni file creato mi appare un avviso

Il formato del file xxxx.xls è diverso da quello specificato dall estensione del file.Prima di aprire il file verificare che non sia danneggiato o provenga da fonte attendibile. Si / No

Premendo si , appare correttamente il risultato.... ma sarebbe possibile evitare questo controllo che tu sappia?

kataklisma Profilo | Senior Member

>Complimenti,sia per la velocità sia per la competenza,funziona
>perfettamente con
>System.Diagnostics.Process.Start(fileName, filePath) e anche
>l altra procedura
Grazie, lo faccio sempre con piacere ;)

>Ora c è solo un piccolissimo problema,cui magari puoi darmi risposta,
>in pratica nel utilizzare questo metodo,all apertura di ogni
>file creato mi appare un avviso
>
>Il formato del file xxxx.xls è diverso da quello specificato
>dall estensione del file.Prima di aprire il file verificare che
>non sia danneggiato o provenga da fonte attendibile. Si / No
>
>Premendo si , appare correttamente il risultato.... ma sarebbe
>possibile evitare questo controllo che tu sappia?
Dove appare questo alert? Excel o è un'exception del tuo programma? Non mi è mai capitata, a dire il vero una situazione del genere ma cosi, a naso direi che l'alert te lo mostra Excel, il testo è comunque chiaro, c'è un'incongruenza tra l'estensione del file e l'effettivo formato.

Se utilizzi Excel 2007 prova ad utilizzare questa estensione

.xlsx

Aspetto tue notizie.

Ignazio Catanzaro

http://blogs.dotnethell.it/swdev/

nikkysixx Profilo | Junior Member

Allora,effettivamente utilizzo office 2007,e se rinomino il file in .xlsx mi dice semplicemente che il file è danneggiato senza neanche aprirlo,mentre lasciandolo cosi' in .xls mi chiede una conferma,e premendo si la tabella risultante è perfetta... quindi o è il codice che ho modificato ad avere qualche errore oppure brancolo nel buio
Allego il codice completo,cosi puoi dargli uno sguardo,e grazie ancora ^^
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

kataklisma Profilo | Senior Member

Puoi gentilmente inviarmi il file generato dal tuo programma che gli do un'occhiata?

Contattami dal blog che ti do la mia mail, oppure allega il file al post.

Ignazio Catanzaro

http://blogs.dotnethell.it/swdev/

nikkysixx Profilo | Junior Member

Ecco a te ,il file risultato si chiama
1318_Foglio 1841452586.zip

kataklisma Profilo | Senior Member

> Ecco a te ,il file risultato si chiama
>1318_Foglio 1841452586.zip
>
>
Proprio come pensavo, il file generato, giustamente non include alcune "direttive" che excel include durante un salvataggio di un file.

Per farla breve, apri con il blocco note un file generato da Excel, e il tuo file e nota le differenze!

Utilizzando quel tipo di approccio, non esiste una soluzione a questo problema.
------------------------------------------
Ignazio Catanzaro

http://blogs.dotnethell.it/swdev/

nikkysixx Profilo | Junior Member

No problem,risolvero'questo problema in futuro l importante è avermi dato una dritta ;) grazie ancora
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5