Newsgroup: it.comp.www.asp
Titolo: Creare un file WORD

Salve il mio nome è Franco Giacobbi.
Il mio problema è il seguente.
Dopo aver fatto riempire un modulo ad un utente la mia pagina ASP provvede a
fornire un testo in formato HTML all'utente.
I dati del modulo vengono memorizzati in DB.
Vorrei produrre lo stesso testo in formato WORD e permettere il DOWNLOAD.
Premetto che conosco bene VBA e non so se questo può essere utile.
Vorrei sapere solo come potrei procedere..
Grazie per la collaborazione.
f.gia...@dcp.cnr.it

La cosa non è semplicissima, ma in linea di massima si tratta di produrre
via ole automation l'esecuzione di una sequenza di operazioni che si
concludano poi alla fine con la generazione di un file e con il suo
salvataggio.
Facciamo cosi': tu produci la funzione vba che esegue, prendendo come input
i parametri variabili (gli ingressi della form?) ed il nome del file che il
doc dovra' avere, tutte le operazioni che ti servono; ed io ti scrivo il
codice per aprire un oggetto word, far partire la macro e chiudere l'oggetto
word lato server. Il tutto puo' produrre un carico notevole sul server
quindi se non e' realmente indispensabile ti consiglio di desistere.
Ciao, Fabio Zed Zamparelli
P.S. se ti puo' essere utile un file .hlp sulla ole automation scrivimi in
mail.

salvataggio.
Temo che la cosa sia ancora piu' complessa!
Word e' un eseguibile e non una dll e pertanto asp non lo puo' usare
direttamente, penso per questioni di sicurezza.
L'unico modo e' realizzare una dll che interfacci asp con word e farla
girare sotto Transaction Server!
Un bel casino  :-))
Ciao
Stefano

A naso direi che ti sbagli, su word non ci giurerei, dammi due giorni e ne
riparliamo.
Ma su excel sono sicuro: io apro fogli modifico celle faccio partire macro,
esporto grafici, salvo fogli ed esco  "tranquillamente" (se il server regge
il carico).
A presto, Fabio Zed Zamparelli di ritorno dalla sua settimana di mare.


^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v
Moderatore di it.comp.www.asp
Gruppo di supporto: 
http://www.asp-it.com/index.asp?ng
News via web: 
http://www.asp-it.com/newsgroup/news/
^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v
Hai bisogno di un lavoro nel campo delle ASP? Lo cerchi
o lo offri? Trovalo subito! 
http://www.asp-it.com/jobfinder

 
Esiste anche una soluzione più semplice da realizzare anche se un pò maccheronica.
Sulla macchina dovranno essere installati Windows NT 4 con Service Pack 4 e Option Pack 4 ed ovviamente Word 97, tenendo presente che nella configurazione standard di Office non viene installata la documentazione relativa al Visual Basic di Word (contenuta nel file Vbawrd8.hlp) che quindi va aggiunta ricorrendo all'installazione personalizzata. Inoltre va sottolineato che nell'interfacciamento fra VBA e VBSCRIPT possono generarsi degli errori Type Mismatch che sono risolti dalla SR-1 di Office come descritto in 
http://support.microsoft.com/support/kb/articles/q174/4/69.asp
Per motivi di sicurezza le impostazioni di base di IIS 4 non permettono l'esecuzione di oggetti esterni al processo pertanto occorre abilitare esplicitamente tale  funzione riducendo il livello di sicurezza del server. Vi invito quindi a fare una valutazione preventiva prima di effettuare le operazioni che seguono.
Esiste un documento on-line di MSDN all'indirizzo: 
http://msdn.microsoft.com/workshop/server/components/outproc.asp
 che spiega i passi necessari per abilitare l'esecuzione di oggetti esterni al processo che in sintesi può realizzarsi mediante il seguente script:
   On Error Resume Next
'   Get the IIsWebService Admin object
    Set oWebService = GetObject("IIS://LocalHost/W3svc")
    If (Err.Number <> 0) Then
        ReportError ()
    End If
'   Enable AspAllowOutOfProcComponents
    oWebService.Put "AspAllowOutOfProcComponents", True
    If (Err.Number <> 0) Then
        ReportError ()
    End If
'   Save the changed value to the metabase
    oWebService.SetInfo
    If (Err.Number <> 0) Then
        ReportError ()
    End If
Sub ReportError ()
    Dim ErrorDescription
    Select Case (Err.Number)
        Case &h80070003
            ErrorDescription = "The path requested could not be found."
        Case &h80070005
            ErrorDescription = "Access is denied for the requested path or property."
        Case &h80070094
            ErrorDescription = "The requested path is being used by another application."
        Case Else
            ErrorDescription = Err.Description
    End Select
    WScript.Echo ErrorDescription
    WScript.Echo "ErrNumber: " & Err.Number & " (0x" & Hex(Err.Number) & ")"
End Sub
Lo script va salvato con estensione .vbs ed eseguito mediante cscript o wscript.
ATTENZIONE - PRIMA DI EFFETTUARE QUESTA OPERAZIONE È NECESSARIO EFFETTUARE IL BACKUP DEL FILE C:\WINNT\SYSTEM32\INETSRV\METABASE.BIN DA MMC! - METABASE.BIN CONTIENE TUTTE LE IMPOSTAZIONI DI IIS E LA SUA CORRUZIONE PUÒ COMPORTARE IL NON FUNZIONAMENTO DELL'INTERO SERVER.
Dopo aver fatto la modifica occorre impostare la proprietà Run In Separate Memory Space da MMC per la directory contenente l'applicazione e riavviare il server.
Passiamo ora a vedere come realizzare la comunicazione fra il server e Word.
Esistono due metodi per accedere a Word: il primo consiste di avviare un'istanza di Word ogni volta che risulti necessario realizzare un documento mentre la seconda consiste nel eseguire il programma come oggetto avente scope application accertandosi che possa essere utilizzato da un utente alla volta.
Il primo metodo richiede molta memoria RAM e il tempo necessario a lanciare ogni volta un'istanza di Word mentre il secondo metodo implica l'impossibilità di generare due documenti per due utenti diversi contemporaneamente. Ovviamente è necessaria un'attenta valutazione prima decidere quale metodo utilizzare basandosi sul numero di accessi concorrenti, la quantità di RAM installata, i tempi di esecuzione ecc. Di seguito analizzeremo il secondo metodo.
La realizzazione di un'istanza di Word avente scope application può avvenire mediante la seguente istruzione da inserire nel file global.asa:
<OBJECT RUNAT=Server SCOPE=Application ID=wrdApp PROGID="Word.Application">
</OBJECT>
<SCRIPT LANGUAGE="VBScript" RUNAT="Server">
Sub Application_OnStart
        wrdApp.Visible = False
End Sub
Sub Application_OnEnd
        wrdApp.Quit(0)
        set wrdApp = Nothing
End Sub
</SCRIPT>
in questo modo Word potrà essere invocato da qualsiasi pagina asp mediante wrdApp e, poichè abbiamo detto che non si possono avere due accessi concorrenti all'oggetto, la pagina asp dovrà bloccare l'applicazione e poi accedere all'oggetto stesso:
<%
        application.lock
'       Esecuzione dell'elaborazione mediante word
        application.unlock
%>
Il secondo passo consiste nel cancellare tutti i documenti eventualmente rimasti aperti per cause varie
<%
        application.lock
        For Each MyDoc In wrdApp.Documents
            MyDoc.Close(0)
        Next
'       Esecuzione dell'elaborazione mediante word
        application.unlock
%>
Vediamo che è possibile invocare Word mediante l'identificativo dichiarato in global.asa (wrdApp).
Successivamente si dovrà realizzare un nuovo documento partendo da un modello predefinito:
<%
        application.lock
        For Each MyDoc In wrdApp.Documents
            MyDoc.Close(0)
        Next
        Root = "c:/InetPub/wwwroot"
        Folder = "/Word"
        Template = Folder & "/Modelli/ModelloDocumento.dot"
        Docs = Folder & "/Docs"
        File = "Prova.doc"
        Set MyDoc = wrdApp.Documents.Add(Root & Template)
'       Esecuzione dell'elaborazione mediante word
        MyDoc.SaveAs(Root & Docs & "/" & File)
        MyDoc.Close(0)
        application.unlock
        response.write("<a href='" & Docs & "/" & File & "'>Il documento generato</a>")
%>
E' consigliabile definire dei segnalibri all'interno del modello di partenza in modo da rendere più semplice il posizionamento del punto di inserimento del testo o l'eventuale cancellazione:
        MyDoc.Bookmarks("NomeSegnalibro").Select
        wrdApp.Selection.InsertAfter("testo da inserire")
oppure
        MyDoc.Bookmarks("NomeSegnalibro").Select
        wrdApp.Selection.Delete
Saluti,
            Oscar 

Leggero' con piu' attenzione il post e i link da te indicati, ma come mai io
allora riesco (senza ulteriori modifiche al discorso esecuzione di un
processo in un contesto diverso) a pilotare oggetti excell?
Scusa se non ho capito bene ed ho postato prima di un attenta lettura del
tuo post e grazie, quando qualcuno manda dei post cosi' chi non se li salva
e mette da parte e' proprio un fessacchiotto.
Fabio Zed Zamparelli

 processo in un contesto diverso) a pilotare oggetti excell?
Purtroppo non ho fatto prove con excel in quanto non ho mai avuto la necessitą di utilizzarlo e quindi non ho elementi per rispondere al tuo giusto interrogativo. Comunque posso dirti che all'inizio dello sviluppo della mia applicazione avevo fatto dei piccoli script di prova che tramite WSH funzionavano correttamente; al contrario ASP mi restituiva un messaggio di errore riguardante l'impossibilitą di eseguire oggetti fuori dal contesto.
Ciao,
            Oscar

riguardante l'impossibilitą di eseguire oggetti fuori dal contesto.
come li hai dichiarati? e sopratutto, sotto che utente giravano? certe volte
per far funzionare tutto al meglio, č necessario farli girare sotto un
utente con privilegi di amministratore.
--


 CIAO!.db
Li ho provati tramite l'utente anonimo e tramite amministratore ma il risultato non cambiava, comunque il documento 
http://msdn.microsoft.com/workshop/server/components/outproc.asp
 fa riferimento proprio all'utilizzo di Word come server COM:
What Is an Out-of-Process Component?
Out-of-process components are COM components implemented as executables that launch as a separate process on the same computer as the client application. Out-of-process components are also called "local servers." Out-of-process components are different from out-of-process applications (also known as isolated processes). When you launch an out-of-process component on the Web server, IIS becomes the client application. 
COM objects are implemented inside a server. Most of the time, the COM server is implemented as a DLL that executes in the same process as the client application. Sometimes the COM server is implemented as an executable that runs in a separate process from the client. For instance, when you create an instance of an Active Document server such as Microsoft Word, you actually launch a copy of the server application. When you instantiate such an object from Active Server Pages (ASP), you create a new process on the Web server. Because the Active Document server is an executable rather than a DLL, it cannot be loaded into the IIS process. 
When you use Server.CreateObject in an ASP page to launch an out-of-process component, and IIS has not been configured to allow out-of-process components, it will return the following error: 
Server object error 'ASP 0196'
Cannot launch out of process component
/myvroot/launch_exe.asp, line 16
This is the result of an ASP safety mechanism that prevents executables (but not DLLs) from being launched directly from ASP. 
There are several reasons for this safeguard. Not all executables are safe to use on the server, and some may pose security risks. Also, because in-process component DLLs are faster, more secure, and can be hosted by Microsoft® Transaction Server (MTS), they are much better suited for server-side use. 
Further, out-of-process components often create individual server processes for each object instance, reducing their performance to that of CGI applications. They simply do not scale as well as component DLLs that run in-process with IIS or MTS. If performance and scalability are priorities for your site, using out-of-process components is strongly discouraged. On the other hand, intranet sites that receive moderate to low traffic might be able to use an out-of-process component without adversely affecting the site's overall performance. 
Ciao,
            Oscar

What Is an Out-of-Process Component?
Anch'io dovevo usare un server ole out-of-process da me realizzato ma visto
l'incompatibilita' con ASP (anche se in realta' dice che volendo si possono
usare cambiando qualche configurazione pero' e' estremamente sconsigliato)
ho risolto creando un'altra dll, quindi un component in-process, la quale
creava un oggetto che faceva riferimento al server ole.
In questa dll ho messo un oggetto con proprieta' e metodi che mi fanno da
collegamento tra la pagina asp ed il server ole ed il tutto funziona
egregiamente.
Giorgio Leonardi

 
Avevo immaginato anche una soluzione del genere ma purtroppo non dispongo di compilatori VB o C++ per cui ho dovuto ricorrere alla soluzione maccheronica che ho descritto.
Ti ringrazio comunque per la dritta che terro' presente per il futuro.
Ciao,
            Oscar