DCSIMG
Copy And Paste Html into the clipboard for Office AddIn (VSTO) - תיאור פרויקט - שליפת מידע מהפוסטים לתוך מצגת - שלמה גולדברג (הרב דוטנט)
Sign in | Join | Help

שלמה גולדברג (הרב דוטנט)

מרצה בסלע ויועץ בעולם ה - net.

Copy And Paste Html into the clipboard for Office AddIn (VSTO) - תיאור פרויקט - שליפת מידע מהפוסטים לתוך מצגת

פורסם בתאריך Feb 05 2010, 12:10 PM על ידי Shlomo | ישנם 1 תגובות

 

בשבוע האחרון קבלתי פרויקט קטן ומעניין.
 
במכללת סלע הציבו לא מזמן פלזמה שמריצה מצגת (pptx) שמציגה חדשות טכנולוגיה וכד'.
 
התבקשתי לייצר קוד שתשלוף מהפוסטים של הבלוגרים שלנו את הפוסט האחרון של כל אחד מהם (יש לנו למעלה משלושים בלוגרים) ולהציג את זה במצגת.
 
בהתחלה התחלתי לכתוב VBA, די נחמד יש לו את היתרונות שלו אבל על זה אני אדבר בפוסט נפרד, מהר מאוד עברתי בהמלצת שי רייטן ל - VSTO.
 
השלב הראשון היה איכשהו להתחבר ל - RSS של הפוסטים, לא הייתי צריך לכתוב קוד בעצמי, השתמשתי בזה - קוד נחמד שהורדתי מ - Code Project).
 
שימוש בקוד הוא מאוד פשוט
 

Uri uri = new Uri(item.RssUrl);

RssChannel myRssChannel = new RssChannel(uri);

RssItem item = myRssChannel.Items[0];

 
 
הבעייה העיקרית הייתה אחרי שקבלתי את הנתונים, הייתי אמור להציג אותם על תיבות טקסט בשקף.
את הכותרת והתאריך זה היה מאוד פשוט.
 

Pres.Slides[1].Shapes[1].TextFrame.TextRange.Text = item.Title;

 
(את המופע של Pres קבלתי דרך רישום ל - Application_AfterPresentationOpen וכמובן המיקום של השקפים והמיקום של תיבות הטקסט הגיע מקובץ קונפיג.)
 
כעת רציתי להציג את התוכן של הפוסט - מה שניסיתי לעשות היה:

Pres.Slides[1].Shapes[2].TextFrame.TextRange.Text = item.Description;

הבעייה שהתוכן של ה - Description מכיל גם את התגים של ה - html - כלומר הייתי מקבל בתיבת הטקסט:
< B >Shlomo< /B >
 
במקום לקבל
Shlomo
 
 
לא ממש מצאתי פיתרון, בסופו של דבר אלון פליס הציע לשאול את שי פרידמן
מה שאכן הוכיח את עצמו, שי כתב קוד שמקבל מחרוזת מעתיק אותה בצורה נכונה ל - Clipboard ומדביק אותה על תיבת הטקסט, וזה נראה כמו שצריך.
 
הקוד של שי (ניתן להוריד את המחלקה מכאן)
 

public static class InsertHtml

{

    public static void InsertHtmlToShape(Shape shape, string html)

    {

        // Copy the HTML to clipboard (Pay attention,

        // no <HTML> nor <BODY> tags are needed here                   

        CopyHtmlToClipBoard(html);

 

        // Paste the HTML into the shape

        shape.TextFrame.TextRange.Paste();

    }

 

    private static void CopyHtmlToClipBoard(string html)

    {

        Encoding enc = Encoding.UTF8;

 

        string begin = "Version:0.9\r\nStartHTML:{0:000000}\r\nEndHTML:{1:000000}"

           + "\r\nStartFragment:{2:000000}\r\nEndFragment:{3:000000}\r\n";

 

        string html_begin = "<html>\r\n<head>\r\n"

           + "<meta http-equiv=\"Content-Type\""

           + " content=\"text/html; charset=" + enc.WebName + "\">\r\n"

           + "<title>HTML clipboard</title>\r\n</head>\r\n<body>\r\n"

           + "<!--StartFragment-->\r\n";

 

        string html_end = "\r\n<!--EndFragment-->\r\n</body>\r\n</html>\r\n";

 

        string begin_sample = String.Format(begin, 0, 0, 0, 0);

 

        int count_begin = enc.GetByteCount(begin_sample);

        int count_html_begin = enc.GetByteCount(html_begin);

        int count_html = enc.GetByteCount(html);

        int count_html_end = enc.GetByteCount(html_end);

 

        string html_total = String.Format(

           begin

           , count_begin

           , count_begin + count_html_begin + count_html + count_html_end

           , count_begin + count_html_begin

           , count_begin + count_html_begin + count_html

           ) + html_begin + html + html_end;

 

        DataObject obj = new DataObject();

        obj.SetData(DataFormats.Html, new MemoryStream(enc.GetBytes(html_total)));

        Clipboard.SetDataObject(obj, true);

    }

 

}

(קוד מעניין למדתי ממנו כל מיני דברים חדשים)
בכל מקרה זה עבד, כעת רק נשאר לי להריץ את הקוד ב - Timer כל כמה שעות כדי להתעדכן, אבל אז קבלתי את ההודעה המרגיזה
 
Current thread must be set to single thread apartment (STA) mode before OLE calls can be made. Ensure that your Main function has STAThreadAttribute marked on it.
 
אבל כבר כתבתי בפוסט קודם איך פתרתי את זה.
 
לאחר מכן החלטנו להציג רק 500 תווים ראשונים מכל פוסט ואז נתקלתי בבעיה איך אני חותך מה - Description את שאר הטקסט, הרי אם אני יחתוך לפני שאני מדביק לתיבת הטקסט אני מאבד את רוב הפוסט (מכיוון שהוא סופר גם את התגים כתווים) ואם אני אכתוב קוד כזה
 

shape.TextFrame.TextRange.Text = shape.TextFrame.TextRange.Text.Remove(500)

 
אני מאבד את העיצוב ה - html.
 
ולכן כתבתי כך:
 

shape.TextFrame.TextRange.Characters(500, shape.TextFrame.TextRange.Text.Length).Delete();

shape.TextFrame.TextRange.InsertAfter("...");

 
מה שאני עדיין לא יודע כרגע (אני מבטיח לחפש ולפרסם) איך אפשר לשנות את קבצי הקונפיג אחרי ההתקנה הסופית.
כלומר - אחרי שאני מסיים לכתוב את הקוד שלי - אני שומר חלק מהמידע בקובץ קונפיג (למשל - כתובות RSS של הבלוגים) אחרי שמתקינים במחשב את ה - AddIn אי אפשר לשנות את הקונפיג - ולכן כל פעם אני צריך לקמפל מחדש.

רשימת תגובות

# re: Copy And Paste Html into the clipboard for Office AddIn (VSTO) - תיאור פרויקט - שליפת מידע מהפוסטים לתוך מצגת

פורסם בתאריך Tuesday, November 02, 2010 4:13 PM על ידי אלעד  

שלום רב,

אני עובד עכשיו על משהו דומה.

אני מנסה להעביר תוכן מועתק מדף אינטרנט לוורד.

הבעיה שאני לא יודע איך לשלוף תוכן שמכיל גם תמונות בנוסף לטקסט. האם אתה יודע משהו בעניין ?

שלח תגובה

(שדה חובה) 
(שדה חובה) 
(אופציונלי)
(שדה חובה) 

Enter the numbers above: