2013-05-01 15 views
7

Mam obraz w strumieniu pamięci i chcę to zapisać w dokumencie MS Excel, PIA eksponuje tylko metodę AddPicture, która przyjmuje ścieżkę pliku.Dodawanie obrazu ze strumienia pamięci do dokumentu Excel

Czy istnieje możliwość dodania zdjęcia bez zapisywania go na dysku?

MSDN

http://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel.shapes.addpicture(v=office.14).aspx

+1

Czy możesz dodać kod, który chcesz? kilka linii, które dodają dane do zmiennej memorystream (format obrazu?) i AddPicture lub zakres/komórkę, w której chcesz, aby obraz był –

+0

Nie mam na to żadnego kodu, chcę dodać to do istniejącego doskonalić proces generowania dokumentów. – AwkwardCoder

+0

i masz MemoryStream (ByteArrayImage), prawda? –

Odpowiedz

3

Cóż, trochę ślepy latania, ale przy założeniu, że to i owo o kodzie (np źródłem strumienia, typ danych, etc) to może być rozwiązanie:
Najpierw należy utworzyć dane obrazu bitmapowego ze strumienia (który, jak przypuszczam, jest strumieniem bajtów, przy założeniu, że strumień opisuje obraz bitmapowy). Jest to rozwiązanie już za to tutaj na przepełnienie stosu: Byte Array to Bitmap Image
skopiować i wkleić kod z roztworu:

int w= 100; 
int h = 200; 
int ch = 3; //number of channels (ie. assuming 24 bit RGB in this case) 

byte[] imageData = new byte[whch]; //you image data here Bitmap bitmap = new Bitmap(w,h,PixelFormat.Format24bppRgb); BitmapData bmData = bitmap.LockBits(new System.Drawing.Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadWrite, bitmap.PixelFormat); IntPtr pNative = bmData.Scan0; Marshal.Copy(imageData,0,pNative,whch); bitmap.UnlockBits(bmData);
także zakładając, że masz obiektu do skoroszytu i arkusza masz zamiar pracować, coś takiego:
xlBook = (Excel.Workbook)objExcel.Workbooks.Add(""); 
xlSheet = (Excel.Worksheet)xlBook.Worksheets 1 ; 
xlSheet.Activate(); 
Teraz, gdy masz zmienną typu Bitmap i arkusz kalkulacyjny, wystarczy wkleić obraz do arkusza:
System.Windows.Forms.Clipboard.SetDataObject(bitmap, false); 
xlsRange = xlSheet.get_Range((Excel.Range)xlSheet.Cells[5, 15], (Excel.Range)xlSheet.Cells[5, 15]); 
xlSheet.Paste(xlsRange, bitmap); 

Kluczem jest tu ten facet (zamiast "AddPicture"): Worksheet.Paste Method
Mam nadzieję, że pomaga!

+0

Dziękuję za tak kompletną odpowiedź, zagłosuję po wprowadzeniu – AwkwardCoder

+0

Niestety to nie zadziała dla mnie - kod wykonuje się na wątku tła (puli zadań) i dlatego nie jest to wątek STA, Clipboard wymaga tego. – AwkwardCoder

+0

Trudne, jesteś. Nowa zasada. co powiesz na evergreen "[threadobjvar] .SetApartmentState (System.Threading.ApartmentState.STA);" ? –

Powiązane problemy