2015-01-13 2 views
4

Есть ли способ нарисовать изображение непосредственно на холсте, которое содержит ячейки Excel, используя VSTO, без необходимости вставлять фигуру?Рисование непосредственно на холст ячейки Excel

Я видел это и знаю, что возможно, я просто не могу найти источник информации.

Range cell = sheet.Cells[1, 1]; 

    var border = cell.Borders[XlBordersIndex.xlDiagonalDown]; 
    border.Weight = XlBorderWeight.xlThin; 
    border.LineStyle = XlLineStyle.xlContinuous; 

Этот фрагмент кода, как представляется, создает рисунок внутри полотна ячейки. Мне нужно получить доступ к слою, на который это нарисовано.

+0

Можно установить фоновое изображение листа: Http: //www.aspose.com/docs/display/cellsnet/Set + Background + Picture + of + a + Worksheet –

+0

@AxelRichter Это выглядит хорошо, но не применимо ли оно только к всему листу? Я хочу получить доступ к тому же слою, но мне нужно сделать привязку к определенной ячейке. – Hristo

+0

@PatrickHofman У меня уже есть реализованный, он работает, но объекты не являются частью ячейки. – Hristo

ответ

1

К сожалению, нет никакого способа, чтобы рисовать на холсте непосредственно, по крайней мере, через общедоступный API, и вы определенно не можете использовать GDI + рисование двигатель рисовать, который вы предлагаете, когда вы хотите повторно использовать код из используя элементы управления Windows Forms.

Я изучаю возможность рисования с использованием Windows напрямую, но это тоже не представляется возможным, поскольку Excel не хранит дескриптор для каждой ячейки, так как трудно понять, какую ячейку рисовать. Кроме того, этот рисунок не будет настойчивым, что является серьезным недостатком, на мой взгляд.


Вы нашли this movie себя, и я думаю, что есть жизнеспособный вариант там. Если вы могли бы сделать ваши рисунки на изображение, вы можете вставить этот чертеж в линию по формуле (обратите внимание, что изображения по-прежнему являются фигурами, которые вам не нравятся, но я думаю, мы можем сделать для них исключение).

Если объекты OLE используются или необходимы для рендеринга, я бы посоветовал не использовать их. Они, по моему мнению, слишком «старая школа» и не будут работать ни с чем, кроме Office на вашем рабочем столе Windows.

+0

Посмотрите на этот http://youtu.be/t_P3ndOxNP0?t=11m51s – Hristo

+0

@ Крис: Кажется, он внедряет OLE-объект. Пожалуйста, не надо. Они, по моему мнению, слишком «старая школа» и не будут работать ни с чем, кроме Office на вашем рабочем столе Windows. –

+0

@Chris: Обновлен раздел под строкой. –

-2

Это очень простой скрипт VBA, который рисует прямоугольник и заполняет его желаемым изображением. Вместо привязки к ячейке его положение и размер относятся к рабочему листу. Вам нужно будет изменить его в соответствии с вашими конкретными потребностями, но казалось, что ваш камнем преткновения выходит за рамки схемы позиционирования на основе клеток.

Sub PlaceImage() 

Dim ws As Excel.Worksheet 
Dim sh As Excel.Shape 

    Set ws = ThisWorkbook.Worksheets(1) 'use an index number or string as needed 
    Set sh = ws.Shapes.AddShape(msoShapeRectangle, 100, 60, 400, 300) 'x-pos, y-pos, width, height 

    sh.Fill.Visible = msoTrue 
    sh.Fill.UserPicture "C:\Users\Public\Pictures\Sample Pictures\Desert.jpg" 'filename of image 
    sh.Line.Visible = msoFalse 'removes the outline 

    Range("A1").Select 

End Sub 
+0

Я ищу что-то, что позволяет мне рисовать непосредственно на полотне клетки. То, что вы указываете, - это решение с формами, которые у меня уже есть и не нужны. Но спасибо за усилия. – Hristo

+0

Могу ли я спросить, что именно вы пытаетесь реализовать, что конкретно требует холста? – ExactaBox

+0

OP запрашивает «без необходимости вставки фигуры». Вы предлагаете: используя форму. Кроме того, VBA не является C#. –

2

пример в видео (которое вы не отвечал на момент моего первоначального ответа) не «рисовать на холсте,» вместо того, чтобы программа генерирует OLE объекты и встраивает их в ячейках электронной таблицы. Это можно увидеть, когда вторичное приложение используется для фактического вытягивания молекул. Если возникло какое-либо сомнение в том, использует ли он OLE, имя должно положить их на отдых - оно называется MarvinOLE. Существует некоторая документация, в том числе о том, как взаимодействовать с объектами OLE других поставщиков, here. Поскольку OLE является технологией COM, и Excel's interfaces are all COM-based, это работает.

Если вы на 100% привержены обучению тому, как «нарисовать изображение прямо на холсте», пожалуйста, проигнорируйте остальную часть этого ответа. Поскольку вы хотите использовать C# (язык .NET) для взаимодействия с COM-интерфейсами Excel, вам необходимо ознакомиться с Primary Interop Assemblies. Их ссылку можно найти here. Если вы ориентируетесь только на новейшие версии Excel/Office, вы можете посмотреть на this SO answer, обсуждая «улучшенный» интерфейс Interop. Here's a blogger с примером, который может помочь вам приступить к работе.

Поиск «excel interop oleobjects» или что-то подобное, и вы найдете множество примеров, SO вопросы, документация и т.д.

+0

Хорошо, это звучит достаточно хорошо для меня. Вы получите награду, ответ на вопрос, который будет отправлен Патрику, так как он также предложил объекты OLE в качестве решения. Спасибо :) – Hristo

Смежные вопросы