Отчет с большим количеством изображений
Отчет с большим количеством изображений
Добрый день.
Столкнулся с двумя проблемами. Суть такова.
Должен формироваться репорт содержащий чуть более 60 000 картинок в пиковом случае.
Но это не всегда. Картинок может быть и сто и несколько тысяч.
Картинки небольшие по размеру. Сжаты в формат jpg. Каждая картинка примерно 1.5кб.
Источником данных для репорта является единственная таблица из dataset. Картинки в таблице содержатся в виде байтового массива (поле ImageAsBytes)
Когда картинок мало, все работает отлично.
Когда количество картинок велико начинаются проблемы.
Первая проблема.
В момент формирования репорта наблюдаю ч\з диспетчер задач как пожирается оперативная память. Если количество картинок в репорте превышает определенный предел, то вся память компьютера оказывается использованой(больше 3-х гигабайт) и вываливается ошибка out of memory. Т.е. сформировать репорт на 60тыс. картинок не удается.
Вторая проблема возникает при экспорте в excel
Если количество картинок составляет, например 1500, то репорт отображается нормально, все картинки видны. Затем делаю экспорт в excel. В экселевском файле вижу, что картинок только 1024. Получается, что последние 476 картинок не экспортируются. Число 1024 явно не случайно. Неужели у вас стоит какое-то ограничение?
Использую StumulReport ver.2008.1.141.0
Надеюсь на вашу помощь.
Столкнулся с двумя проблемами. Суть такова.
Должен формироваться репорт содержащий чуть более 60 000 картинок в пиковом случае.
Но это не всегда. Картинок может быть и сто и несколько тысяч.
Картинки небольшие по размеру. Сжаты в формат jpg. Каждая картинка примерно 1.5кб.
Источником данных для репорта является единственная таблица из dataset. Картинки в таблице содержатся в виде байтового массива (поле ImageAsBytes)
Когда картинок мало, все работает отлично.
Когда количество картинок велико начинаются проблемы.
Первая проблема.
В момент формирования репорта наблюдаю ч\з диспетчер задач как пожирается оперативная память. Если количество картинок в репорте превышает определенный предел, то вся память компьютера оказывается использованой(больше 3-х гигабайт) и вываливается ошибка out of memory. Т.е. сформировать репорт на 60тыс. картинок не удается.
Вторая проблема возникает при экспорте в excel
Если количество картинок составляет, например 1500, то репорт отображается нормально, все картинки видны. Затем делаю экспорт в excel. В экселевском файле вижу, что картинок только 1024. Получается, что последние 476 картинок не экспортируются. Число 1024 явно не случайно. Неужели у вас стоит какое-то ограничение?
Использую StumulReport ver.2008.1.141.0
Надеюсь на вашу помощь.
Отчет с большим количеством изображений
Здравствуйте.
Если вам нужно экспортировать больше изображений - используйте экспорт в Excel-2007 (xlsx), этот формат не имеет ограничений на количество изображений.
Спасибо.
При загрузке изображений средствами .Net изображения всегда хранятся в памяти в распакованном виде. Поэтому ваши изображения из 1.5 кб всегда распаковываются минимум килобайт в 20-50, а то и больше.Edvard писал(а):Столкнулся с двумя проблемами. Суть такова.
Должен формироваться репорт содержащий чуть более 60 000 картинок в пиковом случае.
Но это не всегда. Картинок может быть и сто и несколько тысяч.
Картинки небольшие по размеру. Сжаты в формат jpg. Каждая картинка примерно 1.5кб.
Источником данных для репорта является единственная таблица из dataset. Картинки в таблице содержатся в виде байтового массива (поле ImageAsBytes)
Установите свойство ReportCacheMode в On ли Auto. При этом отрендеренные страницы будут сохраняться в кэше на диске, и общее количество используемой памяти будет небольшим (по умолчанию в памяти хранятся последние 50 отрендеренных страниц, количество можно поменять в StiOptions).Edvard писал(а):Первая проблема.
В момент формирования репорта наблюдаю ч\з диспетчер задач как пожирается оперативная память. Если количество картинок в репорте превышает определенный предел, то вся память компьютера оказывается использованой(больше 3-х гигабайт) и вываливается ошибка out of memory. Т.е. сформировать репорт на 60тыс. картинок не удается.
Экспорт в Excel (xls) сделан на основе спецификации BIFF8 (Excel-97), в этой версии Excel максимально возможное количество изображений - 1024.Edvard писал(а):Вторая проблема возникает при экспорте в excel
Если количество картинок составляет, например 1500, то репорт отображается нормально, все картинки видны. Затем делаю экспорт в excel. В экселевском файле вижу, что картинок только 1024. Получается, что последние 476 картинок не экспортируются. Число 1024 явно не случайно. Неужели у вас стоит какое-то ограничение?
Если вам нужно экспортировать больше изображений - используйте экспорт в Excel-2007 (xlsx), этот формат не имеет ограничений на количество изображений.
Спасибо.
Отчет с большим количеством изображений
Добрый день.
Спасибо, кэширование помогло.
Возникло еще несколько мелких вопросов.
1. Следует ли каким-то образом использовать явную очистку дискового кэша, учитывая, что он может составлять гигабайты? Я попытался после закрытия окна репорта использовать код:
Но метод Dispose дает ошибку с описанием "Папка не пуста". Причем ошибка возникает не всегда, закономерности пока уловить не удалось.
Если же не использовать Dispose, то та же ошибка("Папка не пуста.") возникает на строке.
Опять же, воспроизводится не всегда.
Общий код, который работает, получился такой.
Но как-то тут нехорошо. Слишком много перехватов ошибок. Подскажите пожалуйста, как правильно?
Спасибо, кэширование помогло.
Возникло еще несколько мелких вопросов.
1. Следует ли каким-то образом использовать явную очистку дискового кэша, учитывая, что он может составлять гигабайты? Я попытался после закрытия окна репорта использовать код:
Код: Выделить всё
If Not mRpt.CompiledReport Is Nothing Then mRpt.CompiledReport.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
Отчет с большим количеством изображений
Здравствуйте,
Возможно какие то настройки системы...
Можно почистить всю папку кэшированных отчетов при закрытии приложения или после закрытия окна отображения отчета (если оно модальное). Кэш находится здесь:
Спасибо.
Странная ошибка. Используется такой код для удаления папки в кэше:1. Следует ли каким-то образом использовать явную очистку дискового кэша, учитывая, что он может составлять гигабайты? Я попытался после закрытия окна репорта использовать код:Но метод Dispose дает ошибку с описанием "Папка не пуста". Причем ошибка возникает не всегда, закономерности пока уловить не удалось.Код: Выделить всё
If Not mRpt.CompiledReport Is Nothing Then mRpt.CompiledReport.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% гарантии, что отчет скомпилируется без ошибок (к примеру ошибок в выражениях в отчете). В этом случае будут сгенерированы исключения.Но как-то тут нехорошо. Слишком много перехватов ошибок. Подскажите пожалуйста, как правильно?
Спасибо.
Отчет с большим количеством изображений
Добрый день.
Обнаружилась серьезная проблема.
Оказывается кэшированый репорт при экспорте в excel, экспортирует не все записи, а только часть из них. Т.е. в репорте вижу таблицу из 1249 строк, а в результирующем *.xls или *.xlsx файле получается от 200 до 800 строк. Причем это количество непостоянно. Зависит от настроек кэширования и от того сколько раз делался экспорт.
Проверял, что если отключить кэширование (mRpt.ReportCacheMode = StiReportCacheMode.Off), то все нормально экспортируется.
Экспорт очень важен для этого приложения.
Как же это побороть?
Обнаружилась серьезная проблема.
Оказывается кэшированый репорт при экспорте в excel, экспортирует не все записи, а только часть из них. Т.е. в репорте вижу таблицу из 1249 строк, а в результирующем *.xls или *.xlsx файле получается от 200 до 800 строк. Причем это количество непостоянно. Зависит от настроек кэширования и от того сколько раз делался экспорт.
Проверял, что если отключить кэширование (mRpt.ReportCacheMode = StiReportCacheMode.Off), то все нормально экспортируется.
Экспорт очень важен для этого приложения.
Как же это побороть?
Отчет с большим количеством изображений
Здравствуйте.
Проверьте работу вашего отчета на последнем билде нашего продукта.
После версии 2008.1 мы сделали очень много улучшений.
Спасибо.
Проверьте работу вашего отчета на последнем билде нашего продукта.
После версии 2008.1 мы сделали очень много улучшений.
Спасибо.
Отчет с большим количеством изображений
Добрый день.
Я скачал свежий выпуск 2010.1.7 trial.
Действительно, частично описаная мной проблема решена. Т.е. при экспорте кэшированого репорта из окна предварительного просмотра сохраняются все записи. Но по-прежнему невозможно экспортировать все записи без предварительного просмотра.
Т.е. метод ExportDocument у меня выдает порядка 200 строк из 1200 загруженых в репорт.
Вызываю так:
Может быть можно програмно из окна предварительного просмотра вызвать экспорт, а само окно сделать невидимым?
Что тут можно сделать?
Я скачал свежий выпуск 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)
Что тут можно сделать?
Отчет с большим количеством изображений
Здравствуйте.
Вышлите пожалуйста простое тестовое приложение, на котором мы сможем воспроизвести указанную вами проблему.
Спасибо.
Не получается воспроизвести проблему.Edvard писал(а):... при экспорте кэшированого репорта из окна предварительного просмотра сохраняются все записи. Но по-прежнему невозможно экспортировать все записи без предварительного просмотра. Т.е. метод ExportDocument у меня выдает порядка 200 строк из 1200 загруженых в репорт.
Вышлите пожалуйста простое тестовое приложение, на котором мы сможем воспроизвести указанную вами проблему.
Спасибо.
Отчет с большим количеством изображений
Дорый день.
К текущему сообщению приложено простое тестовое приложение из одной формы и одного репорта. Там есть возможность создания исходного dataset c двумя возможными количествами записей. А именно 1200 и 60 000. При экспорте 1200 записей в результирующем excel файле имеем менее двухсот. Файл 040810.xlsx прилагается, лежит в каталоге \Debug\bin\.
Сделать экспорт для 60 000 записей не удается вообще. Процесс экспорта начинается, но потом вываливается ошибка нехватки памяти. В обоих случаях включен режим кэширования.
Если нужны еще какие-то сведения для воспроизведения проблем - сообщите.
К этому сообщению почему-то не удается добавить attach в виде rar-архива. Поэтому приложение выслал на support@stimulsoft.com.
К текущему сообщению приложено простое тестовое приложение из одной формы и одного репорта. Там есть возможность создания исходного dataset c двумя возможными количествами записей. А именно 1200 и 60 000. При экспорте 1200 записей в результирующем excel файле имеем менее двухсот. Файл 040810.xlsx прилагается, лежит в каталоге \Debug\bin\.
Сделать экспорт для 60 000 записей не удается вообще. Процесс экспорта начинается, но потом вываливается ошибка нехватки памяти. В обоих случаях включен режим кэширования.
Если нужны еще какие-то сведения для воспроизведения проблем - сообщите.
К этому сообщению почему-то не удается добавить attach в виде rar-архива. Поэтому приложение выслал на support@stimulsoft.com.
Отчет с большим количеством изображений
К передыдущему сообщению не удается добавить attach. Поэтому приложение выслал на support@stimulsoft.com.