SQL lekérdezés eredménye excelnek PHP-n keresztül

SQL lekérdezés eredménye excelnek PHP-n keresztül
2015-06-15T15:51:21+02:00
2015-06-16T11:23:39+02:00
2022-10-15T22:15:57+02:00
stuli
Üdv!

SQL server több százezer soros lekérdezését szeretném átadni excel fájlnak PHP segítségével.

Jelenleg úgy csinálom, hogy PHP-vel lekérdezem az MSSQL-ből az adatokat sqlsrv driver-rel xml formátumban és aztán egy echo-val kiiratom az eredményt.

$sql = "select mezo1, mezo2, mezo3 from tabla for xml path, type, root('result_in_xml')"; $stmt = sqlsrv_query($conn, $sql); sqlsrv_fetch($stmt); $xml_data = sqlsrv_get_field($stmt, 0, SQLSRV_PHPTYPE_STRING('UTF-8')); header("Content-type: text/xml; charset=utf-8"); echo $xml_data;
A probléma, hogy amikor az excellel ezt be akarom tölteni, akkor egy csomó ideig tölt, közben az excel a kliens memóriáját teljesen megzabálja (4 gigabyte-ból 3-at, amíg nem marad szabad memória), majd összeomlik.
A lekérdezés 10 másodpercig se tart és 700ezer sort ad vissza. Az egész egy 6 megás excel fájlban elfér.
Mutasd a teljes hozzászólást!
Ha minden képpen PHP kell.

A libreCalc ismeri a CSV formátumot --[A MIcroFo$ Office-nak is kellene]--
Standart formátum, ; -vel elválasztva. Gyosrsabb a natív írás és a konvertálással sem ütöd ki a szervert (kb 6Mb adatnál).
Mutasd a teljes hozzászólást!

  • Ha mindenáron PHP, akk. PHPExcel-re keress rá
    Ha hozzáférsz az sql szerverhez, akkor az insert into OPENROWSET-re keress rá.
    Mutasd a teljes hozzászólást!
  • A probléma sajnos az, hogy mindenképpen PHP-n keresztül kell átadni az adatot. Viszont az is fontos lenne, hogy Excel-ből ez bármikor könnyen frissíthető legyen, akár az excel fájl megnyitásával vagy a frissítés gombra kattintással. Szóval mindenképpen az excel/Adatok/Külső adatok átvitele opciókkal kellene operálni.
    Egyébként amit én egyáltalán nem értek, hogy miért van szüksége például a firefox-nak 3 giga memóriára ahhoz, hogy egy ilyen adathalmazt előállítson, ami egyébként 6 mega egy excelbe tömörítve. Azt gondolom, hogy a firefox nem tömörít, de akkor sem értem hogy lehet 3 giga.
    Mutasd a teljes hozzászólást!
  • Szia!

    Amellett, hogy abszolút PHP párti vagyok :) , ha az SQL serverből lekérdezned az adatokat, akkor nem egyszerűbb Excel-ből native SQL server támogatással megoldani? (Adatok/Egyébk forrás/Query szolgáltatás) Olyan query-t írsz amilyet csak akarsz (persze feltételezve, hogy PHP-val nem csinálsz olyat amit egy query-ben nem lehet megoldani.) Így gyakorlatilag egy layerrel kevesebbed is van és a frissítés is tökéletesen megy)
    Mutasd a teljes hozzászólást!
  • Ha minden képpen PHP kell.

    A libreCalc ismeri a CSV formátumot --[A MIcroFo$ Office-nak is kellene]--
    Standart formátum, ; -vel elválasztva. Gyosrsabb a natív írás és a konvertálással sem ütöd ki a szervert (kb 6Mb adatnál).
    Mutasd a teljes hozzászólást!
  • Egyébként amit én egyáltalán nem értek, hogy miért van szüksége például a firefox-nak 3 giga memóriára ahhoz, hogy egy ilyen adathalmazt előállítson, ami egyébként 6 mega egy excelbe tömörítve.

    Nem az FF állítja elő az adathalmazt, hanem megjeleníti csak azt. Az FF beépített xml megjelenítő sablonja és az FF nem arra van tervezve, hogy 700k rekordot tartalmazó XML struktúrát jelenítsen meg. Egyébként is miért érdekes, hogy az FF mennyi memóriát eszik XML megjelenítése közben, ha egyszer excel-ből kívánod használni az adatokat?

    Csatlakozom csörnyeföldihez, ne XML-t, hanem tagolt szöveges file-t használj a generáláskor. Viszont én a ; helyett a tab szeparátort ajánlom .txt kiterjesztés mellett, mert az független a windows regionális beállításaitól, nem úgy, mint a csv.

    Egy webes lekérdezéssel (ott van az adatok fülön) simán meglévő excel munkafüzetből is beállíthatsz hozzá kapcsolatot, ami frissíti az adatokat az url alapján.
    Mutasd a teljes hozzászólást!
  • Miért kell ebbe belekeverni a php-t?
    ha az Excel-ből leered az adatbázist, akkor a Data fülön van a From Other Sources-t lenyitva az MSSQL server adatkapcsolat. Azt beállitod. lekéred, és bármikor frissitheted.
    Mutasd a teljes hozzászólást!
  • Nem biztos, hogy el tudja érni a db szervert közvetlenül.
    Mutasd a teljes hozzászólást!
  • A db-hez csak 1 felhasználónév jelszó párossal lehet csatlakozni, azzal amit a php használ. Újak létrehozására nincs lehetőség. Így a php az ami a jogosultságokat kezeli. Ezért van rá mindenképpen szükség.
    Mutasd a teljes hozzászólást!
  • A PHP-n keresztül megy a jogosultság kezelés ezért nem hagyható ki.
    Mutasd a teljes hozzászólást!
  • Ez önmagában még nem okoz gondot elvileg, feltételezem a PHP-ben látod a user/pass-t, akkor lehet probléma, ha a távoli elérés korlátozva van a PHP-t futtató szerverre. Ha nincs akkor gond nélkül kihagyhatod a PHP-t és használhatod a rendelkezésedre álló felhasználót/jelszót. Arra hirtelen nem emlékszem, hogy a queryhez tartozó adatokat (mármint user/pass) el tudod-e rejteni a felhasználó elől (régen használtam ezt a felállást) - de ebből a szemszögből tényleg biztonságosabb PHP, talán kevésbé férnek hozzá.
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd