Scrittura File Excel da datatable

venerdì 07 novembre 2008 - 16.24

Sig. Travis Profilo | Junior Member

Perchè non funzeca?

Dim i, j As Integer
Dim righe As Integer = k.Rows.Count
Dim colonne As Integer = k.Columns.Count

For i = 0 To i > righe
For j = 0 To j > colonne
Dim range As Range = sht.Cells(i + 1, j + 1)
range.Value2 = k.Rows(i)(j).ToString()
j = j + 1
Next j
i = i + 1
Next i

Questo è il ciclo che ho scritto; righe viene impostato a 3294 e colonne a 7(giustamente). Al termine del primo giro esce dal ciclo.
Non sono pratico di VB, ho scritto la routine in VB perchè il COBOL Fujitsu for .NET che adopero normalmente, non consente di utilizzare in maniera semplice le classi PIA di excel ed allora richiamo la classe VB.
Aggiungo che alla fine il contenuto della prima cella, l'unico che legge e scrive, è perfetto.

Grazie,
Ciao\G

alx_81 Profilo | Guru

>Questo è il ciclo che ho scritto; righe viene impostato a 3294
>e colonne a 7(giustamente). Al termine del primo giro esce dal ciclo.
Normale:

> For i = 0 To i > righe
> For j = 0 To j > colonne
i è effettivamente a i così come j è uguale a j

per fare quello che ti serve dovresti fare questo:

For i = 0 To righe -1 For j = 0 To colonne -1 Dim range As Range = sht.Cells(i + 1, j + 1) range.Value2 = k.Rows(i)(j).ToString() Next Next

l'incremento è automaticamente gestito dal FOR.. NEXT.

>Grazie,
Di nulla!

--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

Sig. Travis Profilo | Junior Member

Uè Ale grazie, funziona; mi sai dare una dritta su come inserire l'header di colonna che così è parecchio bruttino?

Grazie di nuovo,
Ciao\G

alx_81 Profilo | Guru

>Uè Ale grazie, funziona; mi sai dare una dritta su come inserire
>l'header di colonna che così è parecchio bruttino?
Se non ricordo male, devi scorrere la collection Columns dell'oggetto Worksheet..
Allo stesso modo in cui scorri celle e righe..

--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

Sig. Travis Profilo | Junior Member

Hai del codice di esempio per caso?

Grazie,
Ciao\G

alx_81 Profilo | Guru

>Hai del codice di esempio per caso?
forse non le puoi cambiare..
leggi qui:

http://www.excelforum.com/excel-general/381504-can-i-change-column-header-names.html

--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

Sig. Travis Profilo | Junior Member

Ciao scusa ma io non vorrei cambiare l'header delle colonne, ma solo inserire il nome delle colonne nella prima riga del foglio excel, quindi subito sotto la riga dell'header.

Grazie e buona notte,
Ciao\G

alx_81 Profilo | Guru

>Ciao scusa ma io non vorrei cambiare l'header delle colonne,
>ma solo inserire il nome delle colonne nella prima riga del foglio
>excel, quindi subito sotto la riga dell'header.
Devi aggiungere i nomi di colonna prima di eseguire la tua procedura.
Ora, dipende dove hai i nomi di colonna. Se li prendi da un ulteriore array, lo cicli e nella prima riga scrivì
i il contenuto. Altrimenti, posizionalmente, vai a scrivere il testo nelle celle della prima riga..

--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

Sig. Travis Profilo | Junior Member

Grazie dell'aiuto!
Ciao\G

alx_81 Profilo | Guru

>Grazie dell'aiuto!
di nulla!

--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

Sig. Travis Profilo | Junior Member

OOPS!

Mi sono accorto che mangio la prima riga! In un ciclo del genere, come faccio a dirgli di startare la scrittura dalla cella "A2"?

Codice:

' Passo i dati dal DataTable al Worksheet Excel.
Dim i, j As Integer
Dim righe As Integer = k.Rows.Count
Dim colonne As Integer = k.Columns.Count

For i = 0 To righe - 1
For j = 0 To colonne - 1
Dim range As Range = sht.Cells(i + 1, j + 1)
If range Is Nothing Then
mc = "ERRORE: Creazione Range Foglio Excel Fallita!"
rc = 1
Exit Function
End If
range.Value2 = k.Rows(i)(j).ToString()
Next j
Next i

' Prima Riga del foglio Excel.
sht.Range("A1").Value2 = "Programma"
sht.Range("B1").Value2 = "Paragrafo"
sht.Range("C1").Value2 = "Riga"
sht.Range("D1").Value2 = "Codice"
sht.Range("A1", "D1").Font.Bold = True

Grazie ancora,
Ciao\G

alx_81 Profilo | Guru

>OOPS!
>
>Mi sono accorto che mangio la prima riga! In un ciclo del genere,
>come faccio a dirgli di startare la scrittura dalla cella "A2"?
Hai provato a mettere prima le intestazioni e poi a fare i tuoi cicli spostandoti di uno come riga?
--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

Sig. Travis Profilo | Junior Member

Si ho provato ma se lo inserisco prima del ciclo di scrittura del datatable nel foglio excel, il ciclo di scrittura successivo sovrascrive la prima riga(poichè parte dall'indice 0 nel quale è contenuto il primo elemento del DataTable).

Se lo inserisco successivamente, ottengo l'effetto contrario, ossia sovrascrivo la prima riga del Foglio excel mangiandomi i dati buoni.

Ma che devo necessariamente aprire una connessione OLEDB per effettuare una INSERT SQL?

Grazie,
Ciao\G

alx_81 Profilo | Guru

>Si ho provato ma se lo inserisco prima del ciclo di scrittura
>del datatable nel foglio excel, il ciclo di scrittura successivo
>sovrascrive la prima riga(poichè parte dall'indice 0 nel quale
>è contenuto il primo elemento del DataTable).
>Se lo inserisco successivamente, ottengo l'effetto contrario,
>ossia sovrascrivo la prima riga del Foglio excel mangiandomi
>i dati buoni.
in questa riga, tu scrivi nell' i-esima riga.. prova (i+1)-esima

range.Value2 = k.Rows(i)(j).ToString()

che diventa

range.Value2 = k.Rows(i+1)(j).ToString()

>Ma che devo necessariamente aprire una connessione OLEDB per effettuare una INSERT SQL?
Da excel? sì.
--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

Sig. Travis Profilo | Junior Member

Ho provato così come hai consigliato; purtroppo mangia anche l'ultima riga adesso e quindi riporto tutto come prima.

Volendo inserire la prima riga direttamente nel DataTable e quindi prima della scrittura sul foglio excel, come faccio ad indicargli la posizione in cui la volgio inserire? Il codice per inserirla è già scritto e molto semplice, però ovviamente lo inserisce in fondo(per capirci se nel dtattable ho 3294 righe, inserisce la 3295esima).

Per inserirla in posizione 1 come posso fare?

Grande che sei ad avere così tanta pazienza.......
Ciao\G

alx_81 Profilo | Guru

>Ho provato così come hai consigliato; purtroppo mangia anche
>l'ultima riga adesso e quindi riporto tutto come prima.
>Per inserirla in posizione 1 come posso fare?
devi usare il metodo InsertAt della collection delle Rows del Datatable:

DataRowCollection.InsertAt Method
http://msdn.microsoft.com/en-us/library/system.data.datarowcollection.insertat.aspx

>Grande che sei ad avere così tanta pazienza.......
eeeeeeeeeeh, grazie

--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

Sig. Travis Profilo | Junior Member

Scusa ancora ma deve essere riferito ad un DataTable e non riesco a trovare il modo per associare il DataRowCollection al DataTable.


Ciao\G

alx_81 Profilo | Guru

>Scusa ancora ma deve essere riferito ad un DataTable e non riesco
>a trovare il modo per associare il DataRowCollection al DataTable.

TuoDataTable.Rows.InsertAt(cosa, posizione)

metti posizione a 0 e sei a posto.

--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

Sig. Travis Profilo | Junior Member

Buongiorno Guru,

scrivo questo codice ma neanche lo compila: sapresti dirmi dove sbaglio?

Dim NuovaRiga As DataRow
Dim Pos As Integer = 0

NuovaRiga("Programma") = "Programma"
NuovaRiga("Paragrafo") = "Paragrafo"
Dim RigaS As String = "0.0"
Dim RigaD As Double = RigaD.ToString(RigaS)
NuovaRiga("Riga") = RigaD
NuovaRiga("Codice") = "Codice"
Dim PrimaRiga As System.Data.DataRowCollection = k.Rows.InsertAt(NuovaRiga, Pos)

Mi dà errore appunto lì dove definisco la collection di righe associata al DataTable: mi dice che l'espressione non produce un valore.

K'aggià fà?

Ciao\G

alx_81 Profilo | Guru

>Buongiorno Guru,
>
>scrivo questo codice ma neanche lo compila: sapresti dirmi dove
>sbaglio?
>Mi dà errore appunto lì dove definisco la collection di righe
>associata al DataTable: mi dice che l'espressione non produce
>un valore.
>K'aggià fà?
Hai scritto male.. non si usa così

' torno l'istanza della riga di un particolare datatable Dim NuovaRiga As DataRow = k.NewRow() ' variabili di lavoro Dim RigaS As String = "0.0" Dim RigaD As Double = RigaD.ToString(RigaS) ' imposto i valori (le celle devono essere di tipo stringa se vuoi mettere le stringhe!!) NuovaRiga("NOMECOLONNA1") = "Programma" NuovaRiga("NOMECOLONNA2") = "Paragrafo" NuovaRiga("NOMECOLONNA3") = RigaD NuovaRiga("NOMECOLONNA4") = "Codice" ' aggiungo la riga k.Rows.InsertAt(NuovaRiga, 0)

--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

Sig. Travis Profilo | Junior Member

Perfetto! Sei un grandissimo.......
Ciao\G
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