Замена данных в richText
Замена данных в richText
Добрый день.
Возникла ситуация, что в отчет надо вставлять текст договора, который хранится в базе преобразованный в varbinary из формата rtf. С самой вставкой проблем не возникло (RichText из DataColumn), все отлично вставилось.
Но возник вопрос, можно ли вставить в этот текст переменные, что бы они заполнились данными при построении отчета? В документации я нашла, что при вставке обычного rtf можно так сделать, но у меня при чтении из базы значение в {} не заменяется и остается обычным текстом.
Устанавливать свойство "Full Convert Expression" в true пробовала, не помогло.
В чем может быть проблема? И можно ли ее как-нибудь решить?
Возникла ситуация, что в отчет надо вставлять текст договора, который хранится в базе преобразованный в varbinary из формата rtf. С самой вставкой проблем не возникло (RichText из DataColumn), все отлично вставилось.
Но возник вопрос, можно ли вставить в этот текст переменные, что бы они заполнились данными при построении отчета? В документации я нашла, что при вставке обычного rtf можно так сделать, но у меня при чтении из базы значение в {} не заменяется и остается обычным текстом.
Устанавливать свойство "Full Convert Expression" в true пробовала, не помогло.
В чем может быть проблема? И можно ли ее как-нибудь решить?
Re: Замена данных в richText
Здравствуйте,
Можете выслать простой пример для анализа?
Спасибо.
Можете выслать простой пример для анализа?
Спасибо.
Re: Замена данных в richText
Добрый день.
Прикрепляю простой пример, в котором вывожу richtext из DataColumn и файл rtf, который был добавлен в базу через функцию, закомментированную во вкладке code (функция вызывалась из другой программы, но на всякий случай прикладываю ее текст).
Как я понимаю, по идее, {StartDT} и {EndDT} из rtf файла должны преобразоваться в значения соответствующих переменных, но этого не происходит.
Прикрепляю простой пример, в котором вывожу richtext из DataColumn и файл rtf, который был добавлен в базу через функцию, закомментированную во вкладке code (функция вызывалась из другой программы, но на всякий случай прикладываю ее текст).
Как я понимаю, по идее, {StartDT} и {EndDT} из rtf файла должны преобразоваться в значения соответствующих переменных, но этого не происходит.
- Вложения
-
- ReportTestRichText.mrt
- Пример отчета
- (91.17 КБ) 402 скачивания
-
- DemoText.rtf
- Пример текстового файла
- (41.62 КБ) 351 скачивание
Re: Замена данных в richText
Здравствуйте.
Чтобы выражения внутри текста вычислялись, при компиляции отчёта выражения "выделяются" из текста, а потом уже при построении отчёта выражения высчитываются и текст "склеивается" опять.
Поэтому текст из базы данных не обрабатывается, а передаётся как есть.
Но есть вариант решения задачи с использованием парсера выражений, если выражения не содержат сложных конструкций языка C#.
В событии GetValue компонента RichText можно написать следующий код:
Но тут есть "подводные камни" со стороны формата RTF и его редакторов.
При редактировании RTF с помощью Word, WordPad или даже нашего встроенного редактора, в текст вставляются разнообразные управляющие команды, например переключение кодировки текста.
Поэтому если вам надо вставить в RichText какое-нибудь выражение, лучше сначала набрать его в простом текстовом редакторе, например Notepad++, а затем вставить его целиком в редакторе RichText.
При этом, если выражение будет содержать только английский текст - всё пройдет хорошо.
Но если в нём будут например русские буквы - редактор вставить свои управляющие коды прямо в выражение, и с большой вероятностью отчёт перестанет компилироваться вообще.
Например, если вы хотите вставить выражение {Replace(" район", "")}, то после редактора оно превращается в {Replace("\f0\lang1049 \'f0\'e0\'e9\'ee\'ed\f1\lang1033 ", "")}.
С точки зрения RichText отображается то же самое. Но команда замены уже работать естественно не будет, хотя отчёт ещё компилируется.
А если вы хотите вставить выражение {name_файла}, то после редактора оно превращается в {name_\'f4\'e0\'e9\'eb\'e0}, и перестаёт компилироваться.
В вашем случае вторая переменная вставилась правильно: "\{EndDT\}"
А вот первая видимо набиралась прямо в редакторе, и получилось "\{}{\rtlch\fcs1 \af1\afs24 \ltrch\fcs0 \f1\fs24\cf1\lang1049\langfe1049\langfenp1049\insrsid6960984 StartDT}{\rtlch\fcs1 \af1\afs24 \ltrch\fcs0 \f1\fs24\cf1\lang1049\langfe1049\langfenp1049\insrsid10504751\charrsid10504751 \}
Спасибо.
Чтобы выражения внутри текста вычислялись, при компиляции отчёта выражения "выделяются" из текста, а потом уже при построении отчёта выражения высчитываются и текст "склеивается" опять.
Поэтому текст из базы данных не обрабатывается, а передаётся как есть.
Но есть вариант решения задачи с использованием парсера выражений, если выражения не содержат сложных конструкций языка C#.
В событии GetValue компонента RichText можно написать следующий код:
Код: Выделить всё
string st = System.Text.Encoding.ASCII.GetString( DataSource1.FileContent );
string st2 = Stimulsoft.Report.Engine.StiParser.ParseTextValue(StiRichText.PackRtf(st), sender as StiComponent) as string;
e.Value = System.Xml.XmlConvert.EncodeName(st2);
При редактировании RTF с помощью Word, WordPad или даже нашего встроенного редактора, в текст вставляются разнообразные управляющие команды, например переключение кодировки текста.
Поэтому если вам надо вставить в RichText какое-нибудь выражение, лучше сначала набрать его в простом текстовом редакторе, например Notepad++, а затем вставить его целиком в редакторе RichText.
При этом, если выражение будет содержать только английский текст - всё пройдет хорошо.
Но если в нём будут например русские буквы - редактор вставить свои управляющие коды прямо в выражение, и с большой вероятностью отчёт перестанет компилироваться вообще.
Например, если вы хотите вставить выражение {Replace(" район", "")}, то после редактора оно превращается в {Replace("\f0\lang1049 \'f0\'e0\'e9\'ee\'ed\f1\lang1033 ", "")}.
С точки зрения RichText отображается то же самое. Но команда замены уже работать естественно не будет, хотя отчёт ещё компилируется.
А если вы хотите вставить выражение {name_файла}, то после редактора оно превращается в {name_\'f4\'e0\'e9\'eb\'e0}, и перестаёт компилироваться.
В вашем случае вторая переменная вставилась правильно: "\{EndDT\}"
А вот первая видимо набиралась прямо в редакторе, и получилось "\{}{\rtlch\fcs1 \af1\afs24 \ltrch\fcs0 \f1\fs24\cf1\lang1049\langfe1049\langfenp1049\insrsid6960984 StartDT}{\rtlch\fcs1 \af1\afs24 \ltrch\fcs0 \f1\fs24\cf1\lang1049\langfe1049\langfenp1049\insrsid10504751\charrsid10504751 \}
Спасибо.
Re: Замена данных в richText
Добрый день.
Спасибо за подробный ответ. В целом, если записать необходимый текст сначала в файл notepad, а потом перенести в Word и добавить форматирование, все сработало корректно.
На всякий случай добавлю, что бы заработал код, записанный в событие GetValue надо убрать заполнение RichText из колонки данных (для меня это оказалось не очевидно и я не сразу поняла, почему ничего не поменялось).
Так же, при вставке выражения подобного "{name_файла}" у меня в целом отчет строился, но поле RichText было пустым и было сообщение об ошибке в Report Rendering Message с указанием выражения, которое не смог распарсить. Поэтому подскажите пожалуйста еще, можно ли как-то при построении отчета получить значение сообщений из Report Rendering Message и вывести их?
Спасибо за подробный ответ. В целом, если записать необходимый текст сначала в файл notepad, а потом перенести в Word и добавить форматирование, все сработало корректно.
На всякий случай добавлю, что бы заработал код, записанный в событие GetValue надо убрать заполнение RichText из колонки данных (для меня это оказалось не очевидно и я не сразу поняла, почему ничего не поменялось).
Так же, при вставке выражения подобного "{name_файла}" у меня в целом отчет строился, но поле RichText было пустым и было сообщение об ошибке в Report Rendering Message с указанием выражения, которое не смог распарсить. Поэтому подскажите пожалуйста еще, можно ли как-то при построении отчета получить значение сообщений из Report Rendering Message и вывести их?
Re: Замена данных в richText
Здравствуйте.
Эти сообщения записываются в свойство отчёта report.ReportRenderingMessages.
Если отчёт скомпилирован - то надо брать из report.CompiledReport.ReportRenderingMessages
Спасибо.
Эти сообщения записываются в свойство отчёта report.ReportRenderingMessages.
Если отчёт скомпилирован - то надо брать из report.CompiledReport.ReportRenderingMessages
Спасибо.
Re: Замена данных в richText
Спасибо за ответ.
Подскажите пожалуйста еще, я попробовала файл, который добавляла в базу (и который после преобразования в GetValue корректно заменял все переменные на значения), добавить в ресурсы отчета и вывести его содержимое в компонент RichText. Но при этом значения переменных не заменились. "Full Convert Expression" установлен в True. Что надо поменять, что бы переменные заработали?
Подскажите пожалуйста еще, я попробовала файл, который добавляла в базу (и который после преобразования в GetValue корректно заменял все переменные на значения), добавить в ресурсы отчета и вывести его содержимое в компонент RichText. Но при этом значения переменных не заменились. "Full Convert Expression" установлен в True. Что надо поменять, что бы переменные заработали?
Re: Замена данных в richText
Здравствуйте,
Вышлите пожалуйста ваш пример для анализа.
Спасибо.
Вышлите пожалуйста ваш пример для анализа.
Спасибо.
Re: Замена данных в richText
Добрый день.
Прикладываю пример с загрузкой richText из ресурса. Этот же файл при загрузке в базу и последующей выгрузке в richText в виде колонки и добавлении события GetValue отрабатывался корректно.
Прикладываю пример с загрузкой richText из ресурса. Этот же файл при загрузке в базу и последующей выгрузке в richText в виде колонки и добавлении события GetValue отрабатывался корректно.
- Вложения
-
- ReportTestRichText.mrt
- (87.62 КБ) 404 скачивания
Re: Замена данных в richText
Здравствуйте.
Как уже ранее говорилось, чтобы выражения внутри текста вычислялись, они преобразуются при компиляции отчёта.
Текст из базы данных и из файла не обрабатывается, а передаётся как есть.
Поэтому надо использовать скрипты, в данном случае для загрузки текста из ресурсов.
В событии GetValue компонента RichText надо написать следующий код:
Спасибо.
Как уже ранее говорилось, чтобы выражения внутри текста вычислялись, они преобразуются при компиляции отчёта.
Текст из базы данных и из файла не обрабатывается, а передаётся как есть.
Поэтому надо использовать скрипты, в данном случае для загрузки текста из ресурсов.
В событии GetValue компонента RichText надо написать следующий код:
Код: Выделить всё
string st = Stimulsoft.Report.Helpers.StiHyperlinkProcessor.GetString(this, "resource://DemoText");
string st2 = Stimulsoft.Report.Engine.StiParser.ParseTextValue(StiRichText.PackRtf(st), sender as StiComponent) as string;
e.Value = System.Xml.XmlConvert.EncodeName(st2);