Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.72/25: Рейтинг темы: голосов - 25, средняя оценка - 4.72
-=Guest=-
1 / 1 / 0
Регистрация: 08.02.2011
Сообщений: 16
1

Вставка в Excel рисунка на форме

17.06.2011, 10:23. Просмотров 4740. Ответов 10
Метки нет (Все метки)

Здравствуйте, я только начал изучать С#. В сети много примеров про вставку рисунков в Excel из файлов, но мне надо вставить рисунок, нарисованный на форме.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.06.2011, 10:23
Ответы с готовыми решениями:

Вставка HTML-таблицы в Excel
Приветствую господа, У меня есть excel таблица в HTML-формате такого вида:...

Вставка картинок во все найденные Excel-файлы, попутно объединяя все PDF в один
В общем, в чем проблема. Как сделать, чтоб при запуске программы открывалось...

Вставка рисунка в Excel из буфера обмена
Доброго ситуация такая, надо загнать изображение в буфер, а потом в цикле...

Вставка рисунка в Excel используя путь
Добрый день, подскажите каким образом можно массово вставить картинки в Excel в...

Движение рисунка по форме VBA (Excel)
С движением я разобрался, вопрос, как сделать так что бы рисунку придать...

10
Slap
176 / 172 / 14
Регистрация: 17.01.2011
Сообщений: 349
17.06.2011, 10:26 2
Рисунок на форме или все же на PictureBox?
0
-=Guest=-
1 / 1 / 0
Регистрация: 08.02.2011
Сообщений: 16
17.06.2011, 10:29  [ТС] 3
Пока использую Graphics, но хочу попробовать PictureBox
0
Slap
176 / 172 / 14
Регистрация: 17.01.2011
Сообщений: 349
17.06.2011, 10:36 4
-=Guest=-, если PictureBox, то можно просто сохранить во временный файл содержимое и вставить тем же способом:
C#
1
2
Bitmap tmpSave = new Bitmap(_x,_y,g);
tmpSave.Save(@"C:\tmp.bmp",System.Drawing.Imaging.ImageFormat.Bmp);
Про Bitmap читаем тут: http://msdn.microsoft.com/ru-ru/library/system.drawing.bitmap.aspx

Graphics также не сложно преобразовать в файл, гуглите "c sharp graphics save to file"
1
-=Guest=-
1 / 1 / 0
Регистрация: 08.02.2011
Сообщений: 16
17.06.2011, 10:48  [ТС] 5
Ясненько. Просто хотелось вставить картинку напрямую, минуя стадию сохранения во временный файл
0
Slap
176 / 172 / 14
Регистрация: 17.01.2011
Сообщений: 349
17.06.2011, 10:49 6
-=Guest=-, а пример кода, которым вы вставляете файл картинки в excel можете дать? Посмотрим, может и без сохранения получится.
0
-=Guest=-
1 / 1 / 0
Регистрация: 08.02.2011
Сообщений: 16
17.06.2011, 10:56  [ТС] 7
Код не мой, взят с http://csharp.net-informations.com/e...ture-excel.htm
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
using System;
using System.Windows.Forms;
using Excel = Microsoft.Office.Interop.Excel; 
 
namespace WindowsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            Excel.Application xlApp ;
            Excel.Workbook xlWorkBook ;
            Excel.Worksheet xlWorkSheet ;
            object misValue = System.Reflection.Missing.Value;
 
            xlApp = new Excel.ApplicationClass();
            xlWorkBook = xlApp.Workbooks.Add(misValue);
            xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);
 
            //add some text 
            xlWorkSheet.Cells[1, 1] = "http://csharp.net-informations.com";
            xlWorkSheet.Cells[2, 1] = "Adding picture in Excel File";
 
            xlWorkSheet.Shapes.AddPicture("C:\\csharp-xl-picture.JPG", Microsoft.Office.Core.MsoTriState.msoFalse, Microsoft.Office.Core.MsoTriState.msoCTrue, 50, 50, 300, 45); 
 
 
            xlWorkBook.SaveAs("csharp.net-informations.xls", Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue);
            xlWorkBook.Close(true, misValue, misValue);
            xlApp.Quit();
 
            releaseObject(xlApp);
            releaseObject(xlWorkBook);
            releaseObject(xlWorkSheet);
 
            MessageBox.Show ("File created !");
        }
 
        private void releaseObject(object obj)
        {
            try
            {
                System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
                obj = null;
            }
            catch (Exception ex)
            {
                obj = null;
                MessageBox.Show("Unable to release the Object " + ex.ToString());
            }
            finally
            {
                GC.Collect();
            }
        } 
 
    }
}
0
Redfex
597 / 521 / 114
Регистрация: 24.03.2011
Сообщений: 576
17.06.2011, 11:01 8
Вставка картинки без сохранения, через буфер обмена:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
     Excel.Application ThisApplication = new Excel.ApplicationClass();
     Excel.Workbook ThisWorkBook;
     string FileName = "C:\\test.xls";
     object missing = System.Reflection.Missing.Value;
     ThisWorkBook = ThisApplication.Workbooks.Open(FileName, missing, missing, 5, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing);
     Excel.Worksheet ThisSheet = (Excel.Worksheet)ThisWorkBook.Sheets[1];
     Excel.Range oRange = (Excel.Range)ThisSheet.Cells[1, 1];
 
     Clipboard.SetDataObject(pictureBox1.Image, true);
     ThisSheet.Paste(oRange, missing);
 
     ThisWorkBook.Save();
     ThisApplication.Quit();
     ThisWorkBook = null;
     ThisApplication = null;
2
Slap
176 / 172 / 14
Регистрация: 17.01.2011
Сообщений: 349
17.06.2011, 11:03 9
Redfex, интересное решение
0
-=Guest=-
1 / 1 / 0
Регистрация: 08.02.2011
Сообщений: 16
24.06.2011, 06:01  [ТС] 10
Здравствуйте. В PictureBox загрузил картинку, т.с. "подложку", поверх нее рисую с помощью Graphics. Но в Excel вставляется, только изображение "подложки".

Вызов ф-ии вставки изображения:
C#
1
InsertPicture((Excel.Range)exWorkSheet.Cells[3, 19], pbScheme2.Image);
Ф-я вставки:
C#
1
2
3
4
5
6
7
8
bool InsertPicture(Excel.Range range,Image image)
        {            
            if (exWorkSheet == null || image==null || range==null) return false;
            Clipboard.SetDataObject(image, true);
            exWorkSheet.Paste(range, Type.Missing);
            Clipboard.Clear();
            return true;
        }
Здесь рисую:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
private void pbScheme1_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button != MouseButtons.Right)
            {
                flagDraw = true;
                points.Clear();
            }
        }
 
        private void pbScheme1_MouseMove(object sender, MouseEventArgs e)
        {
            if (flagDraw!=true) return;
            Point p = new Point(e.X, e.Y);
            points.Add(p);
            if (points.Count < 2) return;            
            Point[] pts = new Point[points.Count];
            points.CopyTo(pts, 0);            
            Graphics g = Graphics.FromHwnd(((PictureBox)sender).Handle);            
            g.DrawCurve(pen, pts);            
        }
 
        private void pbScheme1_MouseUp(object sender, MouseEventArgs e)
        {
            flagDraw = false;
        }
Мне кажется что тут либо Graphics g по другому инициализировать нужно, либо перед вызовом InsertPicture как-то обновить pbScheme2 необходимо. Нужно, чтобы "подложку" и рисунки поверх нее, можно было вставить в Excel. Есть идеи как осуществить?
0
-=Guest=-
1 / 1 / 0
Регистрация: 08.02.2011
Сообщений: 16
27.06.2011, 09:34  [ТС] 11
Нашел решение, используя WinAPI функции.
Теперь вызов ф-и вставки изображения выглядит так
Код
Rectangle r = pbScheme2.ClientRectangle;            
            Bitmap bmp=CreateBitmapFromGraphics(pbScheme2.CreateGraphics(),                
                r.X,
                r.Y,
                r.Width,
                r.Height);      
            
            InsertPicture((Excel.Range)exWorkSheet.Cells[3, 19], bmp);
Ф-я создания Bitmap изображения из Graphics
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Bitmap CreateBitmapFromGraphics(Graphics graphicsSource,int x,int y, int width, int height)
        {         
            //Получаем HDC (контекст устройства)
            IntPtr hDCSource = graphicsSource.GetHdc();
            //Создаем HDC, совместимый с только-что полученным
            IntPtr hDCDestination = Win32.CreateCompatibleDC(hDCSource);
            //Создаем Win32 bitmap, совместимый с HDC (полученном на первом шаге)
            IntPtr hBitmap = Win32.CreateCompatibleBitmap(hDCSource, width, height);
            //Выбираем bitmap в DC (делаем его текущим), чтобы затем рисовать на нем
            IntPtr hPreviousBitmap = Win32.SelectObject(hDCDestination, hBitmap);
            //Выполняем копирование из полученного DC во вновь созданный совместимый DC,
            //получая таким образом в совместимом bitmap?e нужную картинку
            Win32.BitBlt(hDCDestination, 0, 0, width, height, hDCSource, x, y,Win32.SRCCOPY);
            //Создаем объект System.Drawing.Bitmap
            Bitmap bitmap = Bitmap.FromHbitmap(hBitmap);
            //Удаляем уже ненужные объекты
            Win32.DeleteObject(hDCDestination);
            Win32.DeleteObject(hBitmap);
            //Освобождаем DC
            graphicsSource.ReleaseHdc(hDCSource);
            return bitmap;
        }
Класс Win32
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
using System;
using System.Runtime.InteropServices;
using System.Drawing;
 
namespace Win32GDI
{
    public class Win32
    {
        [DllImport("User32.dll")]
        public static extern IntPtr GetDC(IntPtr hWnd);
 
        [DllImport("User32.dll")]
        public static extern IntPtr ReleaseDC(IntPtr hWnd, IntPtr hDC);
 
        [DllImport("Gdi32.dll")]
        public static extern int BitBlt(
            IntPtr hdcDest,
            int nXDest,
            int nYDest,
            int nWidth,
            int nHeight,
            IntPtr hdcSrc,
            int nXSrc,
            int nYSrc,
            int dwRop
            );
 
        [DllImport("Gdi32.dll")]
        public static extern int StretchBlt(
            IntPtr hdcDest,
            int nXOriginDest,
            int nYOriginDest,
            int nWidthDest,
            int nHeightDest,
            IntPtr hdcSrc,
            int nXOriginSrc,
            int nYOriginSrc,
            int nWidthSrc,
            int nHeightSrc,
            int dwRop
            );
 
        public const int SRCCOPY = 0x00CC0020;
 
        [DllImport("Gdi32.dll")]
        public static extern int SetROP2(IntPtr hDC, int fnDrawMode);
 
        public const int R2_NOT = 6;
        public const int R2_NOP = 11;
 
        [DllImport("Gdi32.dll")]
        static extern int MoveToEx(IntPtr hDC, int x, int y, IntPtr lpPoint);
 
        public static int MoveTo(IntPtr hDC, int x, int y)
        {
            return MoveToEx(hDC, x, y, IntPtr.Zero);
        }
 
        [DllImport("Gdi32.dll")]
        public static extern int LineTo(IntPtr hDC, int nXEnd, int nYEnd);
 
        [DllImport("Gdi32.dll")]
        static extern int GetPixel(
            IntPtr hdc,
            int nXPos,
            int nYPos
            );
 
        public static Color GetPixelColor(IntPtr hDC, int x, int y)
        {
            long colorRef = GetPixel(hDC, x, y);
            return Color.FromArgb((byte)colorRef, (byte)(colorRef >> 8), (byte)(colorRef >> 16));
        }
 
        [DllImport("Gdi32.dll")]
        public static extern IntPtr SelectObject(IntPtr hDC, IntPtr hGdiObj);
 
        [DllImport("Gdi32.dll")]
        public static extern IntPtr CreateCompatibleDC(IntPtr hdc);
 
        [DllImport("Gdi32.dll")]
        public static extern IntPtr CreateCompatibleBitmap(IntPtr hDC, int nWidth, int nHeight);
 
        [DllImport("Gdi32.dll")]
        public static extern int DeleteObject(IntPtr hObject);
    }
}
линк
0
27.06.2011, 09:34
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.06.2011, 09:34

Вставка рисунка по размерам
Здравствуйте. До этого делал, сейчас вылетела из головы. В ворде есть рисунок....

Вставка рисунка в Word
Здравствуйте, товарищи программисты! Подскажите, пожалуйста, средства,...

Вставка рисунка в Qt Designer
Здравствуйте! Кто может подсказать как в форму добавить рисунок таким образом,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru