2016-03-31 69 views
6

Ho una funzione di "esportazione in parola" nella mia applicazione. Funziona perfettamente. Uso il contenuto di gridview esportato in un file word.Aggiungere intestazione/piè di pagina nel file di parole esportato da ASP.NET

Ora voglio aggiungere intestazione/piè di pagina in file word esportato che viene generato dal codice qui sotto:

Dim fileName As String = "Test_" & Format(DateTime.Now, "MMddyyyyhhmmss") & ".doc" 
Dim sw As New StringWriter() 
Dim w As New HtmlTextWriter(sw) 
gvContent.RenderControl(w) 
Dim content As String = sw.GetStringBuilder().ToString() 
Response.Clear() 
Response.AddHeader("Content-Disposition", "attachment; filename=" & fileName) 
Response.Charset = "" 
Response.ContentType = "application/vnd.ms-word" 
Response.Write(finalContent) 
Response.Flush() 
Response.End() 

Anche il piè di pagina di intestazione & dovrebbe essere visualizzato in tutte le pagine del file word, yust come quando utilizzando la funzione di intestazione/piè di pagina di Word.

È possibile? Qualcuno ha un'idea per questo?

+0

Hai provato Response.AppendHeader –

+0

Beh, penso che response.header sia per la meta header del file, non per l'intestazione del file vero e proprio. Se hai qualche esempio, per favore mostramelo. –

+1

In realtà non stai esportando un file word. Esporti HTML e lo salvi in ​​un file .doc per ingannare Word ad aprirlo. Avrai bisogno di usare speciali attributi ed elementi MS Word HTML per ottenere ciò che desideri. Il modo più semplice sarebbe probabilmente quello di creare un documento Word con un'intestazione e un piè di pagina e quindi salvarlo come file HTML. Oppure prendere in considerazione il passaggio a una libreria che genera veri file di Word, come Open XML SDK o DocX. I file generati potrebbero confondere i client Word che non si aspettano l'HTML in un file .doc. – mason

risposta

2

Quello che stai facendo è in realtà la creazione di un file HTML e dandogli un'estensione che Word sa di aprire. Non stai creando un vero file .DOC, ma Word riconoscerà l'HTML e lo mostrerà.

Sospetto che il sapore dell'HTML che sta cercando sia identico al sapore in cui salva. Così ho creato un nuovo documento in Word 2013, aggiunto intestazioni e piè di pagina e salvato come file HTML. Dopo aver esaminato il file HTML, sembra che Word li lasci fuori. Quindi dubito che ci sia un modo per specificare intestazioni e piè di pagina nei file HTML che apre.

Quello che puoi fare è passare alla generazione di file veri MS Word. Questi avranno un miglior supporto tra vari client Word e equivalenti di Word (come versioni Mac, versioni mobili e Libre Office).

Micrsoft fornisce una libreria per la generazione di file .DOCX, denominata Open XML SDK. Tuttavia, ho trovato che è un po 'difficile da usare.

Personalmente ho usato DocX un paio di volte. Ecco come ci si realizzare questo con quella libreria (codice preso dal this blog post):

C#

// Create a new document. 
using (DocX document = DocX.Create(@"Test.docx")) 
{ 
    // Add Header and Footer support to this document. 
    document.AddHeaders(); 
    document.AddFooters(); 

    // Get the default Header for this document. 
    Header header_default = document.Headers.odd; 

    // Get the default Footer for this document. 
    Footer footer_default = document.Footers.odd; 

    // Insert a Paragraph into the default Header. 
    Paragraph p1 = header_default.InsertParagraph(); 
    p1.Append("Hello Header.").Bold(); 

    // Insert a Paragraph into the document. 
    Paragraph p2 = document.InsertParagraph(); 
    p2.AppendLine("Hello Document.").Bold(); 

    // Insert a Paragraph into the default Footer. 
    Paragraph p3 = footer_default.InsertParagraph(); 
    p3.Append("Hello Footer.").Bold(); 

    // Save all changes to this document. 
    document.Save(); 
}// Release this document from memory. 

VB.NET (come tradotto da Telerik perché non so VB.NET)

' Create a new document. 
Using document As DocX = DocX.Create("Test.docx") 
    ' Add Header and Footer support to this document. 
    document.AddHeaders() 
    document.AddFooters() 

    ' Get the default Header for this document. 
    Dim header_default As Header = document.Headers.odd 

    ' Get the default Footer for this document. 
    Dim footer_default As Footer = document.Footers.odd 

    ' Insert a Paragraph into the default Header. 
    Dim p1 As Paragraph = header_default.InsertParagraph() 
    p1.Append("Hello Header.").Bold() 

    ' Insert a Paragraph into the document. 
    Dim p2 As Paragraph = document.InsertParagraph() 
    p2.AppendLine("Hello Document.").Bold() 

    ' Insert a Paragraph into the default Footer. 
    Dim p3 As Paragraph = footer_default.InsertParagraph() 
    p3.Append("Hello Footer.").Bold() 

    ' Save all changes to this document. 
    document.Save() 
End Using 
' Release this document from memory. 

Si noti che il codice precedente è stato preso da un post sul blog scritto nel 2010. È probabile che la libreria sia cambiata nel corso degli ultimi sei anni.

+0

Ok, ci proverò. Come posso aggiungere il contenuto della mia griglia qui? –

+0

@PiyushKhatri Non vorrei rendere GridView. Invece, renderei i dati sottostanti (es. Il modello o DataTable che hai associato a GridView). Esamina le [opzioni che DocX ha per le tabelle incorporate] (http://cathalscorner.blogspot.com/2010/06/docx-and-tables.html). – mason