Advertisement
Trigub_Ilia

Пример реализации класса для работы с PHPExcel

Feb 20th, 2021
956
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 9.97 KB | None | 0 0
  1. <?error_reporting(E_ALL);
  2. ini_set('display_errors', TRUE);
  3. ini_set('display_startup_errors', TRUE);
  4.  
  5. require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
  6. require($_SERVER["DOCUMENT_ROOT"]."/local/lib/PHPExcel/PHPExcel.php");
  7.  
  8. class GenerateReportAboutUsersBP{
  9.    
  10.     private $bp_id, $objPHPExcel;
  11.    
  12.     function __construct($bp_id){
  13.        
  14.         $this->bp_id         = $bp_id;
  15.         $this->objPHPExcel  = new \PHPExcel();
  16.     }
  17.    
  18.     public function generate(){
  19.        
  20.         $sheet      = $this->objPHPExcel->getActiveSheet();
  21.        
  22.         $arResult   = $this->getUsers();
  23.        
  24.         $bpName     = $this->getBpName();
  25.  
  26.         if( count($arResult) > 0 ){
  27.            
  28.             $this->objPHPExcel->getActiveSheet()->mergeCells("A1:H1");
  29.             $this->objPHPExcel->getActiveSheet()->setCellValue("A1", $bpName);
  30.             $this->objPHPExcel->getActiveSheet()->getStyle("A1")->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
  31.            
  32.             $styleArray = array(
  33.                 'font'      => array(
  34.                     'bold'      => false,
  35.                     'size'      => 15,
  36.                 ),
  37.                 'borders'   => array(
  38.                     'allborders' => array(
  39.                         'style' => PHPExcel_Style_Border::BORDER_THIN,
  40.                     )
  41.                 )
  42.             );
  43.            
  44.             if(count($arResult[0])==1){
  45.                 $this->objPHPExcel->getActiveSheet()->mergeCells("A2:H2");
  46.             }
  47.  
  48.             foreach(array_keys($arResult[ key($arResult) ]) as $i=>$title){
  49.                 $this->objPHPExcel
  50.                     ->getActiveSheet()
  51.                     ->setCellValueByColumnAndRow($i, 2, $title)
  52.                     ->getStyle()
  53.                     ->applyFromArray($styleArray);
  54.             }
  55.            
  56.             $this->objPHPExcel
  57.                 ->getActiveSheet()
  58.                 ->getRowDimension('1')
  59.                 ->setRowHeight(40);
  60.            
  61.             foreach (range('A', $this->objPHPExcel->getActiveSheet()->getHighestDataColumn()) as $col) {
  62.  
  63.                 $this->objPHPExcel
  64.                     ->getActiveSheet()
  65.                     ->getStyle($col."1")
  66.                     ->applyFromArray($styleArray);
  67.  
  68.                 $this->objPHPExcel
  69.                     ->getActiveSheet()
  70.                     ->getStyle($col."1")
  71.                     ->getAlignment()
  72.                     ->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);
  73.                
  74.                 $this->objPHPExcel
  75.                     ->getActiveSheet()
  76.                     ->getStyle($col."1")
  77.                     ->getFill()
  78.                     ->setFillType(PHPExcel_Style_Fill::FILL_SOLID)
  79.                     ->getStartColor()
  80.                     ->setRGB('DCE6F4');
  81.                    
  82.                 $this->objPHPExcel
  83.                     ->getActiveSheet()
  84.                     ->getStyle($col."2")
  85.                     ->applyFromArray($styleArray);
  86.  
  87.                 $this->objPHPExcel
  88.                     ->getActiveSheet()
  89.                     ->getStyle($col."2")
  90.                     ->getAlignment()
  91.                     ->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);
  92.                
  93.                 $this->objPHPExcel
  94.                     ->getActiveSheet()
  95.                     ->getStyle($col."2")
  96.                     ->getFill()
  97.                     ->setFillType(PHPExcel_Style_Fill::FILL_SOLID)
  98.                     ->getStartColor()
  99.                     ->setRGB('DCE6F4');
  100.  
  101.                 $this->objPHPExcel
  102.                     ->getActiveSheet()
  103.                     ->getColumnDimension($col)
  104.                     ->setAutoSize(true);
  105.             }
  106.  
  107.             $row = 0;
  108.                
  109.             foreach($arResult as $arUser){
  110.  
  111.                 $col = 0;
  112.                
  113.                 if(count($arUser)==1){
  114.                     $this->objPHPExcel->getActiveSheet()->mergeCells("A3:H3");
  115.                 }
  116.  
  117.                 foreach($arUser as $val){
  118.                    
  119.                     $this->objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow($col, $row + 3, $val);
  120.                    
  121.                     $col++;
  122.                 }
  123.                
  124.                 $row++;
  125.             }
  126.  
  127.             $objWriter = new \PHPExcel_Writer_Excel2007($this->objPHPExcel);
  128.             $objWriter->setPreCalculateFormulas(false);
  129.            
  130.             header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
  131.             header('Content-Disposition: attachment; filename="'.$this->bp_id.'.xlsx"');
  132.             header('Cache-Control: max-age=0');
  133.        
  134.             $objWriter->save("php://output");
  135.  
  136.         }
  137.     }
  138.    
  139.     public function getUsers(){
  140.        
  141.         \CModule::IncludeModule('bizproc');
  142.         \CModule::IncludeModule("iblock");
  143.  
  144.         $getBpID = \COption::GetOptionString("main", "BP_DOC");
  145.  
  146.         $allIDValues = "";
  147.         $allIDValuesList = [];
  148.         $allElementsList = [];
  149.         $allResultList = [];
  150.         $arFilter = array(
  151.             "IBLOCK_ID" => $getBpID,
  152.             "CHECK_PERMISSIONS" => "N",
  153.             "SHOW_NEW" => "Y",
  154.             "ID" => $this->bp_id
  155.         );
  156.         $rsElements = \CIBlockElement::GetList(
  157.             array(), $arFilter, false, false, array("ID","IBLOCK_ID","NAME","DATE_CREATE","CREATED_BY","PROPERTY_SROK","PROPERTY_KOGO")
  158.         );
  159.         while($obElement = $rsElements->GetNextElement()) {
  160.             $data = $obElement->GetFields();
  161.             $allIDValues .= $data["ID"].", ";
  162.             $allElementsList[$data["ID"]] = $data;
  163.         }
  164.  
  165.         $allIDValues = mb_substr($allIDValues, 0, -2);
  166.  
  167.         $connection = \Bitrix\Main\Application::getConnection();
  168.         $sqlHelper = $connection->getSqlHelper();
  169.         $workflow_id = "";
  170.  
  171.         $sql = "SELECT * FROM b_bp_workflow_state WHERE DOCUMENT_ID_INT IN($allIDValues)";//AND STATE = 'InProgress'
  172.         $recordset = $connection->query($sql);
  173.         while ($record = $recordset->fetch())
  174.         {
  175.             $workflow_id .= "'".$record["ID"]."', ";
  176.             $allIDValuesList[$record["ID"]] = $record["DOCUMENT_ID_INT"];
  177.         }
  178.  
  179.         $workflow_id = mb_substr($workflow_id, 0, -2);
  180.  
  181.         $sql = "SELECT * FROM b_bp_tracking WHERE WORKFLOW_ID IN($workflow_id)";
  182.         $recordset = $connection->query($sql);
  183.         while ($record = $recordset->fetch())
  184.         {
  185.             if (strpos($record["ACTION_NOTE"], 'Ознакомление с документом пользователями из списка') !== false) {
  186.                 $newTitle = substr($record["ACTION_NOTE"], strpos($record["ACTION_NOTE"], '{=user'));
  187.                 $pieces = explode(", ", $newTitle);
  188.                 $arUsers = array();
  189.                 foreach ($pieces as $piecesKey => $piecesVal){
  190.                     if (strpos($piecesVal, 'group_dr') !== false) {
  191.                         $str = preg_replace("/[^0-9]/", '', $piecesVal);
  192.                         unset($pieces[$piecesKey]);
  193.                         $arUsersDep = CBPHelper::extractUsersFromExtendedGroup("group_dr".$str);
  194.                         $arUsers = array_merge($arUsers,$arUsersDep);
  195.                     }
  196.                     else{
  197.                         $str = preg_replace("/[^0-9]/", '', $piecesVal);
  198.                         $pieces[$piecesKey] = $str;
  199.                     }
  200.                 }
  201.                 $pieces = array_merge($pieces,$arUsers);
  202.                 $pieces = array_unique($pieces);
  203.                 $allResultList["ALL_USER"] = $pieces;
  204.             }
  205.  
  206.             if(strpos($record["ACTION_NOTE"], 'ознакомился с документом') !== false){
  207.                 $pattern = '/\{(.+?)\}/';
  208.                 preg_match_all($pattern, substr($record["ACTION_NOTE"],3), $matches);
  209.  
  210.                 $str = preg_replace("/[^0-9]/", '', $matches[0]);
  211.  
  212.                 $comment = explode("документом:", $record["ACTION_NOTE"]);
  213.                
  214.                 $dateEdit = $record["MODIFIED"]->toString();
  215.                
  216.                 $allResultList["USER_VOTED"][$str[0]] = array("COMMENT"=>$comment[1],"DATE"=>$dateEdit);
  217.             }
  218.         }
  219.  
  220.         $arAllSection = array();
  221.         $arFilter = Array('IBLOCK_ID'=>5, 'GLOBAL_ACTIVE'=>'Y');
  222.         $db_list = \CIBlockSection::GetList(Array($by=>$order), $arFilter, true);
  223.         echo $db_list->NavPrint($arIBTYPE["SECTION_NAME"]);
  224.         while($ar_result = $db_list->GetNext())
  225.         {
  226.             $arAllSection[$ar_result['ID']] = $ar_result['NAME'];
  227.         }
  228.  
  229.         $arAllUser = array();
  230.         $user_filter = array("ID"=>implode("|", $allResultList["ALL_USER"]));
  231.         $rsUsers = \CUser::GetList($by="ID", $order="desc", $user_filter, array("SELECT"=>array("UF_1C_PRFB0C9F4DC8C6","UF_DEPARTMENT","UF_1C_PRF508AFB5863A"), "FIELDS"=>array("ID","NAME","LAST_NAME"))); // выбираем пользователей
  232.         while($rs = $rsUsers->GetNext()) {
  233.             $rs["UF_DEPARTMENT"] = $arAllSection[$rs["UF_DEPARTMENT"][0]];
  234.             $arAllUser[$rs["ID"]] = $rs;
  235.         }
  236.  
  237.         $arAllResult = array();
  238.         if(!empty($allResultList["ALL_USER"])){
  239.             foreach ($allResultList["ALL_USER"] as $resultKey => $resultVal){
  240.                 $arAllResult[$resultVal] = array(
  241.                     "№ п\п" => $resultKey+1,
  242.                     "Фамилия Имя" => $arAllUser[$resultVal]["LAST_NAME"]." ".$arAllUser[$resultVal]["NAME"],
  243.                     "Табельный номер" => $arAllUser[$resultVal]["UF_1C_PRFB0C9F4DC8C6"],
  244.                     "Статус ознакомления" => (!empty($allResultList["USER_VOTED"][$resultVal]))?"Ознакомлен":"Не ознакомлен",
  245.                     "Дата" => $allResultList["USER_VOTED"][$resultVal]["DATE"],
  246.                     "Комментарии" => $allResultList["USER_VOTED"][$resultVal]["COMMENT"],
  247.                     "Бюджет" => $arAllUser[$resultVal]["UF_1C_PRF508AFB5863A"],
  248.                     "Подразделение" => $arAllUser[$resultVal]["UF_DEPARTMENT"],
  249.                 );
  250.             }
  251.         }
  252.         else{
  253.             $arAllResult[] = array(
  254.                 "Ошибка"=>"Документ в статусе 'Ожидание дополнительной информации'"
  255.             );
  256.         }
  257.        
  258.        return $arAllResult;
  259.     }
  260.    
  261.     public function getBpName(){
  262.         \CModule::IncludeModule("iblock");
  263.  
  264.         $getBpID = \COption::GetOptionString("main", "BP_DOC");
  265.        
  266.         $bpName = "";
  267.         $arFilter = array(
  268.             "IBLOCK_ID" => $getBpID,
  269.             "CHECK_PERMISSIONS" => "N",
  270.             "SHOW_NEW" => "Y",
  271.             "ID" => $this->bp_id
  272.         );
  273.         $rsElements = \CIBlockElement::GetList(
  274.             array(), $arFilter, false, false, array("ID","IBLOCK_ID","NAME")
  275.         );
  276.         while($obElement = $rsElements->GetNextElement()) {
  277.             $data = $obElement->GetFields();
  278.             $bpName = $data["NAME"];
  279.         }
  280.         return $bpName;
  281.     }
  282. }
  283.  
  284. $report = new GenerateReportAboutUsersBP($_REQUEST["bp_id"]);
  285.  
  286. $report->generate();
  287. ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement