Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 SSRS 2012, экспорт в Excel, и нечитаемые символы  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6149
Ситуация: в отчет, сделанный на SSRS 2012/Report Builder 3.0, выводится varchar-поле. В это поле имеется нечитаемый символ (0x05, в самом отчете это символ отображается квадратиком). Экспорт в xslx проходит нормально, но при попытке открыть файл с данными экспорта, эксель выдает, что в книге обнаружено содержимое, которое не удалось прочитать, и далее

Замененный компонент: часть /xl/worksheets/sheet1.xml с ошибкой XML.  Недопустимый знак xml. Строка 1, столбец 1501959.

Я влез внутрь xslx, и посмотрел на этот /xl/worksheets/sheet1.xml - действительно, 0x05 был вставлен в текстовый узел как есть, без перевода в entity, поэтому экселевский парсер не смог это разобрать. Собственно, вопрос: можно ли с описанным справиться средствами SSRS? Если нет, как оптимальнее из строковых полей выборки отчета (а выборка достаточно большая, больше 100 тыс. строк) удалить все подобные нечитаемые символы (как показал дальнейший разбор, там есть 0x8, 0x11 итд)?
24 июл 13, 09:15    [14608223]     Ответить | Цитировать Сообщить модератору
 Re: SSRS 2012, экспорт в Excel, и нечитаемые символы  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6149
P.S. А при экспорте отчета в XML такие нечитаемые символы, как ни странно, просто удаляются, и экспортированный XML получается вполне валидным.
24 июл 13, 09:17    [14608230]     Ответить | Цитировать Сообщить модератору
 Re: SSRS 2012, экспорт в Excel, и нечитаемые символы  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2397
Сон Веры Павловны,

насколько помню, в SSRS экспортилка внутренняя, и с ней ничего не сделаешь. попробуйте на этапе получения данных для отчета бороться с этим символом. а вобще это отдел поддержи MS писать надо
24 июл 13, 09:22    [14608249]     Ответить | Цитировать Сообщить модератору
 Re: SSRS 2012, экспорт в Excel, и нечитаемые символы  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6149
StarikNavy
Сон Веры Павловны,

насколько помню, в SSRS экспортилка внутренняя, и с ней ничего не сделаешь. попробуйте на этапе получения данных для отчета бороться с этим символом. а вобще это отдел поддержи MS писать надо

Ну, то есть выбрасывать символы в самом запросе, как я примерно и предполагал. Теперь сообразить бы, как это сделать оптимальнее - делать 30-уровневый replace (чтобы отбросить все до 0x20 - табы и переносы строк не нужны) на каждое из 20 полей отчета как-то не очень весело.
24 июл 13, 09:45    [14608345]     Ответить | Цитировать Сообщить модератору
 Re: SSRS 2012, экспорт в Excel, и нечитаемые символы  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6149
В итоге получилось, что быстрее всего всё же вложенные replace. Чтобы не выстраивать елочку из них для каждого поля, сделал табличную schema-bound функцию:
create function dbo.uf_ReplaceNonPrintable(@to_replace varchar(1000))
returns table
with schemabinding
as
return (
  select
    replace(
      replace(
        replace(
............................
                                      replace(@to_replace, char(1), '')
                                    , char(2), '')
                                  , char(3), '')
............................
        , char(29), '')
      , char(30), '')
    , char(31), '') replaced
)

и для проверки прочих вариантов
create function dbo.uf_ReplaceNonPrintableX(@to_replace varchar(1000))
returns varchar(1000)
as
begin
  select @to_replace=replace(@to_replace, char(number), '')
  from master..spt_values where type='P' and number between 1 and 31;
  return @to_replace;
end;

Проверял на таких данных:
if object_id('tempdb..#test') is null
  create table #test (
    f varchar(32)
  );
truncate table #test;
insert into #test
  select CONVERT(varchar,CONVERT(varbinary, newid()))
  from master..spt_values v1
  cross join (
    select number from master..spt_values where type='P' and number between 0 and 999
  ) v2(number)
  where type='P' and v1.number between 0 and 999

(1 млн. записей).
Исправления во всей выборке с помощью первой функции заняли 1 мин. 22 с., с помощью второй - 2 мин. 25 с.
24 июл 13, 10:56    [14608881]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить