Экспорт в Word и Excel файлы с формы CRM
В стандартной поставке CRM позволяет выгружать одну или несколько записей в Excel. При этом каждая запись будет представлена отдельной строкой. Еще можно выгружать документы в Word и Excel через отчеты. В общем одно либо не подходит по форматированию и не позволяет выгружать одну запись в Excel с ее формы, либо слишком долго и требует разработки отчетов.
Посему сделаем более простой вариант, который позволит формировать на выходе Word и/или Excel файлы в один клик. При этом мы сами вольны задать форматирование выходного документа, а также то, какую информацию хотим в него поместить.
Приступим:
- Решение будет состоять из двух кнопок. Поэтому создайте в CRM два PNG Веб-ресурса из иконок excel и word (с именами excel_32.png и word_32.png, соответственно);
- Создайте JS Веб-ресурс с таким кодом:
function excel() { // Открываем Excel и создаем лист var ExcelApp = new ActiveXObject("Excel.Application"); if (ExcelApp == null) return; var ExcelSheet = new ActiveXObject("Excel.Sheet"); // Делаем Excel видимым ExcelSheet.Application.Visible = true; // Помещаем текст в ячейки ExcelSheet.ActiveSheet.Cells(1, 1).Value = "Номер счета"; ExcelSheet.ActiveSheet.Cells(1, 2).Value = Xrm.Page.getAttribute("invoicenumber").getValue(); ExcelSheet.ActiveSheet.Cells(2, 1).Value = "Клиент"; ExcelSheet.ActiveSheet.Cells(2, 2).Value = Xrm.Page.getAttribute("customerid").getValue()[0].name; ExcelSheet.ActiveSheet.Cells(3, 1).Value = "Общая сумма"; ExcelSheet.ActiveSheet.Cells(3, 2).Value = Xrm.Page.getAttribute("totalamount").getValue(); ExcelSheet.ActiveSheet.Cells(4, 1).Value = "Валюта"; ExcelSheet.ActiveSheet.Cells(4, 2).Value = Xrm.Page.getAttribute("transactioncurrencyid").getValue()[0].name; ExcelApp.AlertBeforeOverwriting = false; ExcelApp.DisplayAlerts = false; } function word() { // Открываем Word и создаем документ var wordApp = new ActiveXObject("Word.Application"); var doc = wordApp.Documents.Add(); wordApp.Visible = true; var sel = wordApp.Selection; // Помещаем текст в документ sel.Font.Bold = "1"; sel.TypeText("Номер счета: "); sel.Font.Bold = "0"; sel.TypeText(Xrm.Page.getAttribute("invoicenumber").getValue()); sel.TypeParagraph(); sel.Font.Bold = "1"; sel.TypeText("Клиент: "); sel.Font.Bold = "0"; sel.TypeText(Xrm.Page.getAttribute("customerid").getValue()[0].name); sel.TypeParagraph(); sel.Font.Bold = "1"; sel.TypeText("Общая сумма: "); sel.Font.Bold = "0"; sel.TypeText(Xrm.Page.getAttribute("totalamount").getValue().toString()); sel.TypeParagraph(); sel.Font.Bold = "1"; sel.TypeText("Валюта: "); sel.Font.Bold = "0"; sel.TypeText(Xrm.Page.getAttribute("transactioncurrencyid").getValue()[0].name); }
Этот код состоит из двух функций. Одна создайт документ Word, другая лист Excel. Обе функции использует объект ActiveXObject, чтобы создать экземпляр Word’а и Excel’я. Ну а далее происходит заполнение одного из документов полями с текущей карточки (в данном примере с карточки Счета). При этом Вы не ограничены только текущей записью, Вы можете с помощью JS-кода подтянуть данные с любых записей CRM.
Примечание: чтобы скрипт корректно работал, убедитесь, что для той зоны безопасности IE, в которой расположен Вас сайт CRM, включена опция «Initialize and script ActiveX controls not marked as safe for scripting». - Затем создайте для нужного объекта кнопки, которые будут запускать скрипт (в данном примере кнопки располагаются на форме Счета):
<RibbonDiffXml> <CustomActions> <CustomAction Id="excel.CustomAction" Location="Mscrm.Form.invoice.MainTab.Actions.Controls._children" Sequence="1" > <CommandUIDefinition> <Button Id="excel.Button" LabelText="Экспорт в excel" ToolTipTitle="Экспорт в excel" ToolTipDescription="Экспорт в excel" TemplateAlias="o1" Sequence="1" Image32by32="$webresource:new_excel_32.png" Command="excel.CommandDefinition" /> </CommandUIDefinition> </CustomAction> <CustomAction Id="word.CustomAction" Location="Mscrm.Form.invoice.MainTab.Actions.Controls._children" Sequence="2" > <CommandUIDefinition> <Button Id="word.Button" LabelText="Экспорт в word" ToolTipTitle="Экспорт в word" ToolTipDescription="Экспорт в word" TemplateAlias="o1" Sequence="2" Image32by32="$webresource:new_word_32.png" Command="word.CommandDefinition" /> </CommandUIDefinition> </CustomAction> </CustomActions> <Templates> <RibbonTemplates Id="Mscrm.Templates"></RibbonTemplates> </Templates> <CommandDefinitions> <CommandDefinition Id="excel.CommandDefinition"> <EnableRules> <EnableRule Id="Mscrm.Enabled" /> </EnableRules> <DisplayRules/> <Actions> <JavaScriptFunction Library="$webresource:new_office_export.js" FunctionName="excel" /> </Actions> </CommandDefinition> <CommandDefinition Id="word.CommandDefinition"> <EnableRules> <EnableRule Id="Mscrm.Enabled" /> </EnableRules> <DisplayRules/> <Actions> <JavaScriptFunction Library="$webresource:new_office_export.js" FunctionName="word" /> </Actions> </CommandDefinition> </CommandDefinitions> <RuleDefinitions> <TabDisplayRules/> <DisplayRules/> <EnableRules/> </RuleDefinitions> <LocLabels /> </RibbonDiffXml>
Публикуем и идем тестировать…
ActiveXObject в IE не есть гуд. Как-то можно провернуть тот же трюк с использованием плагинов? Я пытался сделать с помощью плагинов, повесив на изменение поля, при этом у меня файл создаваля, но форма дизаблилась.
C помощью плагинов никак. Они выполняются на сервере.
Ну у меня же получалось вернуть файл в респонсе. Но вот только непонятно почему дизаблилась форма.
Не понял? куда Вы вернули файл?
Добрый день, большое спасибо за полезный сайт!подскажите это можно реализовать в CRM 4.0? Не понятно как сделать вот это:Создайте JS Веб-ресурс с таким кодом. Когда добавляю как скрипт OnLoad на форму не работает. В SDK не нашла, по какому ключевому слову можно поискать? Спасибо!
Добрый день, спасибо за полезный сайт!
Вопрос как Создавать JS Веб-ресурс в CRM 4.0? в SDK не нашла.
Добавляла функцию на форму OnLoad, не получилось почему-то…
Добрый день
В CRM 4.0 небыло веб-ресурсов. И JS-код достаточно сильно отличается.