Datagrid e word

venerdì 23 aprile 2004 - 11.55

l.corallini Profilo | Junior Member

Ciao a tutti,
ho la necessità di esportare dei dati su Word da una pagina aspx. Cerco di spiegare come è formata questa:
ho una datagrid in cui ho inserito una checkbox, una volta sezionata una o più checkbox clicco sul tasto Word che nelle mie intenzioni dovrebbe fare nell'ordine

- controllare gli items selezionati
- chiamare 3 funzioni che mi restituiscono 3 dataset passandogli i campi chiave
...ora arriva il bello...
- aprie word e farmi vedere i 3 dataset per ogni item selezionato con la checkbox.

ho provato con questo codice (lo stesso che ho utilizzato per l'esport in excel, e che ha funzionato, anche se in quel caso le "tabelle" da portare a video erano solo e sempre due)
ma mi da un errore il render della datagrid....


' Set the content type to Word.
Response.ContentType = "application/msword"
' Remove the charset from the Content-Type header.
Response.Buffer = True
Response.Charset = ""
Response.AddHeader("content-disposition", "inline; filename=stampa.doc")
Me.EnableViewState = False

Dim tw As New System.IO.StringWriter
Dim hw As New System.Web.UI.HtmlTextWriter(tw)

Dim cb As CheckBox
Dim dsItem As DataGridItem 'DataGridItem

For Each dsItem In DatagridTreni.Items

cb = CType(dsItem.Cells(13).Controls(1), CheckBox)
If cb.Checked Then
dsDettaglio = GestoreFasciaOraria.PercorsoTreno(dsItem.Cells(0).Text, dsItem.Cells(1).Text, dsItem.Cells(2).Text, dsItem.Cells(3).Text)
dsPercorso = GestoreFasciaOraria.PercorsoTreno(dsItem.Cells(0).Text, dsItem.Cells(1).Text, dsItem.Cells(2).Text, dsItem.Cells(3).Text)
dsComposizione = GestoreFasciaOraria.ComposizioneTreno(dsItem.Cells(0).Text, dsItem.Cells(1).Text, dsItem.Cells(2).Text, dsItem.Cells(3).Text)

DatagridPercorso.DataSource = dsPercorso
DatagridPercorso.DataBind()
DatagridComposizione.DataSource = dsComposizione
DatagridComposizione.DataBind()
DatagridPercorso.DataSource()
DatagridPercorso.RenderControl(hw)
Response.Write(tw.ToString())
End If
Next

Response.Flush()
Response.End()

è possibile utilizzare i dataset direttamente senza riempire delle datagrid?anche perchè dovrei crearle dinamicamente....
posso utilizzare qualche altra strada più semplice e più "intelligente"?
grazie


Brainkiller Profilo | Guru

Ciao, credo che il tuo approccio al problema non sia corretto, ora ti spiego.
Innazitutto tu il DataSet lo puoi usare come vuoi, fondamentalmente è una rappresentazione in memoria del Database. Il DataSet infatti può contenere tabelle, relazioni, records, e così via.
Per operare con Word o più in generale con gli strumenti di Office si può agire in diversi modi. Uno è quello che hai utilizzato tu, cioè modificare il content-type e dire che sta arrivando un documento di excel piuttosto che di Word. Questo però è possibile solo perchè Excel poi riesce ad interpretare correttamente tutto. Non ho mai provato con Word ma anche lui potrebbe riuscirci.

La via corretta però secondo me è utilizzare gli Office PIAs che sono praticamente degli assemblies .NET che ti consentono di interagire con l'Object Model degli strumenti di Office e quindi prenderne il controllo, eventualmente produrre documenti di word ufficiali da girare poi al client che ne fa richiesta.
Ho scritto qualcosa sui PIAs e qui puoi vedere qualcosa:
http://www.dotnethell.it/articles/article.aspx?ArticleID=96

Inoltre molte informazioni aggiuntive le puoi trovare nei vecchi Posts, è sufficiente digitare la keyword PIA nel modulino che trovi in alto e premere cerca.

fammi sapere.
ciao

david

l.corallini Profilo | Junior Member

sapevo di questa possibilità ma mi sembra che la possibilità di utilizzo sia limitata alla versione di office installata sui client.
comunque ho risolto il problema creando delle stringhe che poi con dei response.write mi faccio restituire a video. forse non è il modo più elegante o esemplare ma funziona.

per farti capire ecco uno stralcio di codice:

For Each dsItem In DatagridTreni.Items
cb = CType(dsItem.Cells(14).Controls(1), CheckBox)
If cb.Checked Then
dsPercorso = GestoreFasciaOraria.PercorsoTrenoWord(dsItem.Cells(0).Text, dsItem.Cells(1).Text, dsItem.Cells(2).Text, dsItem.Cells(3).Text)
dsComposizione = GestoreFasciaOraria.ComposizioneTrenoWord(dsItem.Cells(0).Text, dsItem.Cells(1).Text, dsItem.Cells(2).Text, dsItem.Cells(3).Text)
dsDettaglioSezione = GestoreFasciaOraria.TreniDettaglio(dsItem.Cells(0).Text, dsItem.Cells(1).Text, dsItem.Cells(2).Text, dsItem.Cells(3).Text)
dsSezione = GestoreFasciaOraria.GetSezioneTrenoSel(dsItem.Cells(0).Text, dsItem.Cells(1).Text, dsItem.Cells(2).Text, dsItem.Cells(3).Text)
dsPesoLunghezza = GestoreFasciaOraria.PesoLunghezzaTreno(dsItem.Cells(0).Text, dsItem.Cells(1).Text, dsItem.Cells(2).Text, dsItem.Cells(3).Text, dsItem.Cells(4).Text)
'DatagridPercorso.DataSource = dsPercorso
'DatagridPercorso.DataBind()
'DatagridComposizione.DataSource = dsComposizione
'DatagridComposizione.DataBind()
Dim dr As DataRow
Dim testo As String

'Creo Tabella Intestazione
testo = "<table border=1 cellSpacing='0'cellPadding='0' width=100%>"
Response.Write(testo)
testo = "<tr>"
Response.Write(testo)
testo = "<TD style='FONT-WEIGHT: bold; FONT-SIZE: x-small; FONT-FAMILY: verdana,arial,helvetica' align='center' bgColor='#d1dbef'>"
Response.Write(testo & dsDettaglioSezione.Tables(0).Rows(0).Item(4) & " - " & dsDettaglioSezione.Tables(0).Rows(0).Item(5))
testo = "</TD>"
Response.Write(testo)
testo = "</tr>"

Brainkiller Profilo | Guru

Beh non è proprio così.
La versione di Word installata sul client non c'entra niente, piuttosto quella sul Server.
Ti ricordo che stai sviluppando una applicazione ASP.NET quindi server side, quindi che conta è ciò che c'è sul server. Il client dovrà semplicemente leggere il documento prodotto.
Certo che se sul server c'è Office 2003 e sul client Office 95 forse non riuscira ad aprire quei file .doc.

La tua soluzione può funzionare ma l'utilizzo del Response.Write è ormai obsoleto e poco flessibile rispetto agli strumenti a disposizione oggi con ASP.NET.

ciao
david
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