<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>Office Interop, VSTO</title>
        <link>http://community.dotnetwork.it/sabrina/category/63.aspx</link>
        <description>Interoperabilità con Office e Visual Studio Tools for office</description>
        <language>it-IT</language>
        <copyright>Sabrina C.</copyright>
        <managingEditor>ziayeye@ziayeye.it</managingEditor>
        <generator>Subtext Version 1.9.5.176</generator>
        <item>
            <title>Lettura dati da Excel via ADO e Date Nulle</title>
            <link>http://community.dotnetwork.it/sabrina/archive/2010/06/10/lettura-dati-da-excel-via-ado-e-date-nulle.aspx</link>
            <description>&lt;p&gt;Un appunto veloce che arriva dall’esperienza, se utilizzate ADO all’interno di Excel per connettervi ad un Database e riempire le celle del foglio elettronico con dei dati, assicuratevi che la query o la stored procedure che utilizzate non ritorni mai NULL sulle colonne di tipo datetime. &lt;/p&gt;  &lt;p&gt;Un NULL su una colonna di tipo data, provoca un rallentamento enorme nella lettura dei dati. nella nostra esperienza, siamo passati da 2 minuti e mezzo a 10 secondi togliendo i NULL sui campi data.&lt;/p&gt;  &lt;p&gt;Potrebbe essere un problema dei driver o delle librerie usate, potrebbe essere una antipatia di excel verso i Db.NULL non saprei, obiettivamente l’importante è che il workaround funzioni ;)&lt;/p&gt;  &lt;pre class="TsqlFormat"&gt;&lt;span class="kwrd"&gt;SELECT&lt;/span&gt;
    ....
    ISNULL(&lt;span class="kwrd"&gt;Data&lt;/span&gt;, &lt;span class="kwrd"&gt;Convert&lt;/span&gt;(datetime, "20000101", 103)) &lt;span class="kwrd"&gt;as&lt;/span&gt; &lt;span class="kwrd"&gt;Data&lt;/span&gt;
    ....
&lt;span class="kwrd"&gt;FROM&lt;/span&gt;
    TbDati
    ....
&lt;span class="kwrd"&gt;WHERE&lt;/span&gt;
    ....&lt;/pre&gt;

&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:d4703784-3e0d-46e3-ade5-9d1eae70e092" class="wlWriterEditableSmartContent"&gt;Tags: &lt;a href="http://community.dotnetwork.it/Sabrina/Tags/Excel/default.aspx" rel="tag"&gt;Excel&lt;/a&gt;, &lt;a href="http://community.dotnetwork.it/Sabrina/Tags/Date/default.aspx" rel="tag"&gt;Date&lt;/a&gt;, &lt;a href="http://community.dotnetwork.it/Sabrina/Tags/Null/default.aspx" rel="tag"&gt;Null&lt;/a&gt;&lt;/div&gt;

&lt;p&gt;qui&lt;/p&gt;&lt;img src="http://community.dotnetwork.it/sabrina/aggbug/433.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Sabrina C.</dc:creator>
            <guid>http://community.dotnetwork.it/sabrina/archive/2010/06/10/lettura-dati-da-excel-via-ado-e-date-nulle.aspx</guid>
            <pubDate>Thu, 10 Jun 2010 09:38:18 GMT</pubDate>
            <wfw:comment>http://community.dotnetwork.it/sabrina/comments/433.aspx</wfw:comment>
            <comments>http://community.dotnetwork.it/sabrina/archive/2010/06/10/lettura-dati-da-excel-via-ado-e-date-nulle.aspx#feedback</comments>
            <wfw:commentRss>http://community.dotnetwork.it/sabrina/comments/commentRss/433.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Agganciare Word via Interop quando &amp;egrave; aperto o crearne una nuova istanza</title>
            <link>http://community.dotnetwork.it/sabrina/archive/2009/08/21/agganciare-word-via-interop-quando-egrave-aperto-o-crearne-una.aspx</link>
            <description>&lt;p&gt;Annoto questo pezzetto di codice per tenerne nota, è la versione .NET (C#) della funzionalità che in VB6 o VBA permetteva di creare un oggetto Word.Application che in caso il suddetto fosse aperto non generasse una nuova istanza ma usasse quella presente.&lt;/p&gt;
&lt;p&gt;In questo modo, se ci sono documenti aperti li troveremo nella collection corrispondente, quindi potremo agganciarli e usarli Il codice sostituisce la famigerata GetObject non tipizzata ed è il seguente:&lt;/p&gt;
&lt;pre class="CSharpFormat"&gt;            Word.Application myWord = &lt;span class="kwrd"&gt;null&lt;/span&gt;;
            &lt;span class="kwrd"&gt;try&lt;/span&gt;
            {
                myWord = System.Runtime.InteropServices.Marshal.GetActiveObject(&lt;br /&gt;                     &lt;span class="str"&gt;"Word.Application"&lt;/span&gt;) &lt;span class="kwrd"&gt;as&lt;/span&gt; Word.Application;
            }
            &lt;span class="kwrd"&gt;catch&lt;/span&gt; (System.Runtime.InteropServices.COMException ex)
            {
                &lt;span class="kwrd"&gt;if&lt;/span&gt; (ex.Message.Contains(&lt;span class="str"&gt;"Operation unavailable"&lt;/span&gt;) || ex.ErrorCode == -2147221021)
                {
                    myWord = &lt;span class="kwrd"&gt;new&lt;/span&gt; Word.ApplicationClass();
                }
                &lt;span class="kwrd"&gt;else&lt;/span&gt;
                {
                    &lt;span class="kwrd"&gt;throw&lt;/span&gt; ex;
                }
            }&lt;/pre&gt;
&lt;p&gt;Il codice su scritto assume che sia stata creata la seguente clausola using: &lt;/p&gt;
&lt;pre class="CSharpFormat"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; Word = Microsoft.Office.Interop.Word;&lt;/pre&gt;
&lt;p&gt;La try/catch  viene utilizzata perché se Word non è aperto otteniamo l’eccezione su scritta, ho usato una OR per testare 2 delle cose che ci sono nei dati dell’exception perché non sono certa sia usato lo stesso codice o la descrizione non sia tradotta in base alla locale. Se avete un metodo più certo per testare una Com Exception parlate pure ;)&lt;/p&gt;
&lt;p&gt;P.s. Lo stesso metodo può essere utilizzato per agganciare Excel, Outlook o qualsiasi altra applicazione via Interop. Per Excel cambia la stringa che diviene "Excel.Application" presumo che per Outlook sia "Outlook.Application" e così via.&lt;/p&gt;
&lt;div class="wlWriterEditableSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:5d216765-b18b-4215-861c-f027a90f754d" style="PADDING-RIGHT: 0px; DISPLAY: inline; PADDING-LEFT: 0px; FLOAT: none; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px"&gt;Tags: &lt;a rel="tag" href="http://community.dotnetwork.it/Sabrina/Tags/C%23/default.aspx"&gt;C#&lt;/a&gt;, &lt;a rel="tag" href="http://community.dotnetwork.it/Sabrina/Tags/Winforms/default.aspx"&gt;Winforms&lt;/a&gt;, &lt;a rel="tag" href="http://community.dotnetwork.it/Sabrina/Tags/Interop/default.aspx"&gt;Interop&lt;/a&gt;, &lt;a rel="tag" href="http://community.dotnetwork.it/Sabrina/Tags/WinWord/default.aspx"&gt;WinWord&lt;/a&gt;&lt;/div&gt;&lt;img src="http://community.dotnetwork.it/sabrina/aggbug/186.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Sabrina C.</dc:creator>
            <guid>http://community.dotnetwork.it/sabrina/archive/2009/08/21/agganciare-word-via-interop-quando-egrave-aperto-o-crearne-una.aspx</guid>
            <pubDate>Fri, 21 Aug 2009 14:40:12 GMT</pubDate>
            <wfw:comment>http://community.dotnetwork.it/sabrina/comments/186.aspx</wfw:comment>
            <comments>http://community.dotnetwork.it/sabrina/archive/2009/08/21/agganciare-word-via-interop-quando-egrave-aperto-o-crearne-una.aspx#feedback</comments>
            <wfw:commentRss>http://community.dotnetwork.it/sabrina/comments/commentRss/186.aspx</wfw:commentRss>
        </item>
        <item>
            <title>WdSeekView Word Interop</title>
            <link>http://community.dotnetwork.it/sabrina/archive/2009/07/09/wdseekview-word-interop.aspx</link>
            <description>&lt;p&gt;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.&lt;/p&gt;  &lt;p&gt;MSDN contiene l’enumerazione nelle sue pagine, (&lt;a href="http://msdn.microsoft.com/de-de/library/microsoft.office.interop.word.wdseekview(office.11).aspx" target="_blank"&gt;qui&lt;/a&gt;) 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.&lt;/p&gt;  &lt;p&gt;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.&lt;/p&gt;  &lt;p&gt;Un documento Word può essere generato con quattro tipologie di Intestazioni e piè pagina, ovvero:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Diversi per la prima pagina. &lt;/li&gt;    &lt;li&gt;Diversi per la prima pagina e per le pagine pari e dispari. &lt;/li&gt;    &lt;li&gt;Diversi per le pagine pari e dispari &lt;/li&gt;    &lt;li&gt;Tutti uguali &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Per accedere al contenuto delle intestazioni e piè pagina, è necessario fare qualcosa di simile a questo:&lt;/p&gt;  &lt;pre class="CSharpFormat"&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; Word.Range SelectWholeViewPlace(Word.WdSeekView pSeekPlace)
        {
            &lt;span class="kwrd"&gt;try&lt;/span&gt;
            {
                Doc.Activate();
                Word.Range rng = &lt;span class="kwrd"&gt;null&lt;/span&gt;;
                &lt;span class="kwrd"&gt;try&lt;/span&gt;
                {
                    Doc.Application.ActiveWindow.View.SeekView = pSeekPlace;
                    &lt;span class="kwrd"&gt;object&lt;/span&gt; units = Word.WdUnits.wdStory;
                    &lt;span class="kwrd"&gt;object&lt;/span&gt; extend = Word.WdMovementType.wdMove;
                    Doc.Application.Selection.HomeKey(&lt;span class="kwrd"&gt;ref&lt;/span&gt; units, &lt;span class="kwrd"&gt;ref&lt;/span&gt; extend);
                    extend = Word.WdMovementType.wdExtend;

                    Doc.Application.Selection.EndKey(&lt;span class="kwrd"&gt;ref&lt;/span&gt; units, &lt;span class="kwrd"&gt;ref&lt;/span&gt; extend);
                    rng = Doc.Application.Selection.Range;
                }
                &lt;span class="kwrd"&gt;catch&lt;/span&gt; (Exception)
                {
                    rng = &lt;span class="kwrd"&gt;null&lt;/span&gt;;
                }
                
                
                &lt;span class="kwrd"&gt;return&lt;/span&gt; (rng);
            }
            &lt;span class="kwrd"&gt;catch&lt;/span&gt; (Exception ex)
            {
                EventLogger.SendMsg(mClassName,
                    System.Reflection.MethodBase.GetCurrentMethod(), ex, MessageType.Error);
                &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; ApplicationException(GlobalConstants.TXT_SPACE + mClassName + GlobalConstants.TXT_DOT
                    + System.Reflection.MethodBase.GetCurrentMethod().Name, ex);
            }
        }&lt;/pre&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;Ma quale opzione usare e in quali casi? Ecco le descrizioni complete:&lt;/p&gt;

&lt;table cellspacing="0" cellpadding="0" width="80%" border="1"&gt;&lt;tbody&gt;
    &lt;tr&gt;
      &lt;td valign="top" width="200"&gt;&lt;font color="#f5420e" size="3"&gt;&lt;strong&gt;Valore&lt;/strong&gt;&lt;/font&gt;&lt;/td&gt;

      &lt;td valign="top"&gt;&lt;font color="#f5420e" size="3"&gt;&lt;strong&gt;Significato&lt;/strong&gt;&lt;/font&gt;&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td style="font-weight: bold; color: #0bb506" valign="top" width="200"&gt;wdSeekCurrentPageFooter&lt;/td&gt;

      &lt;td valign="top"&gt;Attiva la Vista sul Footer (piè pagina) della pagina corrente; 
        &lt;br /&gt;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. 

        &lt;br /&gt;Quindi questa opzione ha un uso difficile in un operazione pilotata da Interop, perché a priori non sappiamo dove finiremo.&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td style="font-weight: bold; color: #0bb506" valign="top" width="200"&gt;wdSeekCurrentPageHeader&lt;/td&gt;

      &lt;td valign="top"&gt;Attiva la Vista sull’Header (intestazione) della pagina corrente; vedi riga precedente per le modalità funzionali.&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td style="font-weight: bold; color: #0bb506" valign="top" width="200"&gt;wdSeekEndnotes&lt;/td&gt;

      &lt;td valign="top"&gt;Attiva la vista sulle Note di fine documento. (quando esistono)&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td style="font-weight: bold; color: #0bb506" valign="top" width="200"&gt;wdSeekEvenPagesFooter&lt;/td&gt;

      &lt;td valign="top"&gt;Attiva la vista sul Footer delle pagine Pari, quindi funziona nei casi 2 e 3 e non esiste nei casi 1 e 4.&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td style="font-weight: bold; color: #0bb506" valign="top" width="200"&gt;wdSeekEvenPagesHeader&lt;/td&gt;

      &lt;td valign="top"&gt;Attiva la vista sull’Header delle pagine Pari; vedi riga precedente per le modalità funzionali.&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td style="font-weight: bold; color: #0bb506" valign="top" width="200"&gt;wdSeekFirstPageFooter&lt;/td&gt;

      &lt;td valign="top"&gt;Attiva la vista sul Footer della prima pagina, quindi funziona nei casi 1 e 2 e non esiste nei casi 3 e 4.&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td style="font-weight: bold; color: #0bb506" valign="top" width="200"&gt;wdSeekFirstPageHeader&lt;/td&gt;

      &lt;td valign="top"&gt;Attiva la vista sull’Header della prima pagina; vedi riga precedente per le modalità funzionali.&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td style="font-weight: bold; color: #0bb506" valign="top" width="200"&gt;wdSeekFootnotes&lt;/td&gt;

      &lt;td valign="top"&gt;Attiva la vista sulle note a piè pagina. (quando esistono)&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td style="font-weight: bold; color: #0bb506" valign="top" width="200"&gt;wdSeekMainDocument&lt;/td&gt;

      &lt;td valign="top"&gt;Attiva la vista sul testo del documento.&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td style="font-weight: bold; color: #0bb506" valign="top" width="200"&gt;wdSeekPrimaryFooter&lt;/td&gt;

      &lt;td valign="top"&gt;
        &lt;p&gt;Attiva la vista sul footer principale, questa opzione come l’opzione CurrentPage assume significato diverso in base ai casi in cui ci troviamo:&lt;/p&gt;

        &lt;ol&gt;
          &lt;li&gt;Attiva il footer delle pagine diverse dalla prima. &lt;/li&gt;

          &lt;li&gt;Attiva il footer delle pagine dispari &lt;/li&gt;

          &lt;li&gt;Attiva il footer delle pagine dispari &lt;/li&gt;

          &lt;li&gt;Attiva il footer primario (e unico disponibile). &lt;/li&gt;
        &lt;/ol&gt;
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td style="font-weight: bold; color: #0bb506" valign="top" width="200"&gt;wdSeekPrimaryHeader&lt;/td&gt;

      &lt;td valign="top"&gt;Attiva la vista sull’Header principale; vedi riga precedente per le modalità funzionali.&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;&lt;/table&gt;

&lt;p&gt;Buon Interop a tutti.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;div class="wlWriterEditableSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:5d216765-b18b-4215-861c-f027a90f754d" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Tags: &lt;a href="http://community.dotnetwork.it/Sabrina/Tags/C%23/default.aspx" rel="tag"&gt;C#&lt;/a&gt;, &lt;a href="http://community.dotnetwork.it/Sabrina/Tags/Winforms/default.aspx" rel="tag"&gt;Winforms&lt;/a&gt;, &lt;a href="http://community.dotnetwork.it/Sabrina/Tags/Interop/default.aspx" rel="tag"&gt;Interop&lt;/a&gt;, &lt;a href="http://community.dotnetwork.it/Sabrina/Tags/WinWord/default.aspx" rel="tag"&gt;WinWord&lt;/a&gt;&lt;/div&gt;&lt;img src="http://community.dotnetwork.it/sabrina/aggbug/173.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Sabrina C.</dc:creator>
            <guid>http://community.dotnetwork.it/sabrina/archive/2009/07/09/wdseekview-word-interop.aspx</guid>
            <pubDate>Thu, 09 Jul 2009 14:31:49 GMT</pubDate>
            <wfw:comment>http://community.dotnetwork.it/sabrina/comments/173.aspx</wfw:comment>
            <comments>http://community.dotnetwork.it/sabrina/archive/2009/07/09/wdseekview-word-interop.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://community.dotnetwork.it/sabrina/comments/commentRss/173.aspx</wfw:commentRss>
        </item>
    </channel>
</rss>
