Вставка OLE-объектов в Excel - оптимизация
От: sct  
Дата: 20.05.10 12:09
Оценка:
Задачка такая — надо вставить кучу ole-объектов в Excel. Именно как ole.
В цикле пишу примерно так:
oleObject.CopyToClipboard()
cell(i, j).PasteSpecial()

Профайлер показывает, что это — самое узкое место по производительности (и CopyToClipboard, и PasteSpecial).
Как это все убыстрить? Может как-то не через буфер обмена?
Re: Вставка OLE-объектов в Excel - оптимизация
От: Angler Россия  
Дата: 20.05.10 22:00
Оценка:
Здравствуйте, sct, Вы писали:

sct>Задачка такая — надо вставить кучу ole-объектов в Excel. Именно как ole.

sct>В цикле пишу примерно так:
sct>
sct>oleObject.CopyToClipboard()
sct>cell(i, j).PasteSpecial()
sct>

sct>Профайлер показывает, что это — самое узкое место по производительности (и CopyToClipboard, и PasteSpecial).
sct>Как это все убыстрить? Может как-то не через буфер обмена?

используйте Open XML SDK.
Re[2]: Вставка OLE-объектов в Excel - оптимизация
От: sct  
Дата: 27.05.10 11:34
Оценка:
Здравствуйте, Angler, Вы писали:

A>используйте Open XML SDK.


Что-то не нашел, как там работать именно с OLE-объектами.
Примерчика нет никакого?
Re[3]: Вставка OLE-объектов в Excel - оптимизация
От: crazydown  
Дата: 27.05.10 11:49
Оценка:
Здравствуйте, sct, Вы писали:

sct>Здравствуйте, Angler, Вы писали:


A>>используйте Open XML SDK.


sct>Что-то не нашел, как там работать именно с OLE-объектами.

sct>Примерчика нет никакого?

имелась ввиду работа с excel файлами не через com , а с помощью Open XML SDK 2.0 for Microsoft Office , по сути это работа с xml'ем — данные пишутся в файл в текстовом виде, что гораздо (в разы) быстрее, проблема в том, что такой формат поддерживает только 2007 офис
Re[4]: Вставка OLE-объектов в Excel - оптимизация
От: sct  
Дата: 27.05.10 14:09
Оценка:
Здравствуйте, crazydown, Вы писали:

C>имелась ввиду работа с excel файлами не через com , а с помощью Open XML SDK 2.0 for Microsoft Office , по сути это работа с xml'ем — данные пишутся в файл в текстовом виде, что гораздо (в разы) быстрее, проблема в том, что такой формат поддерживает только 2007 офис


Это то я понял. Excel 2007 тоже подходит. Вопрос только, поддерживает ли Open XML вставку OLE-объектов и хорошо бы примерчик какой.
Спасибо заранее.
Re[5]: Вставка OLE-объектов в Excel - оптимизация
От: crazydown  
Дата: 27.05.10 15:09
Оценка:
Здравствуйте, sct, Вы писали:

sct>Здравствуйте, crazydown, Вы писали:


C>>имелась ввиду работа с excel файлами не через com , а с помощью Open XML SDK 2.0 for Microsoft Office , по сути это работа с xml'ем — данные пишутся в файл в текстовом виде, что гораздо (в разы) быстрее, проблема в том, что такой формат поддерживает только 2007 офис


sct>Это то я понял. Excel 2007 тоже подходит. Вопрос только, поддерживает ли Open XML вставку OLE-объектов и хорошо бы примерчик какой.

sct>Спасибо заранее.

первые же ссылки в гугле по "open xml sdk insert ole object"

http://blogs.msdn.com/b/brian_jones/archive/2009/06/30/embedding-an-open-xml-file-in-another-open-xml-file.aspx
http://openxmldeveloper.org/articles/1543.aspx
Re[6]: Вставка OLE-объектов в Excel - оптимизация
От: sct  
Дата: 01.06.10 11:59
Оценка:
Здравствуйте, crazydown, Вы писали:

C>первые же ссылки в гугле по "open xml sdk insert ole object"

C>...

С помощью Open XML SDK Productivity Tool получил из xslx-файла с OLE-объектом C# код для создания такого файла.
Все, в принципе, понятно, кроме самого главного. А именно, откуда в этом C# коде берутся бинарные данные для ole-объекта?
Там есть код типа:

public class Class1{
...
#region Binary Data
private string embeddedObjectPart1Data ="0M8R4KGxGuEAAAAAAAAAAAAAAAAAAAAAPgADAP7/CQAGAAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAEAAAEgAAAAEAAAD+////AAAAAAAAAAD////////////////////////////////////////////////////////////////
...
///////////////////////9/////v///wMAAAAEAAAABQAAAAYAAAA
...
EMgICAwICAwICAwICAwICAwICAwICAwICAwICAwICAwICAwICAwCiAgIC0wLjQ2OTkgICAgMC43Nzg3ICAgIDAuMDAwMCBDICAgMCAgMCAgMCAgMCAgMCAgMCAgMCAgMCAgMCAgMCAgMCAgMAogICAgMC4yNDYzICAgLTAuNDYyMyAgICAwLjAwMDAgQyAgIDAgIDAgIDAgIDAgIDAgIDAgIDAgIDAgIDAgIDAgIDAgIDAKICAgIDAuOTYwNyAgICAwLjc3ODcgICAgMC4wMD
..."
private string imagePart1Data ="..."
private string spreadsheetPrinterSettingsPart1Data = "..."
}

Смотрел под отладчиком свой код по вставке ole-объекта через PasteSpecial в excel — там таких бинарных данных не наблюдается .
Что тут можно сделать?
Re[7]: Вставка OLE-объектов в Excel - оптимизация
От: Angler Россия  
Дата: 01.06.10 15:46
Оценка:
Здравствуйте, sct, Вы писали:


sct>Смотрел под отладчиком свой код по вставке ole-объекта через PasteSpecial в excel — там таких бинарных данных не наблюдается .

sct>Что тут можно сделать?

Я так понимаю, что содержимое в base64. Открой свой xslx архиватором(к примеру 7zip) и поищи сам бинарник. Или ещё проще:
-создай копию своего оригинального xslx
-удали из него свой вставленный обьектик, сохрани
-в рефлекторе есть возможность сравнить два разных open xml файлика, он покажет тебе отличия, на основании которых можно будет уже дальше кумекать.
Да, а что за обьект пытаешься вставить?
Re[4]: Вставка OLE-объектов в Excel - оптимизация
От: Angler Россия  
Дата: 01.06.10 15:49
Оценка:
Здравствуйте, crazydown, Вы писали:

C>... проблема в том, что такой формат поддерживает только 2007 офис....


Не совсем так. Существует также возмножность работать и в 2003 офисе, при установке дополнительных элементов.
Re[5]: Вставка OLE-объектов в Excel - оптимизация
От: crazydown  
Дата: 02.06.10 03:25
Оценка:
Здравствуйте, Angler, Вы писали:

A>Здравствуйте, crazydown, Вы писали:


C>>... проблема в том, что такой формат поддерживает только 2007 офис....


A>Не совсем так. Существует также возмножность работать и в 2003 офисе, при установке дополнительных элементов.


подробнее пожалуйста
могу ли я с помощью Open XML SDK и "дополнительных элементов" получить бинарный формат (doc,xls) ?
Re[6]: Вставка OLE-объектов в Excel - оптимизация
От: Angler Россия  
Дата: 02.06.10 05:22
Оценка:
Здравствуйте, crazydown, Вы писали:

C>подробнее пожалуйста

C>могу ли я с помощью Open XML SDK и "дополнительных элементов" получить бинарный формат (doc,xls) ?

Не совсем так Если установить Microsoft Office Compatibility Pack for Word, Excel, and PowerPoint File Formats, то появится возможность в 2003 офисе открывать/редактировать/сохранять файлы в формате Open XML, который был введён начиная с 2007 офиса.
В нашей системе это используется для MS PP 2003 — полёт нормалный.
Re[8]: Вставка OLE-объектов в Excel - оптимизация
От: sct  
Дата: 02.06.10 08:01
Оценка:
Здравствуйте, Angler, Вы писали:

A>Я так понимаю, что содержимое в base64. Открой свой xslx архиватором(к примеру 7zip) и поищи сам бинарник. Или ещё проще:

A> -создай копию своего оригинального xslx
A> -удали из него свой вставленный обьектик, сохрани
A> -в рефлекторе есть возможность сравнить два разных open xml файлика, он покажет тебе отличия, на основании которых можно будет уже дальше кумекать.
A>Да, а что за обьект пытаешься вставить?

Не совсем понял, это к чему сравнение делать? Для того, чтобы понять, чем отличается xslx-файл с ole-объектом на такой же файл без ole-объекта? Так я это и так знаю — бинарными данными для ole-объекта!
У меня вопрос другой — как я могу эти бинарные данные получить в моем C# коде для вставки в генерируемый xslx-файл из моего ole-объекта? Дело в том, что через команду Reflect Code в XML SDK Productivity Tool я могу увидеть бинарники для конкретного ole-объекта, а мне их надо вставить программным способом пару тысяч. Сейчас я вставляю через буфер обмена кодом типа

oleObject.CopyToClipboard()
cell(i, j).PasteSpecial()


но это по производительности очень медлит.
Re[8]: Вставка OLE-объектов в Excel - оптимизация
От: sct  
Дата: 02.06.10 08:05
Оценка:
Здравствуйте, Angler, Вы писали:

A>Да, а что за обьект пытаешься вставить?


Может это и не столь важно — проблема с любым ole-объетом, хоть с Word.
Если важно, то работаю с Symyx Draw (http://www.symyx.com/micro/getdraw/) — такая приблуда для рисования химич. формул.
Re[9]: Вставка OLE-объектов в Excel - оптимизация
От: Angler Россия  
Дата: 02.06.10 10:31
Оценка:
Здравствуйте, sct, Вы писали:

sct>Здравствуйте, Angler, Вы писали:


A>>Да, а что за обьект пытаешься вставить?


sct>Может это и не столь важно — проблема с любым ole-объетом, хоть с Word.

sct>Если важно, то работаю с Symyx Draw (http://www.symyx.com/micro/getdraw/) — такая приблуда для рисования химич. формул.

вот только что проверил:
-создал xlsx
-вставил обьект ms word
-сохранил
-открыл рефлектором xlsx

имеем в scheet1:

<legacyDrawing r:id="rId1"/>
<oleObjects>
 <oleObject progId="Word.Document.12" dvAspect="DVASPECT_ICON" shapeId="1028" r:id="rId2"/>
</oleObjects>


теперь смотрим, на что ссылается "rId2":

<Relationship Id="rId2" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/package" Target="../embeddings/Microsoft_Office_Word-Dokument1.docx"/>


таким образом, чтобы вставить файлик Word-а в качестве oleObject-а, нам необходимо:
1. создать EmbeddedPackagePart:
EmbeddedPackagePart embeddedPackagePart1 = part.AddNewPart<EmbeddedPackagePart>  ("application/vnd.openxmlformats-officedocument.wordprocessingml.document", "rId2");

2. скормить ему данные файлика(см. FeedData)

Разница лишь в том, что встраиваемые файлы ты будешь создавать в Symyx Draw.
Re[10]: Вставка OLE-объектов в Excel - оптимизация
От: sct  
Дата: 02.06.10 14:29
Оценка:
Здравствуйте, Angler, Вы писали:

A>таким образом, чтобы вставить файлик Word-а в качестве oleObject-а, нам необходимо:

A>1. создать EmbeddedPackagePart:
A>
A>EmbeddedPackagePart embeddedPackagePart1 = part.AddNewPart<EmbeddedPackagePart>  ("application/vnd.openxmlformats-officedocument.wordprocessingml.document", "rId2");
A>

A>2. скормить ему данные файлика(см. FeedData)

A>Разница лишь в том, что встраиваемые файлы ты будешь создавать в Symyx Draw.


Спасибо за ответы .
Только пока все равно как-то не получается, увы .
Код примерно такой (пример для Word):

        private void CreateParts(SpreadsheetDocument document)
        {
            EmbeddedPackagePart embeddedPackagePart1 = worksheetPart3.AddNewPart<EmbeddedPackagePart>("application/vnd.openxmlformats-officedocument.wordprocessingml.document", "rId3");
            GenerateEmbeddedPackagePart1Content(embeddedPackagePart1);
            ...
        }
        private void GenerateEmbeddedPackagePart1Content(EmbeddedPackagePart embeddedPackagePart1)
        {
            System.IO.Stream data = GetBinaryDataStream(embeddedPackagePart1Data);
            embeddedPackagePart1.FeedData(data);
            data.Close();
        }
        ...
        #region Binary Data
        private string embeddedPackagePart1Data = "UEsDBBQABgAIAAAAIQDd/JU3ZgEAA...SBl1u1SyOWJ44DzJOViRCh";
        ...
        #endregion

Этот код я получил, взяв xslx файл со встроенным OLE-объектом Word и просмотрев его в через Reflect Code в XML SDK Productivity Tool.
Вот непонятно мне, откуда брать-то бинарные значения для embeddedPackagePart1Data (т. е. содержимое ole-объекта) ?
Как эти бинарные данные выудить из Word (или Symyx Draw) объекта? Что за метод дергать (сам экземпляр класса Symyx Draw есть у меня).
Re[11]: Вставка OLE-объектов в Excel - оптимизация
От: Angler Россия  
Дата: 02.06.10 21:02
Оценка:
Здравствуйте, sct, Вы писали:


sct>Вот непонятно мне, откуда брать-то бинарные значения для embeddedPackagePart1Data (т. е. содержимое ole-объекта) ?

sct>Как эти бинарные данные выудить из Word

Давай так: выложи 2 файлика
xslx — куда встраивать
docx — который ты хочешь встроить
и я набросаю на коленке, как это сделать.
Потом посмотрим пример с Symyx Draw
Re[12]: Вставка OLE-объектов в Excel - оптимизация
От: Angler Россия  
Дата: 02.06.10 22:32
Оценка: +1
Здравствуйте,

Вот "на коленке" сделал. Без обработки ошибок и исползования статических relationshipID's. В каталоге где запускаешь должны лежать два файла:
src.xlsx — пустой шаблон, как минимум с одним worksheet
emb.docx — файл, который хотим вставить как ole обьект
на выходе получем dst.xlsx


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DocumentFormat.OpenXml.Packaging;
using System.IO;
using DocumentFormat.OpenXml.Spreadsheet;
using DocumentFormat.OpenXml;

namespace XslxTest
{
    class Program
    {
        static WorksheetPart GetFirstWorksheetPart(WorkbookPart workbookPart)
        {
            Sheets sheets = workbookPart.Workbook.GetFirstChild<Sheets>();
            string relId = sheets.Elements<Sheet>().First().Id;
            return workbookPart.GetPartById(relId) as WorksheetPart;
        }

        static void Main(string[] args)
        {
            string srcFileName = "src.xlsx";
            string dstFileName = "dst.xlsx";
            string embFileName = "emb.docx";

            File.Copy(srcFileName, dstFileName, true);

            using(SpreadsheetDocument doc = SpreadsheetDocument.Open(dstFileName, true))
            {
                WorkbookPart workbookPart = doc.WorkbookPart;
                WorksheetPart worksheetPart = GetFirstWorksheetPart(workbookPart);

                EmbeddedPackagePart embeddedPackagePart1 = worksheetPart.AddNewPart<EmbeddedPackagePart>("application/vnd.openxmlformats-officedocument.wordprocessingml.document", "rId2");
                GenerateEmbeddedPackagePart1Content(embeddedPackagePart1, embFileName);

                VmlDrawingPart vmlDrawingPart1 = worksheetPart.AddNewPart<VmlDrawingPart>("rId1");
                GenerateVmlDrawingPart1Content(vmlDrawingPart1);

                ImagePart imagePart1 = vmlDrawingPart1.AddNewPart<ImagePart>("image/x-emf", "rId1");
                GenerateImagePart1Content(imagePart1);


                Worksheet worksheet = worksheetPart.Worksheet;


                LegacyDrawing legacyDrawing1 = new LegacyDrawing() { Id = "rId1" };
                worksheet.Append(legacyDrawing1);

                OleObjects oleObjects1 = new OleObjects();
                OleObject oleObject1 = new OleObject() { ProgId = "Word.Document.12", DataOrViewAspect = DataViewAspectValues.DataViewAspectIcon, ShapeId = (UInt32Value)1028U, Id = "rId2" };
                oleObjects1.Append(oleObject1);
                worksheet.Append(oleObjects1);


                worksheetPart.Worksheet.Save();
                workbookPart.Workbook.Save();

            }
        }

        private static void GenerateVmlDrawingPart1Content(VmlDrawingPart vmlDrawingPart1)
        {
            System.Xml.XmlTextWriter writer = new System.Xml.XmlTextWriter(vmlDrawingPart1.GetStream(System.IO.FileMode.Create), System.Text.Encoding.UTF8);
            writer.WriteRaw("<xml xmlns:v=\"urn:schemas-microsoft-com:vml\"\r\n xmlns:o=\"urn:schemas-microsoft-com:office:office\"\r\n xmlns:x=\"urn:schemas-microsoft-com:office:excel\">\r\n <o:shapelayout v:ext=\"edit\">\r\n  <o:idmap v:ext=\"edit\" data=\"1\"/>\r\n </o:shapelayout><v:shapetype id=\"_x0000_t75\" coordsize=\"21600,21600\" o:spt=\"75\"\r\n  o:preferrelative=\"t\" path=\"m@4@5l@4@11@9@11@9@5xe\" filled=\"f\" stroked=\"f\">\r\n  <v:stroke joinstyle=\"miter\"/>\r\n  <v:formulas>\r\n   <v:f eqn=\"if lineDrawn pixelLineWidth 0\"/>\r\n   <v:f eqn=\"sum @0 1 0\"/>\r\n   <v:f eqn=\"sum 0 0 @1\"/>\r\n   <v:f eqn=\"prod @2 1 2\"/>\r\n   <v:f eqn=\"prod @3 21600 pixelWidth\"/>\r\n   <v:f eqn=\"prod @3 21600 pixelHeight\"/>\r\n   <v:f eqn=\"sum @0 0 1\"/>\r\n   <v:f eqn=\"prod @6 1 2\"/>\r\n   <v:f eqn=\"prod @7 21600 pixelWidth\"/>\r\n   <v:f eqn=\"sum @8 21600 0\"/>\r\n   <v:f eqn=\"prod @7 21600 pixelHeight\"/>\r\n   <v:f eqn=\"sum @10 21600 0\"/>\r\n  </v:formulas>\r\n  <v:path o:extrusionok=\"f\" gradientshapeok=\"t\" o:connecttype=\"rect\"/>\r\n  <o:lock v:ext=\"edit\" aspectratio=\"t\"/>\r\n </v:shapetype><v:shape id=\"_x0000_s1028\" type=\"#_x0000_t75\" style=\'position:absolute;\r\n  margin-left:133.5pt;margin-top:19.5pt;width:1in;height:54pt;z-index:1\'\r\n  filled=\"t\" fillcolor=\"window [65]\" stroked=\"t\" strokecolor=\"windowText [64]\"\r\n  o:insetmode=\"auto\">\r\n  <v:fill color2=\"window [65]\"/>\r\n  <v:imagedata o:relid=\"rId1\" o:title=\"\"/>\r\n  <x:ClientData ObjectType=\"Pict\">\r\n   <x:SizeWithCells/>\r\n   <x:Anchor>\r\n    0, 178, 1, 6, 0, 274, 4, 18</x:Anchor>\r\n   <x:CF>Pict</x:CF>\r\n   <x:AutoPict/>\r\n  </x:ClientData>\r\n </v:shape></xml>");
            writer.Flush();
            writer.Close();
        }

        private static void GenerateImagePart1Content(ImagePart imagePart1)
        {
            System.IO.Stream data = GetBinaryDataStream(imagePart1Data);
            imagePart1.FeedData(data);
            data.Close();
        }

        // Generates content of embeddedPackagePart1.
        private static void GenerateEmbeddedPackagePart1Content(EmbeddedPackagePart embeddedPackagePart1, string fileName)
        {
            using(FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read))
            {
                embeddedPackagePart1.FeedData(fileStream);
            }         
        }
        
        private static string imagePart1Data = "AQAAAGwAAAAIAAAAAgAAAFYAAAA9AAAAAAAAAAAAAAC3CgAACQgAACBFTUYAAAEAOBUAABUAAAACAAAAAAAAAAAAAAAAAAAAkAYAABoEAADgAQAALAEAAAAAAAAAAAAAAAAAAABTBwDgkwQARgAAACwAAAAgAAAARU1GKwFAAQAcAAAAEAAAAAIQwNsBAAAAYAAAAGAAAABGAAAAXAAAAFAAAABFTUYrIkAEAAwAAAAAAAAAHkAJAAwAAAAAAAAAJEABAAwAAAAAAAAAMEACABAAAAAEAAAAAACAPyFABwAMAAAAAAAAAARAAAAMAAAAAAAAABgAAAAMAAAAAAAAABkAAAAMAAAA////ABQAAAAMAAAADQAAABIAAAAMAAAAAgAAACEAAAAIAAAAGAAAAAwAAAAAAAAAGQAAAAwAAAD///8AcgAAAKAQAAAgAAAAAgAAAD8AAAAhAAAAIAAAAAIAAAAgAAAAIAAAAACA/wEAAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAP///wAAAAAAbAAAADQAAACgAAAAABAAACAAAAAgAAAAKAAAACAAAAAgAAAAAQAgAAMAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAA/wAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuaSV/5F8av94YUz/alM8/2ZON/9iSjL/YEgw/2BIMP9gSDD/YEgw/2BIMP9gSDD/YEgw/2BIMP9gSDD/YEgw/2BIMP9gSDD/YEgw/2BIMP9gSDD/YEgw/2BIMP9gSDD/YEgw/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6pZb//Orf/9/NxP/dxbf/3r2s/964ov/jspj/5bOQ/+WzkP/ls5D/5bKO/+awi//nr4j/6a2F/+qsgv/rqn//7Kd7/+6ld//vo3P/8aFv//Gga//znmj/851l//SbY/9gSDD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALqllv/86+H//Ovh//zr4f/86+D/++rf//vp3//76d7/++nd//ro3P/759z/+uba//rm2f/65df/+uTW//rj1P/64tP/+eDS//ngz//53s7/+d3M//ncyv/528j/9Jxl/2BIMP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAu6aX//zu5P/77eT//O3k//vs5P/77OP//Ovi//vr4v/76+D/++rf//vp3//76d3/++jc//rn2v/65tr/+uTY//rk1v/54tT/+uHT//rg0f/538//+d7N//ncyv/znWf/YEgw/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC7p5j//O/n//zv5//77+b//O/m//zv5v/87eX//O3k//zt5P/87OP//Ovi//zq4f/86t//++re//vo3P/759v/+uba//rl1//65NX/+uLT//nh0f/64ND/+t/O//Keav9gSDD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALyomP/88er//PHp//zx6v/88On//PDp//zw6P/97+j//O/n//zu5v/87uX//O3k//zs4//87OH/06mL/9Koif/Rpof/0aWG/9CkhP/Po4P/+uPV//rh0v/64ND/8aBt/2BIMP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvama//3z7f/98+3//fPs//3y7P/98+v//fLr//zy6v/98er//fHp//zw6P/87+f//O7m//zt5P/87eP//Ovh//vq3//76d3/++jc//rm2f/65Nf/+uPW//ri0//wonD/YEgw/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC+qpv//fXv//307//jwaj/4r+l/+G9o//fu6H/3rme/923nP/btZr/2rOX/9mxlf/YsJP/166R/9asj//Vq43/1KmL/9Koif/Spoj/0aWG//vn2v/65dj/+uPW/++jc/9gSDD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL+rnP/+9vH//fbx//328f/99vH//fbx//718P/99fD//fXw//307//98+7//fPt//3y7P/88er//PDp//zv5//87uX//O3k//zr4v/86t//++jd//vn2v/65dj/7aV3/2BIMP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwKye//348//99/P/5sWt/+XDq//jwaj/4b6l/+C8ov/euqD/3rmf/923nP/ctpr/2rSY/9mylv/YsJP/166R/9atj//Vq43/1KqL/9Ooiv/76uD/++nd//vn2//tp3v/YEgw/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBrp7//vn1//759f/++fX//vj1//749f/++PX//vj1//339P/+9/P//vfz//338v/99vH//fXw//307v/98+3//PLr//zx6f/87+f//O7k//vs4v/76uD/++jd/+upf/9gSDD/AAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAMKun//++vf//vr3/+jJsf/nx6//5sWt/+XDq//jwqj/4sCm/+G+pP/gvKH/3rqf/924nP/ctpr/2rSY/9mylv/YsJT/166R/9atj//Vq47//O7l//zs4//76t//6auD/2BIMP8AAAAAAAAAAAAAAAAAAAABAAAABQAAAA0AAAAUrpyP/9/c2f/b2NX/1dHO/9DLyv/JxcP/xcG//8rGxP/Oysj/8ezp//v28//9+PX//vj1//749P/+9/P//fbx//318P/99O3//fLr//zx6f/87+f//O3k//zs4v/orof/YEgw/wAAAAAAAAAAAAAAAQAAAAMAAAAOAAAAIgAAADWQgXb/tLGv/62rqf+TfGv/mIN0/6KQgv+3p5n/yrus/8Ksmf+6oY//3bqh/+C9o//gvKL/3rqf/924nf/ctpv/27SY/9mylv/YsJT/16+S//zx6f/97+f//O3k/+avi/9gSDD/AAAAAAAAAABuOSXAczwnzWw4JNF5VEbekHpw6q+dlv/FuLL/3tbS//Xx7P/8+PP/+/bv//n06//48uf/vqmb/9jW1P/r6Ob//fr4//77+f/++vj//vn2//749f/99/P//fbx//307//98+3//fLr//3w6P/87ub/5bGP/2BIMP8AAAAAAAAAAIxLMPDeuar/vpqL/9Gmlf/////////////////+/vz//vz6//369v/8+PP/+/bv//n06//Bqpz/v6OO/9KznP/jwaj/4sCn/+G+pP/gvKL/37qg/924nf/ctpv/27SY/9qzlv/98+3//PHq//zw6P/ls5L/YEgw/wAAAAAAAAAAjk0z8Nq2qf+xclj/0720///////68vD/6MS9///////z4t3/2Z6T//369v/8+PP/+/bv/828sP/U0tL/6+no//78+//+/Pv//vz6//77+f/++vj//vn2//749P/99/P//fbx//307v/98u3//fHq/+S1lv9gSDD/AAAAAAAAAACQUDbw2bWm/6RTMf+4jXv///////nx7/+3XEX/9+3q//Hg3P+zVDv/7NTN//369v/8+PP/2MvB/9HPz//q6Oj//vz8///9/P/OoYH/zqGB/86hgf/OoYH/zqGB/86hgf/OoYH//vXw//307v/98uz/4rea/2BIMP8AAAAAAAAAAJJSOfDYtKT/ok8s/6RoT////////v38/6RHJ/+/fWf/79/Z/6dNL/+5cln//Pj1//369v/j2NH/z87N/+no5//+/fz///38//PKqv/mvqL/58On/+e/pP/is5P/5LaX/86hgf/+9vH//fTv//3z7f/huZz/YEgw/wAAAAAAAAAAlFU88Nizpf+iTyz/kEUm////////////n0gk/8WQev/Il4P/oEon/9WwoP/Ooo///vz6//Dq5f/My8v/6Ofn//79/f///v3/88qq/9mpiP/fspL/5bmb/+Cxkv/kt5n/zqGB//728v/99vD//fPu/+G6n/9gSDD/AAAAAAAAAACWWD/w2LSl/6RPLf+LORb/8evp//////+lVTP/6dbO/7FrTv+fSSb//v38/69nSf/v4dn/+/j2/8nIyP/m5eX//fz8///+/f/zyqr/6cGl/+jDqP/mvqL/3q+O/+O4mf/OoYH//vfz//328f/99e//37uh/2BIMP8AAAAAAAAAAJlbQfDmy8H/x451/7F3X//h1c//+/j3/6ZXNv/VsKD/7+Hc/6ZXNv//////wYly/7yAZ//+/vz/y8rK/+Xk5P/9/Pz///79//PKqv/049f/7NjK//v18P/kwqr/48Gn/+K/pf/eu6X/3rul/967pf/fvKP/YEgw/wAAAAAAAAAAm15E8OnQx//PmoX/vYZx/9bCuv/59PH/69jR/+zb1P/////////////////////////////////R0ND/5eTk//z7+////v3/88qq//359v/+/f3/69fJ/76snf+MdmP/iHJe/4FrV/96Y07/cltF/2pTPP9gSDD/AAAAAAAAAACVXEPk59DG/9eql//IlH//z7Oo/////////////////////////////////////////////////+Df3//p6Oj//fz8///+/f/zyqr///////v07//049f/v62d/+zSv//qzrv/58q1/+TErv/hvqn/YEgw/yUkJCkAAAAAAAAAAG1EM6XVsKH/8N3W/9Sij//VsaL///////////////////////38/P/x6eX/8+zq//Tv7v/cysL/9PPz//v6+v/+/f3///7+//PKqv/zyqr/88qq//PKqv/Brp///+7k//vo3P/03tD/7tTD/2BIMP8lJCQpGBgXGgAAAAAAAAAAIBQPMKhrUfzkyL7/8uDa/9KllP/SpZT/0qWU/9Wol//XqZj/16mY/9iqmP/SpZT/0qWU/7WEbv/8+/v//v39///+/v///v7///79//7+/f///fz///37/8KwoP//7uT/++jc//Xe0P9lTjb/JSQkKRgYFxoAAAAAAAAAAAAAAAAAAAAAQSkgYKZrUvbUrp//9eXf//Tk3v/05N7/9OTe//Xl3//15d//9eXf//Xl3//15d//u4hz//79/f///v7///7+///+/v///v3///39///9/P///fv/xLKj///u5P/76Nz/bFU+/yUkJCkYGBcaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFg4LIXFJOKWcZU3kr3JX/69yV/+vclf/r3JX/69yV/+vclf/r3JX/69yV/+9i3T///7+///+/v///v7///7+///+/v///v3///39///9/P/GtKT//+7k/4NuWf8lJCQpGBgXGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADRv7H////////////////////////////////////////////////////////+/v////7///7+///+/v///f3///38/8i1pf+chnT/JSQkKRgYFxoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANG/sf/Rv7H/0b+x/9G/sf/QvrD/z72v/8+9r//PvK7/zbut/827rP/Nuaz/zLmr/8u4qv/Kt6n/yreo/8m2p//Itqf/ybam/yUkJCkXFxcZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABSAAAAcAEAAAEAAAD1////AAAAAAAAAAAAAAAAkAEAAAAAAAAAAAUgVABhAGgAbwBtAGEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYDIAAAAA1iMAACDcEwABAAAAFNwTAH6ugHwU3BMAkK6AfAAAYDIAAAAAAABgMgAAAAAAAAAAAAAAAHTcEwB1TgAwAABgMoDHYTLQufUw0N8TAB8AAAAAAAAATNwTAL/LADDA3BMA0t8TAAwAAADA3BMAYNwTAH3LADDS3xMAAAATANDfEwBw3BMAY8sAMNLfEwACAAAAhNwTANtKATDS3xMABgAAAOdJATCgAAAAYAAAABcAAADQufUwAAAAAAAAATDc3RMAqN0TAPX///8AAAAAAAAAAAAAAACQAQAAAAAAAAAABSBUAGEAaABvAG0AYQAAAAAAAAAAAAAAAABkdgAIAAAAACUAAAAMAAAAAQAAABIAAAAMAAAAAQAAAFQAAAC0AAAACAAAACQAAABWAAAAMAAAAAEAAABJkuRBSZLkQQgAAAAkAAAAEQAAAEwAAAAAAAAAAAAAAAAAAAD//////////3AAAABNAGkAYwByAG8AcwBvAGYAdAAgAE8AZgBmAGkAYwBlACAASQAIAAAAAgAAAAUAAAAEAAAABgAAAAUAAAAGAAAABAAAAAQAAAADAAAACAAAAAQAAAAEAAAAAgAAAAUAAAAGAAAAAwAAAFQAAACcAAAACQAAADEAAABWAAAAPQAAAAEAAABJkuRBSZLkQQkAAAAxAAAADQAAAEwAAAAAAAAAAAAAAAAAAAD//////////2gAAABXAG8AcgBkAC0ARABvAGsAdQBtAGUAbgB0AHsACgAAAAYAAAAEAAAABgAAAAQAAAAHAAAABgAAAAUAAAAGAAAACAAAAAYAAAAGAAAABAAAACUAAAAMAAAADQAAgCIAAAAMAAAA/////0YAAAA0AAAAKAAAAEVNRisqQAAAJAAAABgAAAAAAIA/AAAAgAAAAIAAAIA/AAAAgAAAAIBGAAAAHAAAABAAAABFTUYrAkAAAAwAAAAAAAAADgAAABQAAAAAAAAAEAAAABQAAAA=";

        private static System.IO.Stream GetBinaryDataStream(string base64String)
        {
            return new System.IO.MemoryStream(System.Convert.FromBase64String(base64String));
        }

    }
}



и видимо для вставки твоего Symyx Draw прийдется покопаться с IStorage. ну и надо будет генерить картинку а также возможно vml объект.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.