none
Ouvrir un document Word en lecture seule en C# RRS feed

  • Question

  • Bonjour,

    je veux ouvrir un document word en lecture seule. J'utilise el code suivant, qui ouvre bien mon document mais permet l'enregistrement du document. L'utilisateur doit pouvoir faire une copie du document sil le souhaite, mais pas le modifier.

    object missing = System.Reflection.Missing.Value;
    object readOnly = true;
    object isVisible = true;
    object fileName = url;
    Microsoft.Office.Interop.Word.Application _word = new Microsoft.Office.Interop.Word.Application();
    _word.Documents.Open(ref fileName, ref missing, ref readOnly, ref missing, ref  missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref isVisible,ref missing, ref missing, ref missing, ref missing);

    Merci de votre aide.

    mercredi 26 juin 2013 16:14

Réponses

  • En fait c'est comme si l'application associée à l'extension était lancée par le navigateur et non par ton appli, donc sans ReadOnly. J'ai essayé ce code intégrant un WebBrowser et interceptant l'événement MouseUp :

            private void Form1_Load(object sender, EventArgs e)
            {
                this.webBrowser1.Navigate(@"D:\Users\Jacques\Documents\ReadOnly.html");
            }
    
            private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
            {
                webBrowser1.Document.MouseUp += new HtmlElementEventHandler(Document_MouseUp);
            }
    
            private void Document_MouseUp(object sender, HtmlElementEventArgs e)
            {
                HtmlDocument hDoc = (HtmlDocument)sender;
                HtmlElement link = hDoc.ActiveElement;
                string url = link.GetAttribute("href");
                string s = url.ToLower().Trim();
                Console.WriteLine(s);
                if (s.EndsWith(".doc") || s.EndsWith(".docx"))
                {
                    Microsoft.Office.Interop.Word.Application _word = new Microsoft.Office.Interop.Word.Application();
                    _word.Documents.Open(s,false,true);
                    _word.Visible = true;
                }
                if (s.EndsWith(".xls") || s.EndsWith(".xlsx"))
                {
                    Microsoft.Office.Interop.Excel.Application _excel = new Microsoft.Office.Interop.Excel.Application();
                    _excel.Workbooks.Open(s,false, true);
                    _excel.Visible = true;
                }
            }
    Cela fonctionne correctement.


    Cordialement, Jacques

    • Marqué comme réponse Aurel Bera lundi 1 juillet 2013 07:47
    vendredi 28 juin 2013 13:12

Toutes les réponses

  • Bonjour hughludo71,

    J'ai essayé ton code et chez moi le document est bien en lecture seule. Si on tente un enregistrement, on a un avertissement (Word 2010) :

    On a par contre la possibilité de le modifier, mais on ne peut l'enregistrer que sous un autre nom.


    Cordialement, Jacques

    mercredi 26 juin 2013 20:47
  • Si tu veux interdire la modification, tu as la possibilité de marquer le document comme Final

    Cordialement, Jacques


    • Modifié Jacques93 mercredi 26 juin 2013 21:00 Correction URL
    mercredi 26 juin 2013 20:58
  • Bonjour Jacques,

    merci pour ta réponse. J'utilise la même version d'Office, et mes docs s'ouvrent toujours en modifiables... L'autre solution est intéressante mais inaplicable dans mon cas, le document devant être modifiable pour certains utilisateurs et pas pour d'autres, et ce droit de modification doit pouvoir évoluer. J'ai une table qui contient la liste des personnes autorisées, et en fonction j'ouvre le doc en readonly ou non.

    Bon, j'y retourne, je finirai bien par trouver ^^

    vendredi 28 juin 2013 07:01
  • Bonjour hughludo71,

    A tout hasard, la version de Microsoft.Office.Interop.Word que j'utilise :

    C:\Program Files (x86)\Microsoft Visual Studio 10.0\Visual Studio Tools for Office\PIA\Office14

    Directement sous Word, avec Ouvrir -> Ouvrir en lecture seule, cela fonctionne t-il ?


    Cordialement, Jacques

    vendredi 28 juin 2013 08:56
  • En fait le problèeme vient de plus haut : j'intercepte le click sur un lien dans un composant webbrowser et j'ouvre Word en lecture seule. Quand je clic sur mon lien, la messagebox affiche bien le doc mis en dur (pour tester), mais ouvre celui du lien. Si je ne laisse que le 'e.Cancel = true', il ne se passe rien. C'est tordu non ?

    void WebBrowser1NewWindow(object sender, CancelEventArgs e)

            {
                    WebBrowser webBrowser = (WebBrowser)sender;
                    HtmlElement link = webBrowser.Document.ActiveElement;
                    string url = link.GetAttribute("href");
                    string s = url.ToLower().Trim();
                    if (s.EndsWith(".doc") || s.EndsWith(".docx")) {
                        e.Cancel = true;
                        object missing = System.Reflection.Missing.Value;
                        object readOnly = true;
                        object isVisible = true;
                        object fileName = @"C:\test.doc"//url;
                        MessageBox.Show(fileName.ToString());
                        Microsoft.Office.Interop.Word.Application _word = new Microsoft.Office.Interop.Word.Application();
                        _word.Documents.Open(ref fileName, ref missing, ref readOnly, ref missing, ref  missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref isVisible,ref missing, ref missing, ref missing, ref missing);
                    }
                    if (s.EndsWith(".xsl") || s.EndsWith(".xslx")) {
                        e.Cancel = true;
                        Microsoft.Office.Interop.Excel.Application _excel = new Microsoft.Office.Interop.Excel.Application();
                        _excel.Workbooks.Open(url, 2true);
                            _excel.Visible = true;
                    }
                }
            } 


    • Modifié hughludo71 vendredi 28 juin 2013 10:15 correction
    vendredi 28 juin 2013 09:51
  • Pour info, le code s'arrete à 'Microsoft.Office.Interop.Excel.Application _excel = new Microsoft.Office.Interop.Excel.Application();'

    Ce qui se trouve après n'est pas éxécuté...

    vendredi 28 juin 2013 10:34
  • Je n'ai pas d'explication, mais sur le dernier point n'y aurait il pas un problème d'extension :

        if (s.EndsWith(".xsl") || s.EndsWith(".xslx")) {

    au lieu de

        if (s.EndsWith(".xls") || s.EndsWith(".xlsx")) {

    Je précise que pour les xls ou xlsx, c'est aussi OK pour moi, avec ton code, hors WebBrowser.


    Cordialement, Jacques



    • Modifié Jacques93 vendredi 28 juin 2013 11:31 Correction
    vendredi 28 juin 2013 11:24
  • Merci pour l'extension, je vais corriger ça. Le problème demeure sur le word. L'event semble bien annulé mais dès la création de l'objet _word cela lance l'ouverture du doc, même sans l'instruction "_word.Documents.Open(ref fileName,...".

    vendredi 28 juin 2013 12:25
  • En fait c'est comme si l'application associée à l'extension était lancée par le navigateur et non par ton appli, donc sans ReadOnly. J'ai essayé ce code intégrant un WebBrowser et interceptant l'événement MouseUp :

            private void Form1_Load(object sender, EventArgs e)
            {
                this.webBrowser1.Navigate(@"D:\Users\Jacques\Documents\ReadOnly.html");
            }
    
            private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
            {
                webBrowser1.Document.MouseUp += new HtmlElementEventHandler(Document_MouseUp);
            }
    
            private void Document_MouseUp(object sender, HtmlElementEventArgs e)
            {
                HtmlDocument hDoc = (HtmlDocument)sender;
                HtmlElement link = hDoc.ActiveElement;
                string url = link.GetAttribute("href");
                string s = url.ToLower().Trim();
                Console.WriteLine(s);
                if (s.EndsWith(".doc") || s.EndsWith(".docx"))
                {
                    Microsoft.Office.Interop.Word.Application _word = new Microsoft.Office.Interop.Word.Application();
                    _word.Documents.Open(s,false,true);
                    _word.Visible = true;
                }
                if (s.EndsWith(".xls") || s.EndsWith(".xlsx"))
                {
                    Microsoft.Office.Interop.Excel.Application _excel = new Microsoft.Office.Interop.Excel.Application();
                    _excel.Workbooks.Open(s,false, true);
                    _excel.Visible = true;
                }
            }
    Cela fonctionne correctement.


    Cordialement, Jacques

    • Marqué comme réponse Aurel Bera lundi 1 juillet 2013 07:47
    vendredi 28 juin 2013 13:12
  • Bonjour,

    Est-ce que vous avez testé les solutions proposées ? Merci de partager avec nous les résultats, afin que d'autres personnes avec le même problème puissent profiter de cette solution.

    Cordialement,


    Aurel BERA, Microsoft
    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    lundi 1 juillet 2013 07:28
  • Merci Jacques ça fonctionne =)
    lundi 1 juillet 2013 07:38