Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Excel a PHP
Forum PHP.pl > Forum > PHP
maciu
mam zrobioną bardzo rozbudowaną tabelke w Excelu i muszę ją wyświetlić na stronie. Poza tym nie zawsze będzie wyświetlana cała ta tabelka tylko wybrane jej elementy. Czy jest to w ogóle możliwe, czy oba te środowiska się "widzą", możliwa jest interakcje między Excelem a php?
radzaw
zalezy na jakiej platformie masz postawiony serwer www + php - jezeli jest to windows z zainstalowanym officem to przy pomocy COM-a mozesz zrobic doslownie wszystko z dokumentami officeowymi, natomiast jezeli jest to linux to niestety nie ruszysz nawet excela, chyba ze zapiszesz go w formacie CSV lub innym czysto tekstowym.
DeyV
obsługe CSV można sobie ułatwić.

Np. http://www.cnovak.com/biff/index.htm
TomASS
Ale COM nei działa na serwerach linuxowych, a takich jest najwięcej. Działa jedynie na Windowsowym. Może jakaś alternatywa? Mnie też interesuje temat importu excel->MySQL najlepiej za pomocą jednego kliknięcia myszom smile.gif

pozdrawiam Was
DeyV
a jak by się sprawdzało podane linki, to by człowiek więcej wiedział...

Inny przykład: http://www.asafeplace.co.uk/downloads/csv_importer.zip
Indeo
Ja używam kilku metod.
1. CSV
2. Import pliku excel do msAccess (bardzo proste) i export z msAcces do mysql przez ODBC

Ale najczęściej:
3. Przez skonstruowanie w formule excela polecenia insert SQL'a opartego na danych które mają być przenoszone przykład

Żadna z metod nie umożliwi ci prostego "odbierz maila" => "wrzuć na strone" jeżeli komórki będą poscalane a powtarzające się w liście nazwy i teksty będą wyciągane jako nagłówki poszczególnych segmentów listy. Wtedy pozostaje albo ręczne grzebanie albo zapis do pliku HTML i parsowanie wyrażeniami regularnymi co jest żmudne. Zawsze najskuteczniej jest mieć kontakt z kimś kto tworzy dane arkusze aby go uświadomić jak powinien to robić:)
TomASS
A jeśli jest to prosty plik excel? Bez scalania komórek? poprostu na samej górze nagłówki a potem dane? csv_importer odpada, ponieważ troszkę dużo z nim jest roboty :/ Dobry natomiast jest pomysł ze skonstuowaniem poleceń SQL`a a potem jego kopiowanie, ale co jeśli do wprowadznia mymy 1500 wierszy?
A tak a propos nie działą :/ Jak wpisuję w nowym wierszu w nowym dokumencie:
Kod
="insert into beczkowozy values('"&dane!A2&"','"&dane!B2&"','"&dane!C2&"','"&dane!D2&"','"&dane!E2&"','"&dane!F2&"','"&dane!G2&"','"&dane!H2&"','"&dane!I2&"','"&dane!J2&"','"&dane!K2&"');"


(wcześniej mając zapisane dane w pliku dane.xls w arkuszu o nazwie dane) wyrzuca mi komunikat, że:
Cytat
Znalezienie 'A2' w 'dane.xls' nie jest możliwe. Istnieją dwie możliwe przyczyny:
Podana nazwa możę być niezdefiniowana
Podana nazwa nie dotyczy prostokątnego zakresu komórek

Szkoda :/


Kopiowanie tego polecenia troszkę zajmie :/ Na pewno jest jakaś prosta metoda, przeciesz csv_importer i phpMyAdmin to robi, ale troszkę dużo jest tam wypełniania, a ja ma ściśle określoną tabelę i niezabardzo wiem jak taki kod odpowiedzialny za import "wyciągnąć" z tych skryptów.

Pozdrawiam
Indeo
Z tym kopiowaniem i wklejaniem to przesadziłeś, przecież napisałem, że zapisujesz sobie arkusz do pliku sql (jaki sql kurde zwykła tekstowa serwetka .txt !) i wykonujesz go. Excel dysponuje 64 tysiącami wierszy ale skoro dane są w excelu to musi ci to wystarczyć (nie mogą przecież zajmować więcej niż 64 tys.)

A jeśli juz chcesz być takim automatem to użyj gotowej funkcji mysql do ładowania CSV'sów do bazy:

Kod
mysql> LOAD DATA INFILE 'data.txt' INTO TABLE tbl_name
    ->           FIELDS TERMINATED BY ',' ENCLOSED BY '"'
    ->           LINES TERMINATED BY '\n';


http://dev.mysql.com/doc/mysql/en/LOAD_DATA.html
TomASS
No troszkę przesadziłem :/ Ale nadal nie działa mi taki zapis ? Robię wszytko tak jak pokazałeś....kopiuję Twoja tabelke do excela, nazywam arkusz, zapisuje ją, Tworzę noy plik excela i tam wklejam to polecenie SQL które mi podałeś w przykładzie i każe mi wybierać plik...wybieram dane.xls i wyskakuje błąd (który podałem wyżej) :/

A co do LOAD...to da rade wywołać takie polecenie przez php? Jak podać adres do pliku? Skad MySQL wie gdzie podziewa się ten plik?

Czyli mam plik dane.txt
Kod
B;;M;S;0000-00-00;;;0;100.00;
B;;M;;2004-06-01;;;102;10015.00;
K;;;;2004-06-01;;;43;10011.00;
K;;T;;2004-06-03;;;28;10012.00;
K;;T;E;2004-06-02;;;56;10010.00;
B;;T;;2004-06-03;;;90;10008.00;
B;;M;S;2004-06-01;;;513;30018.00;
B;;;S;0000-00-00;;;0;100.00;
B;Kłodzko;T;S;0000-00-00;;;0;200.00;
B;;;S;0000-00-00;;;0;300.00;
O;;Brak;S;2004-06-01;;;94;30025.00;
B;;T;S;0000-00-00;;;0;100.00;
B;;;S;0000-00-00;;;0;100.00;
O;Wrocław;Brak;S;2004-06-01;;;832;30010.00;
B;;T;;2004-06-03;;;140;10016.00;
B;;T;;2004-06-01;;;204;10019.00;

i teraz chcę je umieścić w bazie danych 'bd' i tabeli 'zamowienia' tak aby sie nie dublowaly:

Kod
LOAD DATA INFILE 'C:/Appserv/www/nop/dzis.txt' INTO TABLE zamowienia FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n';

w tworzy mi 156 rekordów w pustej tabeli :/ a ja chciałem wprowadzić tylko 16:/

LOAD DATA...wpisuje dane po kolei do komóre, czy istnieje możliwość zmiany ich kolejności i/lub nie brania pod uwagę niektórych komórek w tabeli MySQL?
Wielkie dzięki
Indeo
Jak to gdzie plik:
  1. LOAD DATA INFILE '/to/jest/sciezka/do/pliku/data.txt' INTO TABLE tbl_name
  2. FIELDS TERMINATED BY ',' ENCLOSED BY '"'
  3. LINES TERMINATED BY '\n';


Po drugie zakładam że programista php w początkach swojej kariery poznał formuły w excelu i potrafi je obsługiwać (rany nie mówię o makrach VBA ale o najzwyklejszych formułach). W linku który dałem (na dole) jest gotowy plik z przykładem. Przykład: Plik excela

Tak to ma działać. Ty masz sobie zrobić własną formułę pakującą dane do twojej tabeli mysql.

I na koniec. Kody które chciałbyś "wyciagać" z phpmyadmina to nic innego jak polecenie LOAD DATA INFILE . Wszystkie programy klienckie go używają zarówno phpmyadmin jak i pozostałe, bo odbywa się po stronie serwera baz i jest najszybsze.


Jeszcze jedno: może się zdarzyć że w pliku CVS będą puste wiersze ale z separatorami. Mysql załaduje je tak samo jak wiersze z danymi. Trzeba wtedy nałożyć na tabele indeksy unikatowe które zabezpieczą tabele przed wprowadzaniem bezsensownych danych albo wyciachać takowe wiersze z pliku CSV. Kolejność wierszy w tabeli będzie taka jak przy wprowadzaniu. Kolejność możesz sobie zminić w excelu albo zostawić jak jest i sortować wyniki zapytań.


P.S. I nie edytuj ciągle swoich postów bo potem wygląda jakbym odpowiadał na pytania które nie padły smile.gif
TomASS
Dzięki, działa, teraz tylko jeden, ostatni problem....

Mam dane w pliku w takiej postaci:
Kod
numer;przewoznik;ades;towar;


a tabela w MySQL wyglada nastepujaco

numer jakosc_przewoznika  ilosc_km przewoznik miasto towar wielkosc adres

Jak widać dane w pliku są poprzestawiane (nie są w opowiedniej kolejności) i nie wszystkie pola są brane pod uwagę. Czy da radę temu jakoś zaradzić, czy potrzebny jest skrypt który mi to odopwiednio zamieni (np doda średniki i pozamienia kolejności) :/

Wielkie dzięki jeszcze raz
mike
Spróbuj tak:
  1. LOAD DATA INFILE '/to/jest/sciezka/do/pliku/data.txt'
  2. INTO TABLE tbl_name (numer, przewoznik, towar, adres)
  3. FIELDS TERMINATED BY ',' ENCLOSED BY '"'
  4. LINES TERMINATED BY '\n';
Ace
a ja troche pokrece...
tresc pliku test.cvs
Kod
numer;przewoznik;ades;towar;
1;PRZEWOZNIK1;ul. Przekordna 3; Bułka;
2;PRZEWOZNIK2;ul. Przekordna 5; Pomidor;
3;PRZEWOZNIK3;ul. Przekordna 6; Kasza;
4;PRZEWOZNIK4;ul. Przekordna 7; Piwo;


i samemu mozna napisac kod php ktory odpowiednio nam wrzuci te dane do mysql...
  1. <?php
  2.  
  3. $pozycje = file( &#092;"test.cvs\" );
  4. $ile = count( $pozycje );
  5. for( $i=1; $i<$ile; $i++ ) // pomijamy pierwszy rekord ktory jest nazwa kolumn
  6. {
  7. $dane = explode( &#092;";\" , $pozycje[$i] );
  8. $zapytanie = &#092;"INSERT INTO tabela SET przewoznik='$dane[1]', adres='$dane[2]', towar='$dane[3]'\";
  9. mysql_query( $zapytanie );
  10. }
  11.  
  12. ?>


ja to tak zrobilem, troche duzo zapyan wychodzi ;] ale liczy sie pomysl...
TomASS
mam coś takiego:
  1. <?php
  2.  
  3. $query = &#092;"LOAD DATA INFILE '$path2' INTO TABLE zamowienia IGNORE 1 LINES (ID, skad, adres, Przewoznik, Stan, Data_realizacji, Dodatkowe_miejsce, Doda
    t
  4. owe_miejsce2, ilosc_km, cena)\";
  5. $result = mysql_query($query);
  6.  
  7. ?>

i teraz jak zrobić aby wpisy, które już są w bazie danyhc, które się dublują nie były wpisywane dwa razy............acha $path2' REPLACE INTO TABLE lub $path2' IGNORE INTO TABLE nie działa :/
Indeo
Klucze unikatowe się kłaniają.
Poza tym może przyda się skasowanie zawartości tabeli przed załadowaniem danych?
TomASS
Zrobiłem coś takiego:

  1. <?
  2. include(&#092;"funkcje.php\");
  3. require_once(&#092;"config.php\");
  4. require_once(&#092;"stale.php\");
  5. mysql_connect (&#092;"$dbhost\",\"$dblogin\",\"$dbhaslo\") or die (\"Nie masz uprawnien\");
  6. mysql_select_db (&#092;"$db\");
  7.  
  8. $path = $_REQUEST['path'];
  9. $tak = $_REQUEST['tak'];
  10.  
  11. if (!$tak){
  12. ?>
  13. <form enctype=\"multipart/form-data\" action=\"upload.php\" method=\"post\">
  14.  <input type=\"hidden\" name=\"MAX_FILE_SIZE\" value=\"30000\" />
  15.  Send this file: <input name=\"userfile\" type=\"file\" />
  16.  <input type=\"submit\" value=\"Send File\" />
  17.  <input type=\"hidden\" name=\"tak\" value=\"tak\" />
  18. </form>
  19. <?
  20. }
  21. else{
  22.  
  23.  
  24.  
  25. $uploaddir = './upload/';
  26. $uploadfile = $uploaddir . $_FILES['userfile']['name'];
  27.  
  28.  
  29. move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile);
  30.  
  31.  
  32. $path = &#092;"../upload/\".$_FILES['userfile']['name'];
  33. echo $path;
  34. $query = &#092;"LOAD DATA INFILE '$path' IGNORE INTO TABLE zamowienia IGNORE 1 LINES (ID, skad, adres, Przewoznik, Stan, Data_realizacji, Dodatkowe_miejsce, Doda
    t
  35. owe_miejsce2, ilosc_km, cena)\";
  36. $result = mysql_query($query);
  37. echo \"<br>\",$query,\"<br  />\",$result;
  38. }
  39. ?>


Ponieważ aby plik został wczytany przez LOAD DATA mus znajdować się na serwerze (chyba, że się mylę) i teraz przesyłam go do katalogu upload

i niedziała, dane nie importują się :/ może, prawdopodobnie źle podaję ścieżkę, ale jak mam to zrobić prawidłowo.
Jestem już tak blisko....pomóżcie proszę.

Pozdrawiam Was serdecznie

ps $path = "./upload/".$_FILES['userfile']['name']; też nie działa sad.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.