А есть ли способ вставить изображение в документ word или excel не используя clipboard и вставку из файла.
Не хочется портить содержимое клипборда и создавать временный файл на диске, когда в памяти уже есть готовый image или bitmap
Здравствуйте, 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
}
Здравствуйте, 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);