Удаление колонки в Excel - GPF!!!

Обсуждение Stimulsoft Reports.NET
Леонид
Сообщения: 329
Зарегистрирован: 23 июл 2009, 09:53
Откуда: Moscow

Удаление колонки в 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".
Вложения
Clipboard02.png
Clipboard02.png (99.31 КБ) 4719 просмотров
Clipboard01.png
Clipboard01.png (56.19 КБ) 4719 просмотров
test_report.7z
Архив с примером
(11.24 КБ) 152 скачивания
Aleksey
Сообщения: 2907
Зарегистрирован: 22 апр 2010, 06:57

Re: Удаление колонки в Excel - GPF!!!

Сообщение Aleksey »

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

Странное поведение. Пока что не нашли причины, разбираемся.

Спасибо.
Леонид
Сообщения: 329
Зарегистрирован: 23 июл 2009, 09:53
Откуда: Moscow

Re: Удаление колонки в Excel - GPF!!!

Сообщение Леонид »

Добрый день!

Да, более чем странное. Как оказалось, оно проявляется уже не один год, просто пользователей это уже достало окончательно, и мы провели ряд экспериментов. Что самое странное, так это то, что проблема возникает только при использовании компонентов CrossTab (как я уже писал ранее).

Вы смогли воспроизвести проблему у себя? Возможно, дело ещё в каком-то билде MS Office, но тем не менее, это реально критичный баг для нас, т.к. этими отчётами пользуются сотни людей.
Aleksey
Сообщения: 2907
Зарегистрирован: 22 апр 2010, 06:57

Re: Удаление колонки в Excel - GPF!!!

Сообщение Aleksey »

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

Странная проблема. На вашем Excel файле проблема есть.
Но если экспортировать ваш отчет и затем открыть экпортированный файл, то все работает корректно.

Пожалуйста, попробуйте выполнить экспорт из нашего дизайнера (designer.exe) и дайте знать о результате, будет ли присутствовать данная проблема.

Спасибо.
Леонид
Сообщения: 329
Зарегистрирован: 23 июл 2009, 09:53
Откуда: Moscow

Re: Удаление колонки в Excel - GPF!!!

Сообщение Леонид »

Добрый вечер!

Мы провели дополнительные исследования и выяснили следующее: из дизайнера (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 КБ) 151 скачивание
483 _ Отгрузка по менеджерам (детализация по дням) _ 2016.1.9_from_22_april_2016.xlsx
(6.14 КБ) 159 скачиваний
483 _ Отгрузка по менеджерам (детализация по дням) _ 2012.1.3000_from_3_april_2012.xls
(5.5 КБ) 172 скачивания
Aleksey
Сообщения: 2907
Зарегистрирован: 22 апр 2010, 06:57

Re: Удаление колонки в Excel - GPF!!!

Сообщение Aleksey »

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

Пожалуйста, проверьте еще последний релиз 2016.3 и дайте знать о результатах.

Спасибо.
Леонид
Сообщения: 329
Зарегистрирован: 23 июл 2009, 09:53
Откуда: Moscow

Re: Удаление колонки в Excel - GPF!!!

Сообщение Леонид »

Установили 2016.3.0.0. Проблема не ушла.

Одно ясно, что при экспорте в .xls всё нормально, но людям нужен .xlsx (Excel 2007 и выше).
Ivan
Сообщения: 641
Зарегистрирован: 10 авг 2006, 05:40
Откуда: Stimulsoft Office

Re: Удаление колонки в Excel - GPF!!!

Сообщение Ivan »

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

Причину проблемы нашли.
В событии BeginRender вашего отчета устанавливается ширина страницы 500 сантиметров с комментарием "set some max width before render (it will be corrected OnEndReder)"
Но событие EndRender пустое, и на выходе получается страница шириной 5 метров. ;)
При экспорте в Excel справа от кросстаба получается пустая колонка шириной 4,8 метра.
В самом Excel максимально допустимая ширина колонки 255pt - это около 55см.
При удалении одной из колонок Excel начинает пересчитывать ширину остальных колонок, и валится на этой большой колонке.

Мы сделали необходимую доработку, и теперь колонки большой ширины разбиваются на более узкие колонки с допустимой шириной.
Патч будет включён в следующий предрелизный билд.

Для вашей текущей версии необходимо доработать ваш отчёт, добавив в событие EndRender код, который будет уменьшать ширину страницы.

Спасибо.
Леонид
Сообщения: 329
Зарегистрирован: 23 июл 2009, 09:53
Откуда: Moscow

Re: Удаление колонки в Excel - GPF!!!

Сообщение Леонид »

Доброе утро!
В событии 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);
    }
Леонид
Сообщения: 329
Зарегистрирован: 23 июл 2009, 09:53
Откуда: Moscow

Re: Удаление колонки в Excel - GPF!!!

Сообщение Леонид »

Смотрите, когда убираем код:

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

const int maxWidth = 500;

Page1.Width = maxWidth;
CrossTab2.Width = maxWidth;
То экспортируется всё так же (визуально), но при этом работает.

Когда эти строчки выполняются, то даже после изменения нашей процедурой ширины отрендеренных страниц всё равно получаем тот самый fail в Excel.

Всё-таки здесь что-то не так, ведь мы меняем всё верно, единственная разница, это то, что страница получается не A4, а произвольного размера, т.к. данные таблицы при этом у нас не для печати, но для просмотра и анализа в Excel.

То есть, не всё так просто, и причина вообще не понятна.
Вложения
Clipboard02.png
Clipboard02.png (73.46 КБ) 4657 просмотров
Clipboard01.png
Clipboard01.png (82.5 КБ) 4657 просмотров
Ответить