Всем привет! Кто может подсказать как придумать форму php по которой можно было бы загрузить файл Excel на сервер и чтобы он автоматически перенес две первых колонки в таблице в базу данных сайта? И более сложный вопрос: как сделать чтобы во втором столбце пробелы заменились на новые колонки? То есть предположим это ФИО. И чтобы фамилия, имя и отчество были отдельно.
не сталкивался с таким, но тк кк у гугле поискать не судьба, скопипастил пару ссылок http://code.google.com/p/php-excel/ http://www.codeplex.com/PHPExcel http://www.ibm.com/developerworks/xml/library/os-phpexcel/index.html прост спать иду, посему только ссылки лентяям =\
А как такой вариант решения первого вопроса: <?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, опиши подробнее. из того что ты написал я понял след.: исходные данные хранятся в файле xls. В таблице две колонки: первая с какими-то данными, вторая содержит ФИО, разделенные пробелами. Нужно: 1. сделать форму, через которую этот самый файл .xls загружается на сервер 2. распарсить данные из файла: 1-й столбец добавить в 1-й столбец в базе данных, а 2-й разбить на три столбца (фамилия имя отчество) и также тремя столбцами занести в базу данных. т.е. было в файле |Данные|ФИО|, а стало в базе данных так |Данные|Фамилия|Имя|Отчество| если так то держи
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_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>'; } ?> на поковыряй, вот стили: HTML: .td1{background-color:#f0ece8;} .td2{background-color:#ffffff;}
С маленькими таблицами работает хорошо. При большой таблице, как у меня, пишет, что File not exist. Хотя файл загружает.
хм, на LightTPD/1.4.20-1; php 5.2.8 fcgi; MySQL 5.0.45 нормально добавились все строки. в общем обновил класс, подправил немного сам скрипт, должно работать http://depositfiles.com/files/05yo6vjf8