Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   PHP, PERL, MySQL, JavaScript (https://forum.antichat.xyz/forumdisplay.php?f=37)
-   -   Сложный вопрос для php-программиста (https://forum.antichat.xyz/showthread.php?t=94878)

dk-ne 05.12.2008 06:17

Сложный вопрос для php-программиста
 
Всем привет! Кто может подсказать как придумать форму php по которой можно было бы загрузить файл Excel на сервер и чтобы он автоматически перенес две первых колонки в таблице в базу данных сайта? И более сложный вопрос: как сделать чтобы во втором столбце пробелы заменились на новые колонки? То есть предположим это ФИО. И чтобы фамилия, имя и отчество были отдельно.

159932 05.12.2008 06:36

не сталкивался с таким, но тк кк у гугле поискать не судьба, скопипастил пару ссылок
http://code.google.com/p/php-excel/
http://www.codeplex.com/PHPExcel
http://www.ibm.com/developerworks/xml/library/os-phpexcel/index.html
прост спать иду, посему только ссылки лентяям =\

dk-ne 05.12.2008 11:56

Хорошо, за каждое из решений дам по 5 плюсов, если ответ будет рабочим и максимально подробным.

[:|||||:] 05.12.2008 12:03

Глянь тут:
http://ishodniki.ru/list/info.php?cat=13&id=6482&show=php-develop

DIAgen 05.12.2008 12:07

Готового решения нет, надо писать все этом самому под эту задацу

rtw 05.12.2008 14:47

http://group315.clan.su/load/2-1-0-1
Парсер xls в mySQL выгружает. Подробная инструкция в архиве.

diehard 05.12.2008 15:09

А ты сохраняй не в XLS, а в CSV, и его сможешь парсить обычными методами.

dk-ne 05.12.2008 15:46

Вопрос
 
Цитата:

Сообщение от diehard
А ты сохраняй не в XLS, а в CSV, и его сможешь парсить обычными методами.

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

dk-ne 05.12.2008 15:58

Цитата:

Сообщение от rtw
http://group315.clan.su/load/2-1-0-1
Парсер xls в mySQL выгружает. Подробная инструкция в архиве.

Скачал. Еще не тестил. Жаль там комментов нет и код на несколько страниц расписан...

dk-ne 05.12.2008 16:07

Вопрос
 
Цитата:

Сообщение от DIAgen
Готового решения нет, надо писать все этом самому под эту задацу

Боюсь попросить...

dk-ne 05.12.2008 18:05

А как такой вариант решения первого вопроса: <?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);

?>

dk-ne 19.01.2009 00:32

Так никто не возьмется?

t4Nk 19.01.2009 03:16

dk-ne, опиши подробнее.
из того что ты написал я понял след.:
исходные данные хранятся в файле xls. В таблице две колонки: первая с какими-то данными, вторая содержит ФИО, разделенные пробелами.
Нужно:
1. сделать форму, через которую этот самый файл .xls загружается на сервер
2. распарсить данные из файла: 1-й столбец добавить в 1-й столбец в базе данных, а 2-й разбить на три столбца (фамилия имя отчество) и также тремя столбцами занести в базу данных.
т.е. было в файле |Данные|ФИО|, а стало в базе данных так |Данные|Фамилия|Имя|Отчеств о|
если так то держи

dk-ne 20.01.2009 19:57

Цитата:

Сообщение от t4Nk
dk-ne, опиши подробнее.
из того что ты написал я понял след.:
исходные данные хранятся в файле xls. В таблице две колонки: первая с какими-то данными, вторая содержит ФИО, разделенные пробелами.
Нужно:
1. сделать форму, через которую этот самый файл .xls загружается на сервер
2. распарсить данные из файла: 1-й столбец добавить в 1-й столбец в базе данных, а 2-й разбить на три столбца (фамилия имя отчество) и также тремя столбцами занести в базу данных.
т.е. было в файле |Данные|ФИО|, а стало в базе данных так |Данные|Фамилия|Имя|Отчеств о|
если так то держи

Все правильно. Сейчас проверю и отпишусь...

mff 20.01.2009 20:19

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;}


dk-ne 31.01.2009 05:56

Цитата:

Сообщение от t4Nk
dk-ne, опиши подробнее.
из того что ты написал я понял след.:
исходные данные хранятся в файле xls. В таблице две колонки: первая с какими-то данными, вторая содержит ФИО, разделенные пробелами.
Нужно:
1. сделать форму, через которую этот самый файл .xls загружается на сервер
2. распарсить данные из файла: 1-й столбец добавить в 1-й столбец в базе данных, а 2-й разбить на три столбца (фамилия имя отчество) и также тремя столбцами занести в базу данных.
т.е. было в файле |Данные|ФИО|, а стало в базе данных так |Данные|Фамилия|Имя|Отчеств о|
если так то держи

С маленькими таблицами работает хорошо. При большой таблице, как у меня, пишет, что File not exist. Хотя файл загружает.

t4Nk 31.01.2009 19:18

dk-ne, если возможно, выложи пример своей таблицы.

dk-ne 01.02.2009 02:13

Цитата:

Сообщение от t4Nk
dk-ne, если возможно, выложи пример своей таблицы.

http://depositfiles.com/files/ixvgs2rst
сам понимаешь, что это не оригинал

t4Nk 01.02.2009 13:34

Цитата:

Сообщение от dk-ne
http://depositfiles.com/files/ixvgs2rst
сам понимаешь, что это не оригинал

хм, на LightTPD/1.4.20-1; php 5.2.8 fcgi; MySQL 5.0.45 нормально добавились все строки.

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

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


Время: 06:16