PDA

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


dk-ne
05.12.2008, 06:17
Всем привет! Кто может подсказать как придумать форму 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
А ты сохраняй не в XLS, а в CSV, и его сможешь парсить обычными методами.
Этот формат не мною создается, а автоматической системой. И в нем более 1000 строк...

dk-ne
05.12.2008, 15:58
http://group315.clan.su/load/2-1-0-1
Парсер xls в mySQL выгружает. Подробная инструкция в архиве.
Скачал. Еще не тестил. Жаль там комментов нет и код на несколько страниц расписан...

dk-ne
05.12.2008, 16:07
Готового решения нет, надо писать все этом самому под эту задацу
Боюсь попросить...

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-й разбить на три столбца (фамилия имя отчество) и также тремя столбцами занести в базу данных.
т.е. было в файле |Данные|ФИО|, а стало в базе данных так |Данные|Фамилия|Имя|Отчеств о|
если так то держи (http://slil.ru/26558468)

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

mff
20.01.2009, 20:19
dk-ne, я делал так, экспортировал из Excel в CSV формат, кидал на хост в папку и парсером выводил на сайте.

<?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_td= count($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>';
}

?>

на поковыряй, вот стили:

.td1{background-color:#f0ece8;}
.td2{background-color:#ffffff;}

dk-ne
31.01.2009, 05:56
dk-ne, опиши подробнее.
из того что ты написал я понял след.:
исходные данные хранятся в файле xls. В таблице две колонки: первая с какими-то данными, вторая содержит ФИО, разделенные пробелами.
Нужно:
1. сделать форму, через которую этот самый файл .xls загружается на сервер
2. распарсить данные из файла: 1-й столбец добавить в 1-й столбец в базе данных, а 2-й разбить на три столбца (фамилия имя отчество) и также тремя столбцами занести в базу данных.
т.е. было в файле |Данные|ФИО|, а стало в базе данных так |Данные|Фамилия|Имя|Отчеств о|
если так то держи (http://slil.ru/26558468)
С маленькими таблицами работает хорошо. При большой таблице, как у меня, пишет, что File not exist. Хотя файл загружает.

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

dk-ne
01.02.2009, 02:13
dk-ne, если возможно, выложи пример своей таблицы.
http://depositfiles.com/files/ixvgs2rst
сам понимаешь, что это не оригинал

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

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

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

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