none
ASP.NET WORD RRS feed

  • Domanda

  • ciao a tutti,

    ho questo problema: lanciando word da un applicazione asp.net word non è visibile nonostante abbia settato visible = true. Il documento word viene aperto, ma non visualizzato, le modifiche vengono fatte e salvate correttamente.

    Esempio di codice:

    Application ap = new Application();
                try
                {  
                    Document doc = ap.Documents.Open( @"D:\TestDoc.docx", ReadOnly: false, Visible: true );
                    doc.Activate(); 
                    Selection sel =  ap.Selection;

                    //ContentControls ccList = doc.SelectContentControlsByTag("Company");


                    //foreach (ContentControl ctrl in ccList)
                    //{
                    //    ctrl.Range.Text = "TEST: valorizzazione da C#.";
                    //    MessageBox(ctrl.Title);
                    //}


                    ContentControls ccList = doc.ContentControls;


                    foreach (ContentControl ctrl in ccList)
                    {
                        ctrl.Range.Text = "WORD: CONTENT TYPE C#";
                        MessageBox(ctrl.Title);
                    }

                    if ( sel != null ) 
                    {     
                        switch ( sel.Type )   
                        {       
                            case WdSelectionType.wdSelectionIP:   
                                sel.TypeText( DateTime.Now.ToString() );        
                                sel.TypeParagraph();           
                                break;            
                            default:             
                                MessageBox("Tipo di selezione non gestita; nessuna modifica apportata.");   
                                break;  
                        }         
                        // rimuove tutti i meta data.      
                        // doc.RemoveDocumentInformation( WdRemoveDocInfoType.wdRDIAll );     
                        ap.Documents.Save( NoPrompt: true, OriginalFormat: true );    
                    }  
                    else
                    {
                        MessageBox("Selezione non definita; nessuna modifica apportata."); 
                    }   
                    ap.Documents.Close( SaveChanges: false, OriginalFormat: false, RouteDocument: false ); 
                }
                catch ( Exception ex )
                {
                    MessageBox("Eccezione: " + ex.Message); // documento già aperto, word già avviato, ...
                }
                finally
                {   
                    // Ambiguity between method 'Microsoft.Office.Interop.Word._Application.Quit(ref object, ref object, ref object)' and non-method 'Microsoft.Office.Interop.Word.ApplicationEvents4_Event.Quit'. Using method group.  
                    // ap.Quit( SaveChanges: false, OriginalFormat: false, RouteDocument: false ); 
                    ( (_Application)ap ).Quit( SaveChanges: false, OriginalFormat: false, RouteDocument: false );  
                    System.Runtime.InteropServices.Marshal.ReleaseComObject( ap );
                }

     

    grazie

    stefano

     

    lunedì 15 novembre 2010 11:34

Risposte

  • stegra scriveva il 16/11/2010 :

    ciao ti ringrazio per la risposta, ho capito quanto mi stai dicendo, già dal post precedente :-), per cui, secondo te, il problema non ha soluzione in ambito asp.net?

    grazie

    stefano

     

    Potresti elaborare il file lato server (ma senza pretendere di visualizzarlo), poi "spedire" il file sul protocollo HTTP cambiando ad esempio il content type della response.

    In pratica per "spedire" un file word su HTTP ti basta eseguire qualcosa del genere:

    context.Response.Clear()
    context.Response.ContentType = "application/msword"
    Dim fileContents As Byte()
    fileContents = My.Computer.FileSystem.ReadAllBytes("C:\prova.doc")
    context.Response.BinaryWrite(fileContents)

    Chi si trova dalla parte del client vedrà apparire il messaggio di visualizzazione (se ha un programma compatibile con .DOC) o di salvataggio.

    Il problema, quindi ti si sposta all'eleborazione lato server del file doc.

    martedì 16 novembre 2010 10:49
  • Ciao Stefano,

    devi specificare oltre al ContentType anche la disposition dove speciifchi ilnome del file che vuoi dare in fase di scaricamento.

    Response.AppendHeader("content-disposition", "attachment; filename=" + fileName);
    

    Dimmi che ti funziona :)

    Ciao,


    Adriano
    mercoledì 17 novembre 2010 23:10
  • Ciao Stefano, deduco che il probelma sia correlato al contenttype. Tu lo specifichi in maniera ESPLICITA essere un .DOC (se guardi sul registry application/msword è associato all'estensione .DOC).

    Un DOCX ha il seguente ContentTYpe:

    "application/vnd.openxmlformats-officedocument.wordprocessingml.document"

    Ti consiglio dunque di provare a:

    1) Non specificarlo AFFATTO

    2) Speificalo in base all'estensione che questo ha (se è DOC usi quello che hai messo tu... se hai .DOCX metti quello che ti ho detto io).

    Dimmi se è ok.

    CIAO


    Adriano
    giovedì 18 novembre 2010 08:28
  • In sostanza, diciamo che se tu non metti Response.End(), SharePOint (deduco) o comuqnue il ciclo di vita delal tua pagina permette altre scritture verso il browser. Di conseguenza il tuo BinaryWrite() NON E' DA SOLO, ma è SOLO LA PRIMA PARTE DEL DOWNLOAD.

    Se usi Fiddler o HttpWatch, oppure analizzatori di protocollo in genere tipo Wireshark (a mio avviso il top in questo senso) puoi verificare che c'è altro oltre al tuo BinaryWrite. Se metti .End invece forzi "NON MI SERVE ALTRO", ... ed eviti di mandare qualcosa che non vuoi sul client.

    Esempio: Di solito un pagina fa Postback, quindi ci sarebbe il Render() dei controls. Se chiami Response.End eviti che questo accada, perchè "CHIUDI LO STREAM"

    Spero di essere stato chiaro,

    CIAO


    Adriano
    giovedì 18 novembre 2010 09:27
  • I due problemi sono collegati.

    Allora, quando tu aggiungi un'header che ti specifica il "Content-Disposition", di tipo "attachment" con un nome... il browser "deduce" che tu vuoi scaricare qualcosa.

    Ora, anche se non scrivi nulla TU, lo fa la pagina SE NON METTI response.End.

    Quindi è normale che la dialogBox appaia lo stesso.

    Spero di essere stato chiaro,

    CIAO

     


    Adriano
    giovedì 18 novembre 2010 09:58

Tutte le risposte

  • Ciao stegra,

    You wrote on 15/11/2010 :

    ho questo problema: lanciando word da un applicazione asp.net word non è visibile nonostante abbia settato visible = true. Il documento word viene aperto,*ma non visualizzato*, le modifiche vengono fatte e salvate correttamente.

    ènormale, l'utente con cui gira asp.net non è un utente interattivo, che cosa vuoi fare di preciso?

    .m


    Mauro Servienti
    {C67C0157-5D98-4733-A75E-93CAEE4BADC8}
    Microsoft MVP - Visual C# / MCTS
    http://mvp.support.microsoft.com
    blog @ http://milestone.topics.it
    whynot [ at ] topics [ dot ] it
    lunedì 15 novembre 2010 11:37
  • stegra wrote:

    ciao a tutti,

    ho questo problema: lanciando word da un applicazione asp.net word non è visibile nonostante abbia settato visible = true. Il documento word viene aperto,*ma non visualizzato*, le modifiche vengono fatte e salvate correttamente.

    Diciamo che il client si trova a Sidney, il server a Londra.

    La tua dialog si è aperta a Londra visto che è lì che gira il codice. Ma a Londra non la vedono perché è aperta in una sessione (vedi libro Windows Internals) che non è interattiva e quindi non visibile al responsabile del server che probabilmente si infurierebbe).

    Quoto Mauro: cosa vuoi fare?


    Raffaele Rialdi  http://www.iamraf.net
    Weblog: http://blogs.ugidotnet.org/raffaele
    Microsoft MVP profile https://mvp.support.microsoft.com/profile/raffaele
    UGIdotNET - http://www.ugidotnet.org/


    Raffaele Rialdi [MVP] My articles and videos: http://www.iamraf.net Italian blog: http://blogs.ugidotnet.org/raffaele
    lunedì 15 novembre 2010 12:49
  • Ciao grazie per le risposte, vi dico cosa voglio fare (il tutto girerà in LAN):

    1. applicazione asp.net (in realtà sarà una web part di sharepoint 2010)

    2. dall'applicazione, cliccando su una voce di una GridView voglio aprire Word con dei 'Content Control' già valorizzati e il documento deve rimanere 'aperto e visibile' a l'utente il quale lo completerà secondo le proprie esigenze e poi lo salverà (in una lista sharepoint ma questa è un'altra storia ...).

    Come ho detto nel post precedente non ho problemi ad aprire Word, valorizzare i CC etc. etc. Il problema è, appunto, che l'utente non può interagire con il documento.

    grazie

    stefano

     

     

    martedì 16 novembre 2010 08:14
  • Ciao Stefano, esiste anche il forum dedicato a Sharepoint per gli sviluppatori, i web part sono serviti li come primo pasto, siccome vedo che lo stai già usando, non pensi sarebbe meglio spostarti la domanda li per una migliore assistenza?

    Poi, non è che l'argomento è molto simile a questo: http://social.msdn.microsoft.com/Forums/it-IT/sharepointit/thread/a4e6bca2-5693-4b5f-b13a-73238c26de2b

    Rimango in attesa di un tuo riscontro.

    Saluti, Daniel.


    Questo contenuto è distribuito “as is” e non implica alcuna responsabilità da parte di Microsoft. L'azienda offre questo servizio gratuitamente, allo scopo di aiutare gli utenti e farli aumentare la conoscenza sui prodotti e le tecnologie Microsoft.
    martedì 16 novembre 2010 08:42
  • ciao e grazie per la risposta, in realtà ho già postato il problema anche nel forum sharepoint, il perché l'ho postato anche qui è dovuto al fatto che il problema esiste pari pari in una applicazione asp.net senza 'nessun sharepoint', infatti quando testo la web part SP ottengo il solito esito di quando testo un'applicazione asp.net con il codice in questione per aprire/visualizzare un documento di Word. Tra l'altro lato SP penso di risolvere (devo ancora provare ...) andando a salvare il documento word valorizzato con i valori di default nella raccolta documenti SP corrispettiva e DOPO aprire quel documento di Word 'simulando' un click sull'elemento appena creato.

    Quindi, in definitiva, penso che sia più un problema 'ASP.NET' che un problema sharepoint.

    grazie

    stefano

     

    martedì 16 novembre 2010 08:55
  • stegra wrote:

    ciao e grazie per la risposta, in realtà ho già postato il problema anche nel forum sharepoint, il perché l'ho postato anche qui è dovuto al fatto che il problema esiste pari pari in una applicazione asp.net senza 'nessun sharepoint', infatti quando testo la web part SP ottengo il solito esito di quando testo un'applicazione asp.net con il codice in questione per aprire/visualizzare un documento di Word. Tra l'altro lato SP penso di risolvere (devo ancora provare ...) andando a salvare il documento word valorizzato con i valori di default nella raccolta documenti SP corrispettiva e DOPO aprire quel documento di Word 'simulando' un click sull'elemento appena creato.

    Quindi, in definitiva, penso che sia più un problema 'ASP.NET' che un problema sharepoint.

    È totalmente senza senso pretendere che quel codice lato server apra word lato client.
    Quel codice gira sul server e interagisce con word lato server. Il client è "solo" collegato via http e non c'è modo che possa essere usato remotamente via COM come stai facendo tu.

    Il problema è la tua logica e non asp.net.


    Raffaele Rialdi  http://www.iamraf.net
    Weblog: http://blogs.ugidotnet.org/raffaele
    Microsoft MVP profile https://mvp.support.microsoft.com/profile/raffaele
    UGIdotNET - http://www.ugidotnet.org/


    Raffaele Rialdi [MVP] My articles and videos: http://www.iamraf.net Italian blog: http://blogs.ugidotnet.org/raffaele
    martedì 16 novembre 2010 09:34
  • ciao ti ringrazio per la risposta, ho capito quanto mi stai dicendo, già dal post precedente :-), per cui, secondo te, il problema non ha soluzione in ambito asp.net?

    grazie

    stefano

     

    martedì 16 novembre 2010 09:51
  • stegra scriveva il 16/11/2010 :

    ciao ti ringrazio per la risposta, ho capito quanto mi stai dicendo, già dal post precedente :-), per cui, secondo te, il problema non ha soluzione in ambito asp.net?

    grazie

    stefano

     

    Potresti elaborare il file lato server (ma senza pretendere di visualizzarlo), poi "spedire" il file sul protocollo HTTP cambiando ad esempio il content type della response.

    In pratica per "spedire" un file word su HTTP ti basta eseguire qualcosa del genere:

    context.Response.Clear()
    context.Response.ContentType = "application/msword"
    Dim fileContents As Byte()
    fileContents = My.Computer.FileSystem.ReadAllBytes("C:\prova.doc")
    context.Response.BinaryWrite(fileContents)

    Chi si trova dalla parte del client vedrà apparire il messaggio di visualizzazione (se ha un programma compatibile con .DOC) o di salvataggio.

    Il problema, quindi ti si sposta all'eleborazione lato server del file doc.

    martedì 16 novembre 2010 10:49
  • Grazie Massimo, il tuo suggerimento mi sembra interessante per cui lo provo sicuramente e poi ti farò sapere (probabilmente domani pomeriggio perché ora sono dietro alla 'solita urgenza' ...)

    grazie

    stefano

     

    martedì 16 novembre 2010 11:08
  • eccomi, ho provato quanto mi hai detto e ... ci siamo quasi nel senso che lato client mi appare il dialogbox che mi permette di lanciare word però mi apre sempre 'AllItems.doc'. Il segmento di codice è:

    SPFile spfile = dropOffLibrary.GetFile("http://stefano-pca:24542/DropOffLibrary/prova.docx");
    HttpContext httpContext = HttpContext.Current;
    httpContext.Response.Clear();
    httpContext.Response.ContentType = "application/msword";
    Byte[] fileContents = spfile.OpenBinary();                                     // NON CAMBIA NIENTE SE USO, AD ESEMPIO: File.ReadAllBytes("D:\\prova.docx");
    httpContext.Response.BinaryWrite(fileContents);

    sembra che venga ignorato il file che gli passo. Forse è l'HttpContext che non va. Ricordo che sono in una webpart di sharepoint 2010.

    grazie

    stefano

     

    mercoledì 17 novembre 2010 15:42
  • ho verificato il 'fileContents' ed è proprio il file giusto per cui penso che il problema sia proprio nel HttpContext, mi sbaglio?

     

    grazie

    stefano

     

    mercoledì 17 novembre 2010 17:06
  • Ciao Stefano,

    devi specificare oltre al ContentType anche la disposition dove speciifchi ilnome del file che vuoi dare in fase di scaricamento.

    Response.AppendHeader("content-disposition", "attachment; filename=" + fileName);
    

    Dimmi che ti funziona :)

    Ciao,


    Adriano
    mercoledì 17 novembre 2010 23:10
  • Ciao Adriano,

    SI! Funziona. Quasi.

    Nel senso che si prova ad aprire il file giusto ma si ottiene l'errore:

    Impossibile aprire il file in formato XML Office aperto prova[3].docx a causa di problemi nel contenuto.

    Dettagli: File danneggiato. Impossibile aprirlo.

    Se do OK ottengo il messaggio:

    Word ha rilevato contenuto illeggibile in prova[3].docx. Recuperare il contenuto del documento? Se si ritiene che l'origine del documento sia attendibile, fare clic su Sì.

    Cliccando su Sì il file viene aperto correttamente.

    C'è da osservare che se apro normalmente il file (cioè non da codice) questi viene aperto senza problemi.

    grazie

    stefano

     

    giovedì 18 novembre 2010 08:19
  • Ciao Stefano, deduco che il probelma sia correlato al contenttype. Tu lo specifichi in maniera ESPLICITA essere un .DOC (se guardi sul registry application/msword è associato all'estensione .DOC).

    Un DOCX ha il seguente ContentTYpe:

    "application/vnd.openxmlformats-officedocument.wordprocessingml.document"

    Ti consiglio dunque di provare a:

    1) Non specificarlo AFFATTO

    2) Speificalo in base all'estensione che questo ha (se è DOC usi quello che hai messo tu... se hai .DOCX metti quello che ti ho detto io).

    Dimmi se è ok.

    CIAO


    Adriano
    giovedì 18 novembre 2010 08:28
  • Ciao, grazie per la risposta, purtroppo la situazione non cambia. Ho provato a fare come dici e cioè ho provato le due possibilità (sempre con file .docx):

    1. // httpContext.Response.ContentType = "application/msword";

    2. httpContext.Response.ContentType = "application/vnd.openxmlformats-officedocument.wordprocessingml.document";

    ma ottengo sempre il solito messaggio di errore.

    grazie

    stefano

    giovedì 18 novembre 2010 08:45
  • Cosa succede se SALVI il file sul disco, e lo apri da li? (invece di fare "OPEN" automaticamente)... ho l'impressione che non venga trasferito l'intero file... e/o che la struttura del file trasferito non sia corretta... 
    Adriano
    giovedì 18 novembre 2010 08:50
  • Fammi capire meglio, io uso il seguente codice:

             OpenDocument(urlTemplate);  // <== questa funzione apre un template .dotx che si trova in una raccolta documenti di sharepoint valorizza dei

                                                         //          'content controls' e salva il documento prova.docx in un'altra raccolta documenti di sharepoint

                                                         //          IL DOCUMENTO PROVA.DOCX COSI' CREATO SE CI SI CLICCA VIENE APERTO REGOLARMENTE.

                        // creo il sito sharepoint
                        SPWeb dropOffLibrary = new SPSite(_urlDropOffLibrary).OpenWeb();
                        SPFile spfile = dropOffLibrary.GetFile("http://stefano-pca:24542/DropOffLibrary/prova.docx");
                        spfile.CheckIn("Documento creato automaticamente.", SPCheckinType.MajorCheckIn);

                        HttpContext httpContext = HttpContext.Current;
                        httpContext.Response.Clear();
                        httpContext.Response.ContentType = "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
                        httpContext.Response.AppendHeader("Content-Disposition", "attachment; filename=prova.docx");

                        Byte[] fileContents = spfile.OpenBinary(); 
                        httpContext.Response.BinaryWrite(fileContents);

    e questo produce quanto finora detto.

    Se faccio qualcosa tipo:

         File.WriteAllBytes("D:\\prova_salvata.docx", fileContents);

    il file 'prova_salvata.docx' viene aperto regolarmente (via doppio clic).

    grazie

    stefano

     

    giovedì 18 novembre 2010 09:10
  • scusami ma a questo punto non ho più l'idee chiare. Pensavo che il dialog box che mi chiede di aprire il documento di word apparisse in seguito a:

                                                                              httpContext.Response.BinaryWrite(fileContents);

    mentre ho commentato questa istruzione e non cambia niente ???

    grazie

    stefano

     

    giovedì 18 novembre 2010 09:15
  • mmm forse devi mettere un "Response.End" dopo il BinaryWrite().

    Altra ipotesi è forzarei l Content-Length mettendo la fileContents.Length.

     


    Adriano
    giovedì 18 novembre 2010 09:17
  • BINGO!

    Il 'Response.End' sistema il tutto. Così funziona.

    GRAZIE.

    Potresti chiarirmi un po' le idee a proposito di quanto ho detto prima per httpContext.Response.BinaryWrite(fileContents);

    grazie

    stefano

     

    giovedì 18 novembre 2010 09:24
  • In sostanza, diciamo che se tu non metti Response.End(), SharePOint (deduco) o comuqnue il ciclo di vita delal tua pagina permette altre scritture verso il browser. Di conseguenza il tuo BinaryWrite() NON E' DA SOLO, ma è SOLO LA PRIMA PARTE DEL DOWNLOAD.

    Se usi Fiddler o HttpWatch, oppure analizzatori di protocollo in genere tipo Wireshark (a mio avviso il top in questo senso) puoi verificare che c'è altro oltre al tuo BinaryWrite. Se metti .End invece forzi "NON MI SERVE ALTRO", ... ed eviti di mandare qualcosa che non vuoi sul client.

    Esempio: Di solito un pagina fa Postback, quindi ci sarebbe il Render() dei controls. Se chiami Response.End eviti che questo accada, perchè "CHIUDI LO STREAM"

    Spero di essere stato chiaro,

    CIAO


    Adriano
    giovedì 18 novembre 2010 09:27
  • Grazie, mi hai chiarito la necessita del Response.End(), a me però piacerebbe capire anche (riporto il post precedente):

    scusami ma a questo punto non ho più l'idee chiare. Pensavo che il dialog box che mi chiede di aprire il documento di word apparisse in seguito a:

                                                                              httpContext.Response.BinaryWrite(fileContents);

    mentre ho commentato questa istruzione e non cambia niente ???

    grazie

    stefano

    giovedì 18 novembre 2010 09:31
  • I due problemi sono collegati.

    Allora, quando tu aggiungi un'header che ti specifica il "Content-Disposition", di tipo "attachment" con un nome... il browser "deduce" che tu vuoi scaricare qualcosa.

    Ora, anche se non scrivi nulla TU, lo fa la pagina SE NON METTI response.End.

    Quindi è normale che la dialogBox appaia lo stesso.

    Spero di essere stato chiaro,

    CIAO

     


    Adriano
    giovedì 18 novembre 2010 09:58
  • Chiarissimo grazie!

    ciao

    stefano

     

    giovedì 18 novembre 2010 10:00
  • Ciao Stefano,

    Chiarissimo grazie!

    sono molto contento che sei riuscito risolvere, colgo anch'io l'occasione di ringraziare a tutti per il tempo dedicato. Per evidenziare quello che ti ha aiutato anche per altri membri della comunità una buona prassi ed anche cortese è di segnare la risposta e di votare come utile i post in merito.

    Rimaniamo in attesa di un tuo riscontro su questo thread e delle tue ulteriori domande e dubbi sul sviluppo.

    Grazie per la collaborazione.

    Saluti, Daniel.


    Questo contenuto è distribuito “as is” e non implica alcuna responsabilità da parte di Microsoft. L'azienda offre questo servizio gratuitamente, allo scopo di aiutare gli utenti e farli aumentare la conoscenza sui prodotti e le tecnologie Microsoft.
    giovedì 18 novembre 2010 10:21