как вставить картинку в документ word, excel?
От: jabber  
Дата: 10.07.09 07:27
Оценка:
А есть ли способ вставить изображение в документ word или excel не используя clipboard и вставку из файла.
Не хочется портить содержимое клипборда и создавать временный файл на диске, когда в памяти уже есть готовый image или bitmap
Re: как вставить картинку в документ word, excel?
От: Pavel_Agurov Россия  
Дата: 10.07.09 08:03
Оценка:
Здравствуйте, jabber, Вы писали:

J>А есть ли способ вставить изображение в документ word или excel не используя clipboard и вставку из файла.

J>Не хочется портить содержимое клипборда и создавать временный файл на диске, когда в памяти уже есть готовый image или bitmap

Хотя бы написали бы условия задачи... Вы создаете файл или есть готовый? Если создаете, то в каком формате — если WordML, то одно. Если еще что-то, то другое... Если используете interop PIA то вообще другие пути...
На абстрактный вопрос вам никто не ответит.
Re[2]: как вставить картинку в документ word, excel?
От: Кондор Россия  
Дата: 10.07.09 08:07
Оценка: -2
Здравствуйте, Pavel_Agurov, Вы писали:
P_A>На абстрактный вопрос вам никто не ответит.
А как же ты?
ДДТ!
Re: как вставить картинку в документ word, excel?
От: GOre01 Россия  
Дата: 10.07.09 08:29
Оценка:
Здравствуйте, jabber, Вы писали:

J>А есть ли способ вставить изображение в документ word или excel не используя clipboard и вставку из файла.

J>Не хочется портить содержимое клипборда и создавать временный файл на диске, когда в памяти уже есть готовый image или bitmap


Небольшой класс для вставки картинки в документы MS Word (может можно и в Excel таким образом вставлять)

На выходе (ToString()) получаем строку в формате WordML, и далее находим Range, куда надо вставить картинку:

PictureWriter pw = PictureWriter.Create(image, ...);

Range r = ...;
r.Text = " ";
r.InsertXml(pw.ToString(), (object)Type.Missing);

PS: работает с Word 2003/2007

public class PictureWriter
    {
        private static readonly NameValueCollection namespaces;
        private const string WordMLNS = "http://schemas.microsoft.com/office/word/2003/wordml";
        private const string VMLNS = "urn:schemas-microsoft-com:vml";
        private const string OfficeNS = "urn:schemas-microsoft-com:office:office";

        private readonly int _width;
        private readonly int _height;
        private readonly byte[] _data;

        private string _title;
        private string _name;
        private string _extension;

        /// <summary>
        /// Constructor for Namesspace initializer
        /// </summary>
        static PictureWriter()
        {
            namespaces = new NameValueCollection { { "w", WordMLNS }, { "v", VMLNS }, { "o", OfficeNS } };
        }

        /// <summary>
        /// Creates a new PictureWriter instance
        /// </summary>
        public static PictureWriter Create(Image img, string title, string name)
        {
            if (img == null)
                throw new ArgumentNullException("img");
            return new PictureWriter(img, title, name);
        }

        private PictureWriter(Image Img, string title, string name)
        {

            _title = title;
            _name = name;
            _width = Img.Width;
            _height = Img.Height;

            using (var bmp = new Bitmap(Img, _width, _height))
            using (var stream = new MemoryStream())
            {
                bmp.Save(stream, ImageFormat.Png);
                stream.Flush();
                _data = stream.ToArray();
                stream.Close();
                bmp.Dispose();
            }

            SetExtension(ImageFormat.Png);
        }

        public string Name
        {
            get { return _name; }
            set { _name = value; }

        }

        public string Title
        {
            get { return _title; }
            set { _title = value; }
        }

        protected void WriteDoc(XmlTextWriter tw)
        {
            tw.WriteStartDocument();
            tw.WriteProcessingInstruction("mso-application", "progid=Word.Document");

            tw.WriteStartElement("w", "wordDocument", WordMLNS);
            foreach (var prefix in namespaces.AllKeys)
                tw.WriteAttributeString("xmlns", prefix, null, namespaces[prefix]);

            tw.WriteStartElement("body", WordMLNS);

            WritePict(tw);

            tw.WriteEndElement();
            tw.WriteEndElement();
            tw.WriteEndDocument();
        }

        private void WritePict(XmlWriter tw)
        {
            if (_data == null || _data.Length == 0)
                return;
            tw.WriteStartElement("pict", WordMLNS);
            tw.WriteStartElement("binData", WordMLNS);
            tw.WriteAttributeString("name", WordMLNS, string.Format("wordml://{0}{1}", _name, _extension));

            tw.WriteBase64(_data, 0, _data.Length);

            tw.WriteEndElement();

            tw.WriteStartElement("shape", VMLNS);
            tw.WriteAttributeString("id", "_x0000_" + _name);
            tw.WriteAttributeString("style", string.Format("width:{0}px;height:{1}px", _width, _height));

            tw.WriteStartElement("imagedata", VMLNS);
            tw.WriteAttributeString("src", string.Format("wordml://{0}{1}", _name, _extension));
            tw.WriteAttributeString("title", OfficeNS, _title);

            tw.WriteEndElement();
            tw.WriteEndElement();
            tw.WriteEndElement();
        }

        public override string ToString()
        {
            using (var ms = new MemoryStream())
            using (var tw = new XmlTextWriter(ms, System.Text.Encoding.ASCII))
            {
                WriteDoc(tw);
                tw.Flush();

                string str = System.Text.Encoding.ASCII.GetString(ms.ToArray());
                System.Diagnostics.Trace.WriteLine("====== Begin XmlImg ======");
                System.Diagnostics.Trace.WriteLine(str);
                System.Diagnostics.Trace.WriteLine("======  End XmlImg  ======");
                return str;
            }
        }

        #region "Helper methods"

        private void SetExtension(ImageFormat imgFormat)
        {
            if (Equals(imgFormat, ImageFormat.Jpeg))
                _extension = ".jpg";
            else if (Equals(imgFormat, ImageFormat.Bmp))
                _extension = ".bmp";
            else if (Equals(imgFormat, ImageFormat.Gif))
                _extension = ".gif";
            else if (Equals(imgFormat, ImageFormat.Png))
                _extension = ".png";
            else
                _extension = string.Empty;
        }

        #endregion
    }
Re[2]: как вставить картинку в документ word, excel?
От: jabber  
Дата: 10.07.09 08:48
Оценка:
Здравствуйте, Pavel_Agurov, Вы писали:

P_A>Хотя бы написали бы условия задачи... Вы создаете файл или есть готовый? Если создаете, то в каком формате — если WordML, то одно. Если еще что-то, то другое... Если используете interop PIA то вообще другие пути...

P_A>На абстрактный вопрос вам никто не ответит.

Пардон, создаю документ, используя Office XP PIA. Надо в определенное место документа вставить изображение со штрих-кодом.

пока использую что-то вроде вот етого:
            Microsoft.Office.Interop.Excel._Application excel=new ApplicationClass();
            Workbook wb=excel.Workbooks.Add("");
            Worksheet ws = (Worksheet)wb.Sheets.get_Item("Лист1");
            ws.Shapes.AddPicture(@"c:\a.bmp", MsoTriState.msoFalse, MsoTriState.msoTrue, 0, 0, 200, 28);
Re[3]: как вставить картинку в документ word, excel?
От: jabber  
Дата: 10.07.09 12:16
Оценка:
ап
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.