Страница 1 из 2

Продолжение: создание отчета кодом

Добавлено: 10 янв 2007, 08:39
BeraleX
Еще раз извините, счастье мое было недолгим.
Появилась еще одна проблема - в отчет нужно добавлять изображение.

Пробую такой код:
tmp - объект класса Image.

report.IsRendered = true;
report.NeedsCompiling = false;

StiImage img = new StiImage();
img.Image = tmp;
img.DisplayRectangle = new RectangleD(pos, CurrentHeight, 5,5);
img.Stretch = true;
img.Name = "Image" + k.ToString();
page.Components.Add(img);
report.RenderedPages.Add(page);
report.Show();

При отображении все отлично, но как только пытаюсь сделать экспорт, то:
в pdf - изображение просто отсутствует
excel - вылетает ошибка Net со стеком:

************** Exception Text **************
System.NullReferenceException: Object reference not set to an instance of an object.
at Stimulsoft.Report.Export.StiExcelExportService.MakeMainStream(StiPage page)
at Stimulsoft.Report.Export.StiExcelExportService.ExportExcel(StiReport report, Stream stream, StiPagesRange pageRange, Boolean useOnePageHeaderAndFooter, Boolean exportDataOnly, Boolean exportObjectFormatting)
at Stimulsoft.Report.Export.StiExcelExportService.Export(StiReport report, String fileName, Boolean sendEMail)
at Stimulsoft.Report.Render.StiPreviewControl.cmExport_Click(Object sender, EventArgs e)
at System.Windows.Forms.MenuItem.OnClick(EventArgs e)
at System.Windows.Forms.MenuItem.MenuItemData.Execute()
at System.Windows.Forms.Command.Invoke()
at System.Windows.Forms.Command.DispatchID(Int32 id)
at System.Windows.Forms.Control.WmCommand(Message& m)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ButtonBase.WndProc(Message& m)
at System.Windows.Forms.Button.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

и т.д.
Опять что то не до конца делаю?
Спасибо.


Продолжение: создание отчета кодом

Добавлено: 10 янв 2007, 09:07
Edward
Пожалуйста, добавьте следующие строки при создании объекта img:

Код: Выделить всё

img.Report = report;
img.Page = page;
Спасибо.

Продолжение: создание отчета кодом

Добавлено: 10 янв 2007, 09:27
BeraleX
PDF выгружается нормально, с изображением.

В Excel та же ошибка вот точный участок кода, формирующий изображение:

StiImage img = new StiImage(new RectangleD(pos, CurrentHeight, 10, 10));
img.Report = report;
img.Page = page;
img.Image = tmp;
img.Stretch = true;
img.Name = "Image" + k.ToString();
page.Components.Add(img);

Продолжение: создание отчета кодом

Добавлено: 10 янв 2007, 10:12
Edward
Пожалуйста, возьмите сегодняшний билд, в котором исправлена ошибка вчерашнего билда в реализации экспорта изображений в Excel.

Спасибо.

Продолжение: создание отчета кодом

Добавлено: 10 янв 2007, 10:32
BeraleX
Взял новый билд, обнаружил следующие проблемы:

- экспорт в Excel проходит без ошибки, но на месте картинки ничего нет, только пустая ячейка.
- при открытии файла. выгруженного в формате Excel xml появляется окно с информацией об обнаруженной ошибке и опять никакого рисунка.
- может так и должно быть, но напишу, при выгрузке в html и архив html картинка тоже отсутствует.

Спасибо.



P.S. Попробовал уменьшить изображение, все стало нормально экспортироваться, в связи с чем вопрос. Подскажите, как правильно пересчитать размер изображения из пикселов в размеры страницы отчета. Ведь они отличаются?

Продолжение: создание отчета кодом

Добавлено: 10 янв 2007, 11:02
Edward
Пришлите, пожалуйста, исходное изображение на Изображение для анализа.

Спасибо.

Продолжение: создание отчета кодом

Добавлено: 10 янв 2007, 11:19
BeraleX
Выслал изображение на Ваш саппорт.
Думаю, нужно пояснить, что я имел ввиду:
в качестве параметра конструктору StiImage img = new StiImage(new RectangleD(pos, CurrentHeight, 10, 10));
я передавал размеры объекта класса Image, которые были в пикселах.
Метод Stretch все выравнивал. (т.е. в приведенном примере кода я обнаружил несоответствие с реальным - у меня
StiImage img = new StiImage(new RectangleD(pos, CurrentHeight,tmp.Width, tmp.Height));, где tmp - Image)
У Вас единицы измерения как я понимаю сантиметры? А я передавал туда пикселы, что в данном случае составляет порядка 700*700 сантимсетров вместо пикселов.
Возможно из-за этого не отображались картинки в Excell, html и др.
Сейчас сделал так
StiImage img = new StiImage(new RectangleD(pos, CurrentHeight,page.Width, page.Width)) - картинка у меня все равно квадратная,
но хотелось бы по возможности соблюсти размеры и пропорции если это позволяют размеры страницы или масштабировать изображение, если оно большо страницы по ширине или высоте. Поэтому сейчас ломаю голову, как перевести "мои" пикселы в "ваши сантиметры".

Продолжение: создание отчета кодом

Добавлено: 10 янв 2007, 11:51
Edward
В качестве единиц измерения отчета могут быть выбраны дюймы, сантиметры, сотые дюйма. Этот параметр выбирается на этапе создания отчета.

Соответсвенно pos и CurrentHeight должны быть в единицах измерения отчета в Вашем конструкторе
StiImage img = new StiImage(new RectangleD(pos, CurrentHeight, 10, 10));

Для конвертирования единиц измерения из пикселей в единицы измерения отчета, Вы можете использовать метод

report.Unit.ConvertFromHInches

Приблизительно(!) можно считать, что 1/100 дюйма это 1 пихель.

Спасибо.


Продолжение: создание отчета кодом

Добавлено: 11 янв 2007, 02:38
BeraleX
Хорошо, в соответствии с выше сказанным получаю код для размера изображения в единицах измерения отчета

SizeD tmpSize = new SizeD(report.Unit. ConvertFromHInches(tmp.Width/100),
report.Unit.ConvertFromHInches(tmp.Height/100));

где tmp.Width и tmp.Height - размеры изображения в пикселях.

И получаю совсем неправильный результат - очень мальнькое изображение.
Более менее достоверного результата добился такой строкой кода

SizeD tmpSize = new SizeD(report.Unit. ConvertFromHInches(tmp.Width),
report.Unit.ConvertFromHInches(tmp.Height));

Что не так?

Продолжение: создание отчета кодом

Добавлено: 11 янв 2007, 03:34
Edward
BeraleX писал(а):Более менее достоверного результата добился такой строкой кода

SizeD tmpSize = new SizeD(report.Unit. ConvertFromHInches(tmp.Width),
Все совершенно правильно. Метод ConvertFromHInches конвертирует из сотых дюйма (hundreths of inch), т.е. аргумент tmp.Width и будет в пикселях.

Спасибо.