Удаление колонки в Excel - GPF!!!
Удаление колонки в Excel - GPF!!!
Добрый день, уважаемые разработчики!
Недавно (как оказалось, такое происходит уже несколько лет) мы узнали о такой проблеме.
После формирования отчёта, менеджеры экспортируют его в 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".
Недавно (как оказалось, такое происходит уже несколько лет) мы узнали о такой проблеме.
После формирования отчёта, менеджеры экспортируют его в 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".
- Вложения
-
- Clipboard02.png (99.31 КБ) 4712 просмотров
-
- Clipboard01.png (56.19 КБ) 4712 просмотров
-
- test_report.7z
- Архив с примером
- (11.24 КБ) 151 скачивание
Re: Удаление колонки в Excel - GPF!!!
Здравствуйте,
Странное поведение. Пока что не нашли причины, разбираемся.
Спасибо.
Странное поведение. Пока что не нашли причины, разбираемся.
Спасибо.
Re: Удаление колонки в Excel - GPF!!!
Добрый день!
Да, более чем странное. Как оказалось, оно проявляется уже не один год, просто пользователей это уже достало окончательно, и мы провели ряд экспериментов. Что самое странное, так это то, что проблема возникает только при использовании компонентов CrossTab (как я уже писал ранее).
Вы смогли воспроизвести проблему у себя? Возможно, дело ещё в каком-то билде MS Office, но тем не менее, это реально критичный баг для нас, т.к. этими отчётами пользуются сотни людей.
Да, более чем странное. Как оказалось, оно проявляется уже не один год, просто пользователей это уже достало окончательно, и мы провели ряд экспериментов. Что самое странное, так это то, что проблема возникает только при использовании компонентов CrossTab (как я уже писал ранее).
Вы смогли воспроизвести проблему у себя? Возможно, дело ещё в каком-то билде MS Office, но тем не менее, это реально критичный баг для нас, т.к. этими отчётами пользуются сотни людей.
Re: Удаление колонки в Excel - GPF!!!
Здравствуйте,
Странная проблема. На вашем Excel файле проблема есть.
Но если экспортировать ваш отчет и затем открыть экпортированный файл, то все работает корректно.
Пожалуйста, попробуйте выполнить экспорт из нашего дизайнера (designer.exe) и дайте знать о результате, будет ли присутствовать данная проблема.
Спасибо.
Странная проблема. На вашем Excel файле проблема есть.
Но если экспортировать ваш отчет и затем открыть экпортированный файл, то все работает корректно.
Пожалуйста, попробуйте выполнить экспорт из нашего дизайнера (designer.exe) и дайте знать о результате, будет ли присутствовать данная проблема.
Спасибо.
Re: Удаление колонки в Excel - GPF!!!
Добрый вечер!
Мы провели дополнительные исследования и выяснили следующее: из дизайнера (Designer.exe) или из нашего рабочего проекта экспортировали отчёт с разными данными, - результат одинаковый.
Но вот, что удалось выяснить, проблема именно в версии отчётной системы. В одной из наших виртуальных машин были установлены некоторые предыдущие версии системы.
Результаты такие: версия 2012.1.3000.0, - работает, столбцы можно удалить, версия 2016.1.9.0 и 2016.1.12.0, - не работает, хотя это тот же самый файл, но удаление "рушит" Excel сразу же. Удивительно.
В приложении два одинаковых файла, даже без данных, просто пустой CrossTab, но разных версий. Можете попробовать и у себя.
То есть, получается, что-то изменилось в экспорте в последних версиях, что теперь делает какой-то некорректный экспорт.
P.S. Всё-таки от версии не зависит, т.к. экспортировали в Excel 2007 в 2012-й версии, - результат тот же самый.
Все файлы в приложении.
Мы провели дополнительные исследования и выяснили следующее: из дизайнера (Designer.exe) или из нашего рабочего проекта экспортировали отчёт с разными данными, - результат одинаковый.
Но вот, что удалось выяснить, проблема именно в версии отчётной системы. В одной из наших виртуальных машин были установлены некоторые предыдущие версии системы.
Результаты такие: версия 2012.1.3000.0, - работает, столбцы можно удалить, версия 2016.1.9.0 и 2016.1.12.0, - не работает, хотя это тот же самый файл, но удаление "рушит" Excel сразу же. Удивительно.
В приложении два одинаковых файла, даже без данных, просто пустой CrossTab, но разных версий. Можете попробовать и у себя.
То есть, получается, что-то изменилось в экспорте в последних версиях, что теперь делает какой-то некорректный экспорт.
P.S. Всё-таки от версии не зависит, т.к. экспортировали в Excel 2007 в 2012-й версии, - результат тот же самый.
Все файлы в приложении.
- Вложения
-
- 483 _ Отгрузка по менеджерам (детализация по дням) _ 2012.1.3000_from_3_april_2012.xlsx
- (5.91 КБ) 150 скачиваний
-
- 483 _ Отгрузка по менеджерам (детализация по дням) _ 2016.1.9_from_22_april_2016.xlsx
- (6.14 КБ) 158 скачиваний
-
- 483 _ Отгрузка по менеджерам (детализация по дням) _ 2012.1.3000_from_3_april_2012.xls
- (5.5 КБ) 171 скачивание
Re: Удаление колонки в Excel - GPF!!!
Здравствуйте,
Пожалуйста, проверьте еще последний релиз 2016.3 и дайте знать о результатах.
Спасибо.
Пожалуйста, проверьте еще последний релиз 2016.3 и дайте знать о результатах.
Спасибо.
Re: Удаление колонки в Excel - GPF!!!
Установили 2016.3.0.0. Проблема не ушла.
Одно ясно, что при экспорте в .xls всё нормально, но людям нужен .xlsx (Excel 2007 и выше).
Одно ясно, что при экспорте в .xls всё нормально, но людям нужен .xlsx (Excel 2007 и выше).
Re: Удаление колонки в Excel - GPF!!!
Здравствуйте.
Причину проблемы нашли.
В событии BeginRender вашего отчета устанавливается ширина страницы 500 сантиметров с комментарием "set some max width before render (it will be corrected OnEndReder)"
Но событие EndRender пустое, и на выходе получается страница шириной 5 метров.
При экспорте в Excel справа от кросстаба получается пустая колонка шириной 4,8 метра.
В самом Excel максимально допустимая ширина колонки 255pt - это около 55см.
При удалении одной из колонок Excel начинает пересчитывать ширину остальных колонок, и валится на этой большой колонке.
Мы сделали необходимую доработку, и теперь колонки большой ширины разбиваются на более узкие колонки с допустимой шириной.
Патч будет включён в следующий предрелизный билд.
Для вашей текущей версии необходимо доработать ваш отчёт, добавив в событие EndRender код, который будет уменьшать ширину страницы.
Спасибо.
Причину проблемы нашли.
В событии 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!!!
Доброе утро!
Полный код (проверяли под отладчиком, ширина выставляется верно). Просто второй пример, где нет данных, возможно и не очень удачный, но где есть данные, там PageWidth выставляется корректно, возможно, что-то всё-таки не так экспортируется?
Полный код процедуры ниже.
Всё верно, мы оставляем EndRender пустым, т.к. у нас все отчёты вызываются одной процедурой из программы в потоке, и после того, как метод .Render(false) отрабатывает, в событии thread'а OnCompleted() мы вызываем, в частности такую процедуру SetCrossTabReportFixes(), которая меняет ширину страницы, в соответствии с шириной CrossTab'ов.В событии BeginRender вашего отчета устанавливается ширина страницы 500 сантиметров с комментарием "set some max width before render (it will be corrected OnEndReder)"
Но событие EndRender пустое, и на выходе получается страница шириной 5 метров.
Полный код (проверяли под отладчиком, ширина выставляется верно). Просто второй пример, где нет данных, возможно и не очень удачный, но где есть данные, там 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!!!
Смотрите, когда убираем код:
То экспортируется всё так же (визуально), но при этом работает.
Когда эти строчки выполняются, то даже после изменения нашей процедурой ширины отрендеренных страниц всё равно получаем тот самый fail в Excel.
Всё-таки здесь что-то не так, ведь мы меняем всё верно, единственная разница, это то, что страница получается не A4, а произвольного размера, т.к. данные таблицы при этом у нас не для печати, но для просмотра и анализа в Excel.
То есть, не всё так просто, и причина вообще не понятна.
Код: Выделить всё
const int maxWidth = 500;
Page1.Width = maxWidth;
CrossTab2.Width = maxWidth;
Когда эти строчки выполняются, то даже после изменения нашей процедурой ширины отрендеренных страниц всё равно получаем тот самый fail в Excel.
Всё-таки здесь что-то не так, ведь мы меняем всё верно, единственная разница, это то, что страница получается не A4, а произвольного размера, т.к. данные таблицы при этом у нас не для печати, но для просмотра и анализа в Excel.
То есть, не всё так просто, и причина вообще не понятна.
- Вложения
-
- Clipboard02.png (73.46 КБ) 4650 просмотров
-
- Clipboard01.png (82.5 КБ) 4650 просмотров