Страница 1 из 2
Удаление колонки в Excel - GPF!!!
Добавлено: 20 дек 2016, 11:52
Леонид
Добрый день, уважаемые разработчики!
Недавно (как оказалось, такое происходит уже несколько лет) мы узнали о такой проблеме.
После формирования отчёта, менеджеры экспортируют его в Excel (формат .xlsx, что важно), затем открывают его
в Excel 2013 (что так же важно) и пытаются удалить любой из ненужных им столбцов, - происходит ошибка Excel'я и он просто перестаёт работать (см. скриншоты).
Workaround: сохранить файл .xlsx в файл .xls и затем работать в нём, либо снова ещё раз сохранить из .xls в .xlsx и работать, но это абсурд.
Версия отчётной системы: 2016.1.12.0.
Что примечательно, в версии офиса 2007 этот же файл работает корректно, но нас интересует Office 2013, а именно Excel 2013.
Ещё более интересный момент заключается в том, что данная проблема возникает только в отчётах с CrossTab компонентом.
Прилагаем архив со всеми необходимыми файлами для полного воспроизведения ситуации:
1) Отчёт - "Отгрузка по менеджерам (детализация по дням).mrt";
2) Файл для проверки в Excel 2013 - "Отгрузка по менеджерам (детализация по дням).xlsx";
3) Схема данных - "data.xsd";
4) Данные - "data.xml";
5) Словарь данных - "data.dct".
Re: Удаление колонки в Excel - GPF!!!
Добавлено: 23 дек 2016, 13:47
Aleksey
Здравствуйте,
Странное поведение. Пока что не нашли причины, разбираемся.
Спасибо.
Re: Удаление колонки в Excel - GPF!!!
Добавлено: 23 дек 2016, 13:54
Леонид
Добрый день!
Да, более чем странное. Как оказалось, оно проявляется уже не один год, просто пользователей это уже достало окончательно, и мы провели ряд экспериментов. Что самое странное, так это то, что проблема возникает только при использовании компонентов CrossTab (как я уже писал ранее).
Вы смогли воспроизвести проблему у себя? Возможно, дело ещё в каком-то билде MS Office, но тем не менее, это реально критичный баг для нас, т.к. этими отчётами пользуются сотни людей.
Re: Удаление колонки в Excel - GPF!!!
Добавлено: 26 дек 2016, 16:15
Aleksey
Здравствуйте,
Странная проблема. На вашем Excel файле проблема есть.
Но если экспортировать ваш отчет и затем открыть экпортированный файл, то все работает корректно.
Пожалуйста, попробуйте выполнить экспорт из нашего дизайнера (designer.exe) и дайте знать о результате, будет ли присутствовать данная проблема.
Спасибо.
Re: Удаление колонки в Excel - GPF!!!
Добавлено: 26 дек 2016, 17:18
Леонид
Добрый вечер!
Мы провели дополнительные исследования и выяснили следующее: из дизайнера (Designer.exe) или из нашего рабочего проекта экспортировали отчёт с разными данными, - результат одинаковый.
Но вот, что удалось выяснить, проблема именно в версии отчётной системы. В одной из наших виртуальных машин были установлены некоторые предыдущие версии системы.
Результаты такие: версия 2012.1.3000.0, - работает, столбцы можно удалить, версия 2016.1.9.0 и 2016.1.12.0, - не работает, хотя это тот же самый файл, но удаление "рушит" Excel сразу же. Удивительно.
В приложении два одинаковых файла, даже без данных, просто пустой CrossTab, но разных версий. Можете попробовать и у себя.
То есть, получается, что-то изменилось в экспорте в последних версиях, что теперь делает какой-то некорректный экспорт.
P.S. Всё-таки от версии не зависит, т.к. экспортировали в Excel 2007 в 2012-й версии, - результат тот же самый.
Все файлы в приложении.
Re: Удаление колонки в Excel - GPF!!!
Добавлено: 26 дек 2016, 17:39
Aleksey
Здравствуйте,
Пожалуйста, проверьте еще последний релиз 2016.3 и дайте знать о результатах.
Спасибо.
Re: Удаление колонки в Excel - GPF!!!
Добавлено: 26 дек 2016, 17:49
Леонид
Установили 2016.3.0.0. Проблема не ушла.
Одно ясно, что при экспорте в .xls всё нормально, но людям нужен .xlsx (Excel 2007 и выше).
Re: Удаление колонки в Excel - GPF!!!
Добавлено: 26 дек 2016, 17:52
Ivan
Здравствуйте.
Причину проблемы нашли.
В событии BeginRender вашего отчета устанавливается ширина страницы 500 сантиметров с комментарием "set some max width before render (it will be corrected OnEndReder)"
Но событие EndRender пустое, и на выходе получается страница шириной 5 метров.
При экспорте в Excel справа от кросстаба получается пустая колонка шириной 4,8 метра.
В самом Excel максимально допустимая ширина колонки 255pt - это около 55см.
При удалении одной из колонок Excel начинает пересчитывать ширину остальных колонок, и валится на этой большой колонке.
Мы сделали необходимую доработку, и теперь колонки большой ширины разбиваются на более узкие колонки с допустимой шириной.
Патч будет включён в следующий предрелизный билд.
Для вашей текущей версии необходимо доработать ваш отчёт, добавив в событие EndRender код, который будет уменьшать ширину страницы.
Спасибо.
Re: Удаление колонки в Excel - GPF!!!
Добавлено: 27 дек 2016, 10:09
Леонид
Доброе утро!
В событии BeginRender вашего отчета устанавливается ширина страницы 500 сантиметров с комментарием "set some max width before render (it will be corrected OnEndReder)"
Но событие EndRender пустое, и на выходе получается страница шириной 5 метров.
Всё верно, мы оставляем EndRender пустым, т.к. у нас все отчёты вызываются одной процедурой из программы в потоке, и после того, как метод .Render(false) отрабатывает, в событии thread'а OnCompleted() мы вызываем, в частности такую процедуру SetCrossTabReportFixes(), которая меняет ширину страницы, в соответствии с шириной CrossTab'ов.
Полный код (проверяли под отладчиком, ширина выставляется верно). Просто второй пример, где нет данных, возможно и не очень удачный, но где есть данные, там PageWidth выставляется корректно, возможно, что-то всё-таки не так экспортируется?
Полный код процедуры ниже.
Код: Выделить всё
// routine that sets width of the rendered pages (when cross-tab)
// also replaces the caption of given text control (in title)
// and finally, detects whether the print button is enabled or disabled
private void SetCrossTabReportFixes()
{
// quit routine if no data specified for the cross-tab
if (crossTabNames == null || textControls == null || textToAdd == string.Empty)
return;
const double defaultPageWidth = 29.7; // default landscape page width
double finalPageWidth = defaultPageWidth; // set default page width
double crossTabWidth = defaultPageWidth; // default crosstab width
foreach (StiPage page in stiReport.RenderedPages)
{
double pageMargins = page.Margins.Right + page.Margins.Left; // calc margins from both sides (to add 'em to the width)
double workPageWidth = defaultPageWidth - pageMargins; // workspace
foreach (string tab in crossTabNames)
{
// skip controls that ain't exist
if (page.Components.IndexOf(tab) < 0)
continue;
if (page.Components[tab] is StiContainer)
{
StiContainer crossTab = (StiContainer)page.Components[tab];
crossTabWidth = crossTab.Width; // save crosstab rendered width
if (crossTab.Width > workPageWidth)
page.PageWidth = crossTab.Width + pageMargins;
else
{
// if it's lesser
if (crossTab.Width < workPageWidth)
page.PageWidth = defaultPageWidth;
else // if equals
if (crossTab.Width == defaultPageWidth)
page.PageWidth = defaultPageWidth + pageMargins;
}
finalPageWidth = page.PageWidth;
} // if (page
} // end cycle
}
// get flag according to the final page width
bool isPrintVisible = (finalPageWidth <= defaultPageWidth);
// if the report ain't printable and rendered pages has at least one
if (!isPrintVisible && stiReport.RenderedPages.Count > 0)
{
StiPage page = stiReport.RenderedPages[0]; // get first page reference (change the caption at the first page only)
foreach (string ctrl in textControls)
{
if (page.Components.IndexOf(ctrl) >= 0)
if (page.Components[ctrl] is StiText)
{
StiText ctrlText = (StiText)page.Components[ctrl]; // get text control reference
ctrlText.Text += textToAdd; // add text to the caption
ctrlText.Width = crossTabWidth; // set caption width equals to crosstab width
}
} // end cycle
}
// finally show or hide print button according to the final page width
SetShowPrintButton(isPrintVisible);
}
Re: Удаление колонки в Excel - GPF!!!
Добавлено: 27 дек 2016, 12:54
Леонид
Смотрите, когда убираем код:
Код: Выделить всё
const int maxWidth = 500;
Page1.Width = maxWidth;
CrossTab2.Width = maxWidth;
То экспортируется всё так же (визуально), но при этом работает.
Когда эти строчки выполняются, то даже после изменения нашей процедурой ширины отрендеренных страниц всё равно получаем тот самый fail в Excel.
Всё-таки здесь что-то не так, ведь мы меняем всё верно, единственная разница, это то, что страница получается не A4, а произвольного размера, т.к. данные таблицы при этом у нас не для печати, но для просмотра и анализа в Excel.
То есть, не всё так просто, и причина вообще не понятна.