За последние 24 часа нас посетил 15181 программист и 1388 роботов. Сейчас ищут 834 программиста ...

Парсинг данных из XLS на страницу PHP

Тема в разделе "PHP для новичков", создана пользователем wcb-falcon, 10 фев 2011.

  1. wcb-falcon

    wcb-falcon Активный пользователь

    С нами с:
    24 мар 2010
    Сообщения:
    30
    Симпатии:
    0
    Прошерстил множество тем но так и не нашел нормального описания как создать парсер данных из файла формата xls на обычноу php страницу.

    Просьба помочь в данном вопросе (или указать где это рассмотрено, или дать ссылки на исходники)
    Хочется загружать файл на хост а чтобы он сам уже отображался на странице (вся таблица из файла)

    Заранее благодарен
     
  2. Jampire

    Jampire Активный пользователь

    С нами с:
    22 авг 2009
    Сообщения:
    181
    Симпатии:
    0
    Адрес:
    Гомель
    Хоспади, уже дважды за один день.
    phpexcel.codeplex.com
     
  3. BMWSauber

    BMWSauber Активный пользователь

    С нами с:
    21 ноя 2009
    Сообщения:
    151
    Симпатии:
    0
    PHP:
    1.  
    2. <?
    3. function startElement($parser, $name, $attrs)
    4. {
    5.      
    6.     echo "Element: $name<br>";      // имя элемента
    7.        
    8.     foreach ($attrs as $attr => $value) {
    9.         // выводим имя атрибута и его значение
    10.         echo 'Attribute: '.$attr.' = '.$value.'<br>';
    11.     }
    12. }
    13.  
    14. function endElement($parser, $name)
    15. {
    16. }
    17.  
    18.  
    19.  
    20.  
    21. $xml_parser = xml_parser_create();
    22. xml_set_element_handler($xml_parser, "startElement", "endElement");
    23. xml_set_character_data_handler($xml_parser, "stringElement");
    24. xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, 0);
    25.  
    26.  
    27.  
    28. if (!($fp = fopen($file, "r")))
    29. {
    30.     die("Can't open XML input");
    31. }
    32.  
    33. while ($data = fgets($fp))
    34. {
    35.     if (!xml_parse($xml_parser, $data, feof($fp)))
    36.     {
    37.        
    38.        
    39.         echo "<br>XML Error: ";
    40.         echo xml_error_string(xml_get_error_code($xml_parser));
    41.         echo " at line ".xml_get_current_line_number($xml_parser);
    42.         break;
    43.     }
    44. }
    45.  
    46. function stringElement($parser, $str)
    47. {
    48.  
    49.     if (strlen(trim($str)) > 0)
    50.     {
    51.    
    52.         echo 'String: '.$str.'<br>'; // выводим строку
    53.     }
    54. }
    55.  
    56.    
    57. xml_parser_free($xml_parser);
    58. ?>
    59.  
     
  4. wcb-falcon

    wcb-falcon Активный пользователь

    С нами с:
    24 мар 2010
    Сообщения:
    30
    Симпатии:
    0
    Вы привели пример парсинга XML а мне нужно из XLS

    спасибо за ресурс хотя на нем очень уж много ненужного мне и найти среди него нужное оказалось сложно
    нашел решение вот здесь
    http://cleverscript.ru/index.php/php/scripts-php/28-phpexel
    все доступно и понятно расписано
     
  5. BMWSauber

    BMWSauber Активный пользователь

    С нами с:
    21 ноя 2009
    Сообщения:
    151
    Симпатии:
    0
    Упс...
     
  6. wcb-falcon

    wcb-falcon Активный пользователь

    С нами с:
    24 мар 2010
    Сообщения:
    30
    Симпатии:
    0
    Нашел хорошее решение но столкнулся с одной маленькой проблемой.
    к примеру
    1) если таблица в Экселе с простыми ячейками то - проблем нет.
    2) если в таблице есть объединение строк - то тоже проблем нет.
    3) но вот если в таблице есть объединение колонок - то начинается косяк (объеденяет не колонки а последнюю ячейку с предыдущей выше строкой) :(

    Помогите подкоректировать чтобы и колонки нормально объединял (при необходимости)


    вот пример кода:
    PHP:
    1. <?
    2. include_once 'Classes/PHPExcel/IOFactory.php';
    3.  
    4. $objPHPExcel = PHPExcel_IOFactory::load('xls/xls.xls');
    5. $aSheet = $objPHPExcel->getActiveSheet();
    6.  
    7. $objPHPExcel->setActiveSheetIndex(0);
    8. $objWorksheet = $objPHPExcel->getActiveSheet();
    9.  
    10.  
    11. $i=0; $j=0; $td_ar=array();
    12. foreach ($objWorksheet->getRowIterator() as $row) {
    13.   $cellIterator = $row->getCellIterator();
    14.   $cellIterator->setIterateOnlyExistingCells(false);
    15.   $j=0;
    16.  
    17.   foreach ($cellIterator as $cell) {
    18.     $td_content=$cell->getValue();    
    19.         $td_ar[$i][$j] = iconv('utf-8', 'cp1251', $td_content);
    20.     $j++;
    21.   }
    22.   $i++;
    23. }
    24.  
    25. $td_clear=array();
    26. $content=array();
    27. $i=0;
    28.  
    29. $td_row=array();
    30.  
    31. foreach ($td_ar as $tr=>$td_content) {
    32.     for ($j=0; $j<count($td_content); $j++) {
    33.          $content[$i][$j]=$td_content[$j];
    34.     }  
    35.     $i++;
    36. }
    37.  
    38. krsort($content);
    39.  
    40. $arr=array(); $all_ar=array();
    41.  
    42. foreach ($content as $tr=>$td_content) {
    43.     for  ($i=0; $i<count($td_content); $i++) {
    44.        
    45.         if (!isset($arr[$i])) $arr[$i]=1;
    46.        
    47.         if (isset($td_content[$i]) && strlen($td_content[$i])==0) $arr[$i]++;        
    48.         else $arr[$i]=1;
    49.        
    50.         $all_ar[$tr][$i]['content']=$td_content[$i];
    51.         $all_ar[$tr][$i]['row']=$arr[$i];
    52.     }
    53. }
    54. ksort($all_ar);
    55.  
    56. $start_str = 0;
    57. $start_coll = 0;
    58.  
    59. $content_write = "<table border=1 cellspacing=0 cellpadding=3 class=table_price>";
    60. for  ($i=$start_str; $i<count($all_ar); $i++) {
    61.    
    62.     $content_write .= "<tr"
    63.                                         . ($i==$start_str?" class=title_tr":"")
    64.                                         . ">";
    65.    
    66.     $tr_border=true;
    67.    
    68.     for  ($j=$start_coll; $j<count($all_ar[$i]); $j++) {
    69.         if ((isset($all_ar[$i+1][$j]['row'])?$all_ar[$i+1][$j]['row']:1)!=1){
    70.                     $tr_border=false;
    71.                 }
    72.         if ($j==$start_coll){
    73.                     $first_td=(isset($all_ar[$i+1][$j]['row'])?$all_ar[$i+1][$j]['row']:1);
    74.                 }
    75.        
    76.         if (strlen($all_ar[$i][$j]['content'])!=0){          
    77.             $content_write .= "<td rowspan='" . (isset($all_ar[$i+1][$j]['row'])?$all_ar[$i+1][$j]['row']:1) . "' "
    78.                                                         . (($i!=0 && $j==0)?" class=title_td":"")
    79.                                                         . (($tr_border==true || $first_td==(isset($all_ar[$i+1][$j]['row'])?$all_ar[$i+1][$j]['row']:1))?" style='' ":"")
    80.                                                         . (((isset($all_ar[$i+1][$j]['row'])?$all_ar[$i+1][$j]['row']:1)>1)?" id='row'":"")
    81.                                                         . ">"
    82.                                                         . (($i!=0 && $j==0)?"<div>".$all_ar[$i][$j]['content']."</div>":$all_ar[$i][$j]['content'])
    83.                                                         . "</td>";
    84.         }          
    85.        
    86.     }
    87.     $content_write .= "</tr>";    
    88. }
    89. $content_write .= "</table>";  
    90.        
    91. print($content_write);
    92. ?>
     
  7. Jampire

    Jampire Активный пользователь

    С нами с:
    22 авг 2009
    Сообщения:
    181
    Симпатии:
    0
    Адрес:
    Гомель
    А при чем тут phpexcel? Вы ведь выводите информацию в виде html на страницу. Вот и смотрите, где накосячили с html-тегами.

    ЗЫ0.
    PHP:
    1. $objPHPExcel = PHPExcel_IOFactory::load('xls/xls.xls');
    2. $aSheet = $objPHPExcel->getActiveSheet();
    3.  
    4. $objPHPExcel->setActiveSheetIndex(0);
    5. $objWorksheet = $objPHPExcel->getActiveSheet();
    Зачем дважды запрашивать активный лист?
    PHP:
    1. $objPHPExcel = PHPExcel_IOFactory::load('xls/xls.xls');  
    2. $objPHPExcel->setActiveSheetIndex(0);
    3. $objWorksheet = $objPHPExcel->getActiveSheet();
    ЗЫ1. Зря не прошли на официальный сайт. Там даже прекрасный мануал есть...
     
  8. wcb-falcon

    wcb-falcon Активный пользователь

    С нами с:
    24 мар 2010
    Сообщения:
    30
    Симпатии:
    0
    На офф сайте хоть и есть документы но они все на английском (не очень удобно для понимания)
    Если есть доки на русском то кинте ссылку почитаю

    Я понимаю что вывод таблицы это уже не парсинг, но думал мне помогут определить в каком случае и где можно сделать запись о конфигурации ячейки (соеденена она с соседней строкой или колонкой)