Сложный вопрос для php-программиста

Discussion in 'PHP' started by dk-ne, 5 Dec 2008.

  1. dk-ne

    dk-ne Elder - Старейшина

    Joined:
    21 Jan 2007
    Messages:
    73
    Likes Received:
    2
    Reputations:
    0
    Всем привет! Кто может подсказать как придумать форму php по которой можно было бы загрузить файл Excel на сервер и чтобы он автоматически перенес две первых колонки в таблице в базу данных сайта? И более сложный вопрос: как сделать чтобы во втором столбце пробелы заменились на новые колонки? То есть предположим это ФИО. И чтобы фамилия, имя и отчество были отдельно.
     
  2. 159932

    159932 Elder - Старейшина

    Joined:
    28 Sep 2007
    Messages:
    587
    Likes Received:
    462
    Reputations:
    5
    не сталкивался с таким, но тк кк у гугле поискать не судьба, скопипастил пару ссылок
    http://code.google.com/p/php-excel/
    http://www.codeplex.com/PHPExcel
    http://www.ibm.com/developerworks/xml/library/os-phpexcel/index.html
    прост спать иду, посему только ссылки лентяям =\
     
  3. dk-ne

    dk-ne Elder - Старейшина

    Joined:
    21 Jan 2007
    Messages:
    73
    Likes Received:
    2
    Reputations:
    0
    Хорошо, за каждое из решений дам по 5 плюсов, если ответ будет рабочим и максимально подробным.
     
  4. [:|||||:]

    [:|||||:] Banned

    Joined:
    29 May 2008
    Messages:
    68
    Likes Received:
    59
    Reputations:
    11
    Глянь тут:
    http://ishodniki.ru/list/info.php?cat=13&id=6482&show=php-develop
     
  5. DIAgen

    DIAgen Banned Life!

    Joined:
    2 May 2006
    Messages:
    1,055
    Likes Received:
    376
    Reputations:
    460
    Готового решения нет, надо писать все этом самому под эту задацу
     
    #5 DIAgen, 5 Dec 2008
    Last edited: 5 Dec 2008
  6. rtw

    rtw New Member

    Joined:
    22 Nov 2008
    Messages:
    16
    Likes Received:
    4
    Reputations:
    0
    http://group315.clan.su/load/2-1-0-1
    Парсер xls в mySQL выгружает. Подробная инструкция в архиве.
     
  7. diehard

    diehard Elder - Старейшина

    Joined:
    30 Sep 2007
    Messages:
    442
    Likes Received:
    266
    Reputations:
    15
    А ты сохраняй не в XLS, а в CSV, и его сможешь парсить обычными методами.
     
  8. dk-ne

    dk-ne Elder - Старейшина

    Joined:
    21 Jan 2007
    Messages:
    73
    Likes Received:
    2
    Reputations:
    0
    Вопрос

    Этот формат не мною создается, а автоматической системой. И в нем более 1000 строк...
     
  9. dk-ne

    dk-ne Elder - Старейшина

    Joined:
    21 Jan 2007
    Messages:
    73
    Likes Received:
    2
    Reputations:
    0
    Скачал. Еще не тестил. Жаль там комментов нет и код на несколько страниц расписан...
     
  10. dk-ne

    dk-ne Elder - Старейшина

    Joined:
    21 Jan 2007
    Messages:
    73
    Likes Received:
    2
    Reputations:
    0
    Вопрос

    Боюсь попросить...
     
  11. dk-ne

    dk-ne Elder - Старейшина

    Joined:
    21 Jan 2007
    Messages:
    73
    Likes Received:
    2
    Reputations:
    0
    А как такой вариант решения первого вопроса: <?php
    $file = $_POST['file'];
    $csv_lines = file("book1.csv");
    if(is_array($csv_lines))
    {
    //разбор csv
    $cnt = count($csv_lines);
    for($i = 0; $i < $cnt; $i++)
    {
    $line = $csv_lines[$i];
    $line = trim($line);
    //указатель на то, что через цикл проходит первый символ столбца
    $first_char = true;
    //номер столбца
    $col_num = 0;
    $length = strlen($line);
    for($b = 0; $b < $length; $b++)
    {
    //переменная $skip_char определяет обрабатывать ли данный символ
    if($skip_char != true)
    {
    //определяет обрабатывать/не обрабатывать строку
    ///print $line[$b];
    $process = true;
    //определяем маркер окончания столбца по первому символу
    if($first_char == true)
    {
    if($line[$b] == '"')
    {
    $terminator = '";';
    $process = false;
    }
    else
    $terminator = ';';
    $first_char = false;
    }

    //просматриваем парные кавычки, опредляем их природу
    if($line[$b] == '"')
    {
    $next_char = $line[$b + 1];
    //удвоенные кавычки
    if($next_char == '"')
    $skip_char = true;
    //маркер конца столбца
    elseif($next_char == ';')
    {
    if($terminator == '";')
    {
    $first_char = true;
    $process = false;
    $skip_char = true;
    }
    }
    }

    //определяем природу точки с запятой
    if($process == true)
    {
    if($line[$b] == ';')
    {
    if($terminator == ';')
    {

    $first_char = true;
    $process = false;
    }
    }
    }

    if($process == true)
    $column .= $line[$b];

    if($b == ($length - 1))
    {
    $first_char = true;
    }

    if($first_char == true)
    {

    $values[$i][$col_num] = $column;
    $column = '';
    $col_num++;
    }
    }
    else
    $skip_char = false;
    }
    }
    }
    var_dump($values);

    ?>
     
    1 person likes this.
  12. dk-ne

    dk-ne Elder - Старейшина

    Joined:
    21 Jan 2007
    Messages:
    73
    Likes Received:
    2
    Reputations:
    0
    Так никто не возьмется?
     
  13. t4Nk

    t4Nk Elder - Старейшина

    Joined:
    23 Sep 2007
    Messages:
    70
    Likes Received:
    33
    Reputations:
    0
    dk-ne, опиши подробнее.
    из того что ты написал я понял след.:
    исходные данные хранятся в файле xls. В таблице две колонки: первая с какими-то данными, вторая содержит ФИО, разделенные пробелами.
    Нужно:
    1. сделать форму, через которую этот самый файл .xls загружается на сервер
    2. распарсить данные из файла: 1-й столбец добавить в 1-й столбец в базе данных, а 2-й разбить на три столбца (фамилия имя отчество) и также тремя столбцами занести в базу данных.
    т.е. было в файле |Данные|ФИО|, а стало в базе данных так |Данные|Фамилия|Имя|Отчество|
    если так то держи
     
    #13 t4Nk, 19 Jan 2009
    Last edited: 19 Jan 2009
    2 people like this.
  14. dk-ne

    dk-ne Elder - Старейшина

    Joined:
    21 Jan 2007
    Messages:
    73
    Likes Received:
    2
    Reputations:
    0
    Все правильно. Сейчас проверю и отпишусь...
     
  15. mff

    mff Elder - Старейшина

    Joined:
    12 Mar 2008
    Messages:
    2,074
    Likes Received:
    701
    Reputations:
    227
    dk-ne, я делал так, экспортировал из Excel в CSV формат, кидал на хост в папку и парсером выводил на сайте.

    PHP:
        <?php
        
    include("admin/config.php");
            
    $result mysql_query ("SELECT `csv` FROM `doc_cl` WHERE `id`='".$id."'");
            
    $row mysql_fetch_array ($result);
        
        
        
        
        if(
    $row["csv"]!=""){
        echo 
    '<div style="margin:20px 0px 0px 0px;">';
        echo 
    '<table width="100%" border="0" cellspacing="1" cellpadding="2" bgcolor="#000000">';    
        
    $r 0;
            @
    $handle fopen("docs/".$row["csv"], "r");
            if(
    $handle){
                while ((
    $data fgetcsv($handle'1000''#''"')) !== FALSE) {
                    
    $num count($data);
                    
    //print_r ($data);    
                    //echo "<p> $num полей в строке $row: <br /></p>\n";
                    
    $r++;
                    for (
    $c=0;  $c $num$c++) {
                        
    $pieces explode(";"$data[$c]);
                        
    $num_tdcount($pieces)-1;
                        
    //echo $num_td;        
                        
    if($r==1){
                            echo 
    '<tr><td class="td2" height="40" align="center" width="*" style="font-weight:bold;">'.$pieces[0].'</td>';
                            for (
    $i2 0$i2 $num_td$i2++) {        
                                echo
    '<td class="td2" align="center" width="13%" style="font-weight:bold;">'.$pieces[$i2+1].'</td>';
                            }
                            echo
    '</tr>';
                        }    
                        if (
    is_int($r/2) && $r!=1) {
                            echo 
    '<tr><td class="td1" style="padding-left:20px;">'.$pieces[0].'</td>';
                            for (
    $i 0$i $num_td$i++) {
                                echo
    '<td class="td1" align="center">'.$pieces[$i+1].'</td>';
                            }
                            echo
    '</tr>';
                        }
                        if (!
    is_int($r/2) && $r!=1) {
                            echo 
    '<tr><td class="td2" style="padding-left:20px;">'.$pieces[0].'</td>';
                            for (
    $i 0$i $num_td$i++) {
                                echo
    '<td class="td2" align="center">'.$pieces[$i+1].'</td>';
                            }
                            echo
    '</tr>';
                        }
                    } 
    // for
                
    }//while
                //fclose($handle);
                
    echo'</table>';
             }
    //if($handle)
        
        
    echo '</div>';
    }
           
    ?>    
    на поковыряй, вот стили:

    HTML:
    .td1{background-color:#f0ece8;}
    .td2{background-color:#ffffff;}
     
  16. dk-ne

    dk-ne Elder - Старейшина

    Joined:
    21 Jan 2007
    Messages:
    73
    Likes Received:
    2
    Reputations:
    0
    С маленькими таблицами работает хорошо. При большой таблице, как у меня, пишет, что File not exist. Хотя файл загружает.
     
  17. t4Nk

    t4Nk Elder - Старейшина

    Joined:
    23 Sep 2007
    Messages:
    70
    Likes Received:
    33
    Reputations:
    0
    dk-ne, если возможно, выложи пример своей таблицы.
     
  18. dk-ne

    dk-ne Elder - Старейшина

    Joined:
    21 Jan 2007
    Messages:
    73
    Likes Received:
    2
    Reputations:
    0
    http://depositfiles.com/files/ixvgs2rst
    сам понимаешь, что это не оригинал
     
  19. t4Nk

    t4Nk Elder - Старейшина

    Joined:
    23 Sep 2007
    Messages:
    70
    Likes Received:
    33
    Reputations:
    0
    хм, на LightTPD/1.4.20-1; php 5.2.8 fcgi; MySQL 5.0.45 нормально добавились все строки.

    в общем обновил класс, подправил немного сам скрипт, должно работать

    http://depositfiles.com/files/05yo6vjf8