WdSeekView Word Interop

Intitolare un post col nome di una Enumerazione è strano, però credo sia il modo migliore perché la cosa sia indicizzata dai motori di ricerca. Questo post scaturisce dalla mia compassione verso coloro i quali, come me oggi dovranno in futuro lavorare con Word e le librerie Interop di .NET. Perché questa enumerazione è piuttosto importante, infatti permette di spostare la selezione e quindi il Cursore Virtuale che pilotiamo da codice con le Interop nelle varie “Viste” che compongono un documento.

MSDN contiene l’enumerazione nelle sue pagine, (qui) esattamente come contiene tutto lo scibile relativo a qualsiasi libreria, classe, oggetto e chi più ne ha più ne metta sviluppato nel tempo dai programmatori Microsoft, però conoscendo bene i programmatori, (e io alzo la mano per prima) e la loro poca predisposizione alla documentazione la descrizione delle opzioni dell’enumerazione è ovviamente una semplice riscrittura in lingua inglese dei loro nomi, purtroppo non sufficiente a rispondere alle domande che uno si pone nel momento in cui deve usarla davvero.

Pertanto, avendo scritto una applicazione di test proprio per svelare l’arcano, condivido le informazioni rilevate sperando che chi ha bisogno di pilotare la scrittura di dati su un documento word da codice .Net trovi questo post e possa trarne beneficio.

Un documento Word può essere generato con quattro tipologie di Intestazioni e piè pagina, ovvero:

  1. Diversi per la prima pagina.
  2. Diversi per la prima pagina e per le pagine pari e dispari.
  3. Diversi per le pagine pari e dispari
  4. Tutti uguali

Per accedere al contenuto delle intestazioni e piè pagina, è necessario fare qualcosa di simile a questo:

        public Word.Range SelectWholeViewPlace(Word.WdSeekView pSeekPlace)
        {
            try
            {
                Doc.Activate();
                Word.Range rng = null;
                try
                {
                    Doc.Application.ActiveWindow.View.SeekView = pSeekPlace;
                    object units = Word.WdUnits.wdStory;
                    object extend = Word.WdMovementType.wdMove;
                    Doc.Application.Selection.HomeKey(ref units, ref extend);
                    extend = Word.WdMovementType.wdExtend;

                    Doc.Application.Selection.EndKey(ref units, ref extend);
                    rng = Doc.Application.Selection.Range;
                }
                catch (Exception)
                {
                    rng = null;
                }
                
                
                return (rng);
            }
            catch (Exception ex)
            {
                EventLogger.SendMsg(mClassName,
                    System.Reflection.MethodBase.GetCurrentMethod(), ex, MessageType.Error);
                throw new ApplicationException(GlobalConstants.TXT_SPACE + mClassName + GlobalConstants.TXT_DOT
                    + System.Reflection.MethodBase.GetCurrentMethod().Name, ex);
            }
        }

Il metodo qui sopra fa un seleziona tutto in una delle “Viste” di un documento word, e se la vista non esiste (quindi ad esempio se il documento è in modalità 4 e non ci sono intestazioni delle pagine pari, dispari o della prima pagina) ritorna un oggetto Range nullo.

Ma quale opzione usare e in quali casi? Ecco le descrizioni complete:

Valore Significato
wdSeekCurrentPageFooter Attiva la Vista sul Footer (piè pagina) della pagina corrente;
per pagina corrente si intende la pagina su cui il cursore è posizionato, pertanto se siamo nel caso 1 e abbiamo il documento aperto e il cursore sulla prima pagina, ci verrà selezionato il footer della prima pagina, se siamo nel caso 2 e siamo su una pagina Dispari diversa dalla prima, ci verrà selezionato il piè pagina delle pagine Dispari e così via.
Quindi questa opzione ha un uso difficile in un operazione pilotata da Interop, perché a priori non sappiamo dove finiremo.
wdSeekCurrentPageHeader Attiva la Vista sull’Header (intestazione) della pagina corrente; vedi riga precedente per le modalità funzionali.
wdSeekEndnotes Attiva la vista sulle Note di fine documento. (quando esistono)
wdSeekEvenPagesFooter Attiva la vista sul Footer delle pagine Pari, quindi funziona nei casi 2 e 3 e non esiste nei casi 1 e 4.
wdSeekEvenPagesHeader Attiva la vista sull’Header delle pagine Pari; vedi riga precedente per le modalità funzionali.
wdSeekFirstPageFooter Attiva la vista sul Footer della prima pagina, quindi funziona nei casi 1 e 2 e non esiste nei casi 3 e 4.
wdSeekFirstPageHeader Attiva la vista sull’Header della prima pagina; vedi riga precedente per le modalità funzionali.
wdSeekFootnotes Attiva la vista sulle note a piè pagina. (quando esistono)
wdSeekMainDocument Attiva la vista sul testo del documento.
wdSeekPrimaryFooter

Attiva la vista sul footer principale, questa opzione come l’opzione CurrentPage assume significato diverso in base ai casi in cui ci troviamo:

  1. Attiva il footer delle pagine diverse dalla prima.
  2. Attiva il footer delle pagine dispari
  3. Attiva il footer delle pagine dispari
  4. Attiva il footer primario (e unico disponibile).
wdSeekPrimaryHeader Attiva la vista sull’Header principale; vedi riga precedente per le modalità funzionali.

Buon Interop a tutti.

Print | posted on giovedì 9 luglio 2009 16.31

Feedback

# re: WdSeekView Word Interop

Left by Max at 10/07/2009 9.16
Gravatar Aggiungo solo un "in bocca al lupo" a chi si trovera' a dover gestire un documento Word da .Net.

Personalmente avevo trovato utilissima una libreria (cara) della Aspose, che tra l'altro ha un validissimo supporto tecnico praticamente in tempo reale.

Max.

# re: WdSeekView Word Interop

Left by Sabrina at 10/07/2009 11.01
Gravatar Ho avuto modo di vedere varie librerie di Aspose e sono certa che fanno anche il Caffé visti i loro costi, le trovo comunque eccessivamente care per qualsiasi tipo di operazione di Interop di media complessità come possono essere quelle che usualmente si gestiscono da una applicazione che fa document management.

Your comment:





 
Please add 4 and 4 and type the answer here:

Copyright © Sabrina C.

Design by Bartosz Brzezinski

Design by Phil Haack Based On A Design By Bartosz Brzezinski