Кастомизация
11
Мар
7

Экспорт в 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>
    

Публикуем и идем тестировать…



Комментарии (7)
  • webmaster 11.03.2012

    ActiveXObject в IE не есть гуд. Как-то можно провернуть тот же трюк с использованием плагинов? Я пытался сделать с помощью плагинов, повесив на изменение поля, при этом у меня файл создаваля, но форма дизаблилась.

  • slivka_83 11.03.2012

    C помощью плагинов никак. Они выполняются на сервере.

  • webmaster 11.03.2012

    Ну у меня же получалось вернуть файл в респонсе. Но вот только непонятно почему дизаблилась форма.

  • slivka_83 11.03.2012

    Не понял? куда Вы вернули файл?

  • CRM_tuning 11.03.2012

    Добрый день, большое спасибо за полезный сайт!подскажите это можно реализовать в CRM 4.0? Не понятно как сделать вот это:Создайте JS Веб-ресурс с таким кодом. Когда добавляю как скрипт OnLoad на форму не работает. В SDK не нашла, по какому ключевому слову можно поискать? Спасибо!

  • CRM_tuning 11.03.2012

    Добрый день, спасибо за полезный сайт!
    Вопрос как Создавать JS Веб-ресурс в CRM 4.0? в SDK не нашла.
    Добавляла функцию на форму OnLoad, не получилось почему-то…

  • slivka_83 11.03.2012

    Добрый день

    В CRM 4.0 небыло веб-ресурсов. И JS-код достаточно сильно отличается.

*

code