Отчет с большим количеством изображений

Обсуждение Stimulsoft Reports.NET
Edvard
Сообщения: 40
Зарегистрирован: 02 дек 2008, 21:34
Откуда: Minsk

Отчет с большим количеством изображений

Сообщение Edvard »

Добрый день.

Столкнулся с двумя проблемами. Суть такова.
Должен формироваться репорт содержащий чуть более 60 000 картинок в пиковом случае.
Но это не всегда. Картинок может быть и сто и несколько тысяч.
Картинки небольшие по размеру. Сжаты в формат jpg. Каждая картинка примерно 1.5кб.
Источником данных для репорта является единственная таблица из dataset. Картинки в таблице содержатся в виде байтового массива (поле ImageAsBytes)
Когда картинок мало, все работает отлично.

Когда количество картинок велико начинаются проблемы.

Первая проблема.

В момент формирования репорта наблюдаю ч\з диспетчер задач как пожирается оперативная память. Если количество картинок в репорте превышает определенный предел, то вся память компьютера оказывается использованой(больше 3-х гигабайт) и вываливается ошибка out of memory. Т.е. сформировать репорт на 60тыс. картинок не удается.


Вторая проблема возникает при экспорте в excel

Если количество картинок составляет, например 1500, то репорт отображается нормально, все картинки видны. Затем делаю экспорт в excel. В экселевском файле вижу, что картинок только 1024. Получается, что последние 476 картинок не экспортируются. Число 1024 явно не случайно. Неужели у вас стоит какое-то ограничение?

Использую StumulReport ver.2008.1.141.0

Надеюсь на вашу помощь.


Ivan
Сообщения: 641
Зарегистрирован: 10 авг 2006, 05:40
Откуда: Stimulsoft Office

Отчет с большим количеством изображений

Сообщение Ivan »

Здравствуйте.
Edvard писал(а):Столкнулся с двумя проблемами. Суть такова.
Должен формироваться репорт содержащий чуть более 60 000 картинок в пиковом случае.
Но это не всегда. Картинок может быть и сто и несколько тысяч.
Картинки небольшие по размеру. Сжаты в формат jpg. Каждая картинка примерно 1.5кб.
Источником данных для репорта является единственная таблица из dataset. Картинки в таблице содержатся в виде байтового массива (поле ImageAsBytes)
При загрузке изображений средствами .Net изображения всегда хранятся в памяти в распакованном виде. Поэтому ваши изображения из 1.5 кб всегда распаковываются минимум килобайт в 20-50, а то и больше.
Edvard писал(а):Первая проблема.
В момент формирования репорта наблюдаю ч\з диспетчер задач как пожирается оперативная память. Если количество картинок в репорте превышает определенный предел, то вся память компьютера оказывается использованой(больше 3-х гигабайт) и вываливается ошибка out of memory. Т.е. сформировать репорт на 60тыс. картинок не удается.
Установите свойство ReportCacheMode в On ли Auto. При этом отрендеренные страницы будут сохраняться в кэше на диске, и общее количество используемой памяти будет небольшим (по умолчанию в памяти хранятся последние 50 отрендеренных страниц, количество можно поменять в StiOptions).
Edvard писал(а):Вторая проблема возникает при экспорте в excel
Если количество картинок составляет, например 1500, то репорт отображается нормально, все картинки видны. Затем делаю экспорт в excel. В экселевском файле вижу, что картинок только 1024. Получается, что последние 476 картинок не экспортируются. Число 1024 явно не случайно. Неужели у вас стоит какое-то ограничение?
Экспорт в Excel (xls) сделан на основе спецификации BIFF8 (Excel-97), в этой версии Excel максимально возможное количество изображений - 1024.
Если вам нужно экспортировать больше изображений - используйте экспорт в Excel-2007 (xlsx), этот формат не имеет ограничений на количество изображений.

Спасибо.
Edvard
Сообщения: 40
Зарегистрирован: 02 дек 2008, 21:34
Откуда: Minsk

Отчет с большим количеством изображений

Сообщение Edvard »

Добрый день.

Спасибо, кэширование помогло.

Возникло еще несколько мелких вопросов.

1. Следует ли каким-то образом использовать явную очистку дискового кэша, учитывая, что он может составлять гигабайты? Я попытался после закрытия окна репорта использовать код:

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

 If Not mRpt.CompiledReport Is Nothing Then mRpt.CompiledReport.Dispose()
Но метод Dispose дает ошибку с описанием "Папка не пуста". Причем ошибка возникает не всегда, закономерности пока уловить не удалось.

Если же не использовать Dispose, то та же ошибка("Папка не пуста.") возникает на строке.

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

mRpt.Render(True)
Опять же, воспроизводится не всегда.

Общий код, который работает, получился такой.

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

 Public Sub ShowReports(ByRef aDs As dataset)
Try

            mRpt = New StiReport
            mRpt.Load(My.Application.Info.DirectoryPath & "\Reports\rptSales.mrt")

            mRpt.Dictionary.ImportXMLSchema(aDs)
            mRpt.RegData(aDs)
           

            mRpt.ReportCacheMode = StiReportCacheMode.On

             'Число страниц, которое постоянно находится в оперативной памяти, определяется параметром
            StiOptions.Engine.ReportCache.AmountOfQuickAccessPages = 5

            mRpt.Compile()          
            mRpt.Render(True)

            mRpt.Show(My.Forms.frmMain, True) 'показать репорт модально

            Try
                'стереть временные файлы
                If Not mRpt.CompiledReport Is Nothing Then mRpt.CompiledReport.Dispose()
            Catch ex As Exception

            End Try
            
        Catch ex As Exception
            MessageBox.Show(ex.Message & Environment.NewLine & "Report will be closed.", "Report Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)

        Finally           
            mRpt = Nothing
        End Try
    End Sub
Но как-то тут нехорошо. Слишком много перехватов ошибок. Подскажите пожалуйста, как правильно?
Jan
Сообщения: 495
Зарегистрирован: 19 фев 2009, 11:14

Отчет с большим количеством изображений

Сообщение Jan »

Здравствуйте,
1. Следует ли каким-то образом использовать явную очистку дискового кэша, учитывая, что он может составлять гигабайты? Я попытался после закрытия окна репорта использовать код:

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

 If Not mRpt.CompiledReport Is Nothing Then mRpt.CompiledReport.Dispose()
Но метод Dispose дает ошибку с описанием "Папка не пуста". Причем ошибка возникает не всегда, закономерности пока уловить не удалось.

Если же не использовать Dispose, то та же ошибка("Папка не пуста.") возникает на строке.
Странная ошибка. Используется такой код для удаления папки в кэше:

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

Directory.Delete(path, true);
Возможно какие то настройки системы...

Можно почистить всю папку кэшированных отчетов при закрытии приложения или после закрытия окна отображения отчета (если оно модальное). Кэш находится здесь:

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

string temp = (StiOptions.Engine.ReportCache.CachePath == null || StiOptions.Engine.ReportCache.CachePath.Length == 0) ?
				Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) : 
				StiOptions.Engine.ReportCache.CachePath;

temp = Path.Combine(temp, "StimulsoftReportsCache");
Но как-то тут нехорошо. Слишком много перехватов ошибок. Подскажите пожалуйста, как правильно?
Один try-catch не помешает. Нет 100% гарантии, что отчет скомпилируется без ошибок (к примеру ошибок в выражениях в отчете). В этом случае будут сгенерированы исключения.

Спасибо.
Edvard
Сообщения: 40
Зарегистрирован: 02 дек 2008, 21:34
Откуда: Minsk

Отчет с большим количеством изображений

Сообщение Edvard »

Добрый день.

Обнаружилась серьезная проблема.

Оказывается кэшированый репорт при экспорте в excel, экспортирует не все записи, а только часть из них. Т.е. в репорте вижу таблицу из 1249 строк, а в результирующем *.xls или *.xlsx файле получается от 200 до 800 строк. Причем это количество непостоянно. Зависит от настроек кэширования и от того сколько раз делался экспорт.
Проверял, что если отключить кэширование (mRpt.ReportCacheMode = StiReportCacheMode.Off), то все нормально экспортируется.

Экспорт очень важен для этого приложения.
Как же это побороть?
Ivan
Сообщения: 641
Зарегистрирован: 10 авг 2006, 05:40
Откуда: Stimulsoft Office

Отчет с большим количеством изображений

Сообщение Ivan »

Здравствуйте.

Проверьте работу вашего отчета на последнем билде нашего продукта.
После версии 2008.1 мы сделали очень много улучшений.

Спасибо.
Edvard
Сообщения: 40
Зарегистрирован: 02 дек 2008, 21:34
Откуда: Minsk

Отчет с большим количеством изображений

Сообщение Edvard »

Добрый день.

Я скачал свежий выпуск 2010.1.7 trial.
Действительно, частично описаная мной проблема решена. Т.е. при экспорте кэшированого репорта из окна предварительного просмотра сохраняются все записи. Но по-прежнему невозможно экспортировать все записи без предварительного просмотра.
Т.е. метод ExportDocument у меня выдает порядка 200 строк из 1200 загруженых в репорт.
Вызываю так:

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

 mRpt.ReportCacheMode = StiReportCacheMode.On
 StiOptions.Engine.ReportCache.AmountOfQuickAccessPages = My.Settings.ReportPageCountInRAM

Dim ExcelExportSettinngs As StiExcel2007ExportSettings = New StiExcel2007ExportSettings
ExcelExportSettinngs.ExportDataOnly = True
ExcelExportSettinngs.ExportObjectFormatting = False
ExcelExportSettinngs.ImageQuality = 1
ExcelExportSettinngs.ImageResolution = My.Settings.DpiPicture
mRpt.ExportDocument(StiExportFormat.Excel2007, ExportFileName, ExcelExportSettinngs)
Может быть можно програмно из окна предварительного просмотра вызвать экспорт, а само окно сделать невидимым?
Что тут можно сделать?
Ivan
Сообщения: 641
Зарегистрирован: 10 авг 2006, 05:40
Откуда: Stimulsoft Office

Отчет с большим количеством изображений

Сообщение Ivan »

Здравствуйте.
Edvard писал(а):... при экспорте кэшированого репорта из окна предварительного просмотра сохраняются все записи. Но по-прежнему невозможно экспортировать все записи без предварительного просмотра. Т.е. метод ExportDocument у меня выдает порядка 200 строк из 1200 загруженых в репорт.
Не получается воспроизвести проблему.
Вышлите пожалуйста простое тестовое приложение, на котором мы сможем воспроизвести указанную вами проблему.

Спасибо.
Edvard
Сообщения: 40
Зарегистрирован: 02 дек 2008, 21:34
Откуда: Minsk

Отчет с большим количеством изображений

Сообщение Edvard »

Дорый день.

К текущему сообщению приложено простое тестовое приложение из одной формы и одного репорта. Там есть возможность создания исходного dataset c двумя возможными количествами записей. А именно 1200 и 60 000. При экспорте 1200 записей в результирующем excel файле имеем менее двухсот. Файл 040810.xlsx прилагается, лежит в каталоге \Debug\bin\.

Сделать экспорт для 60 000 записей не удается вообще. Процесс экспорта начинается, но потом вываливается ошибка нехватки памяти. В обоих случаях включен режим кэширования.
Если нужны еще какие-то сведения для воспроизведения проблем - сообщите.

К этому сообщению почему-то не удается добавить attach в виде rar-архива. Поэтому приложение выслал на support@stimulsoft.com.
Edvard
Сообщения: 40
Зарегистрирован: 02 дек 2008, 21:34
Откуда: Minsk

Отчет с большим количеством изображений

Сообщение Edvard »

К передыдущему сообщению не удается добавить attach. Поэтому приложение выслал на support@stimulsoft.com.
Ответить