dynamic export от php или angularjs в excel

vasilev

Registered
здравейте,
опитвам се да експортна в ексел през php или angularjs данни от вида:

Код:
$scope.items = [{
        key: "value1",
         key2: "value2",
         key3: "value3"
    }, {
         key: "value2",
         key4: "value4",
        key5: "value5"
    }, {
         key9: "value9",
         key: "value1",
         key2: "value2",
    }];

тоест не са подредени и не са еднакви keys..
опитах няколко начини но ако не са еднакви не става.

http://stackoverflow.com/questions/21680768/export-to-xls-using-angularjs
PHPExcel - също не става тъй като трябва да се дава като параметър номера на полето..


дали има някакъв начин това да стане.
 
В js пропертитата на обектите не са подредени.
http://stackoverflow.com/questions/5525795/does-javascript-guarantee-object-property-order

Т.е. начина по който си представил данните сега може да не е този, в който ще се съхраняват в браузъра. Например, ти си написал:

key: "value1",
key2: "value2",
key3: "value3"

Но реално в браузъра може да седят наобратно:

key3: "value3"
key2: "value2",
key: "value1",

По какъв начин ще определиш кой value в коя колона отива?
 
няма как да определя, тъй като всеки обект в array-a е с различни пропертита..
някой може да има същите key като предишния, някой различни.
въпроса е при key3 - да сложи в excel-a header key3, ако вече го няма и под този header да изкара данна - value3 .
в phpexcel мога да направя логика да добавя нов header key ако вече го няма, но със value малко сложно да ги вържа.
 
vasilev каза:
няма как да определя, тъй като всеки обект в array-a е с различни пропертита..
някой може да има същите key като предишния, някой различни.
въпроса е при key3 - да сложи в excel-a header key3, ако вече го няма и под този header да изкара данна - value3 .
в phpexcel мога да направя логика да добавя нов header key ако вече го няма, но със value малко сложно да ги вържа.
Ахаа значи key[1...100] са ти имената на колоните, в които ще слага value-та, и на всеки ред ще слагаш само по (да кажем) три стойности от общо примерно 10?

В такъв случай решението от линка, който си дал, би трябвало да става? Само че вместо name ще сложиш valueX:

HTML:
<div id="exportable">
    <table width="100%">
        <thead>
            <tr>
<th>value1</th>
<th>value2</th>
<th>value3</th>
<th>value4</th>
            </tr>
        </thead>
        <tbody>
            <tr ng-repeat="item in items">

                <td>{{item.name}}</td>
                <td>{{item.email}}</td>
                <td>{{item.dob | date:'MM/dd/yy'}}</td>
            </tr>
        </tbody>
    </table>
</div>

Макар че всъщност... по-надолу казват, че браузърите запазват реда, въпреки че не е по стандарт:
Current Language Spec: technically, order is unspecified.

Current Browsers: order is preserved with the major exception of keys like "7" that parse as integers and are handled differently by Chrome/V8.

Future Language Spec (>ES2015): Generally, you can expect that things ordered today will not become unordered. New APIs will guarantee order; existing APIs are difficult to change. See JMM's answer for more details.
 
нещо не се получава..
това е което опитвам:

http://jsfiddle.net/00nfeq12/1209/

тук ако се махне от първият item .. key1, то няма да има ново поле key1.
всичко се прави по първият. вторият има key2 - не го изкарва.
третият има key1 - като първият и е ок. но не мога в първият да изкарам всички key-ове :)
 
vasilev каза:
нещо не се получава..
това е което опитвам:

http://jsfiddle.net/00nfeq12/1209/

тук ако се махне от първият item .. key1, то няма да има ново поле key1.
всичко се прави по първият. вторият има key2 - не го изкарва.
третият има key1 - като първият и е ок. но не мога в първият да изкарам всички key-ове :)
В html-а описваш как ще се изведат данните от js-обекта. А ти в таблицата никъде не си описал key1/2/3... виж как си редактирах предното мнение. :?:
 
http://jsfiddle.net/00nfeq12/1210/

това не извежда ли данните от array-a просто.
махнах html - той не е важен. въпроса е при export защо не взима от item2 примерно данните, а се води по item1.
 
vasilev каза:
http://jsfiddle.net/00nfeq12/1210/

това не извежда ли данните от array-a просто.
махнах html - той не е важен. въпроса е при export защо не взима от item2 примерно данните, а се води по item1.
Не знам. Това би трябвало да е описано някъде по документацията на alasql?
 
поиграх си да изкарам първият ред с празни value но със всички keys..
след което добавих и ng-hide да скрива този ред, и работи,.
но ако някой знае по хубав начин и през php - ще се радвам да разбера :)
 
vasilev каза:
поиграх си да изкарам първият ред с празни value но със всички keys..
след което добавих и ng-hide да скрива този ред, и работи,.
но ако някой знае по хубав начин и през php - ще се радвам да разбера :)

http://stackoverflow.com/a/10683978
Виж. Изглежда е достатъчно да сложиш двата хедъра и да printнеш таблицата с html table, но не мога да тествам.

Пробвай да изпратиш (с POST) данните от js-обекта към php скрипт, който да ги изцикли и изпечата в html формат, като не забравяш двата хедъра.

Така няма да ползваш никакви други библиотеки, а и е доста просто откъм логика.
 
проблема е изкарването на данните..
аз в момента ги изкарвам с php към angular.
идеята ми първо беше само с php Но тъй като не на всеки ред има еднакви key, то не съм сигурен как да ги принтирам в excel-a.
тук мога да добавя първият ред да е всички key както изкарах с array_keys, но как да се укаже на всеки следващ ред в foreach кой value в кой TD да е ..


<td>KEY1<td><td>KEY2<td><td>KEY3<td>

foreach...
<td><td><td>VAL2<td><td><td>
.
<td>VAL1<td><td><td><td>VAL3<td>
...
 
PHP:
function print_table_row($headers, $data) {
  echo "<tr>";
  foreach($headers as $header) {
    echo "<td>" . $data[$header] . "</td>";
  }
  echo "</tr>";
}
As simple as that?

Подаваш хедърите и данните? И печаташ за всеки хедър съответната информация: $data[$header]. Може би не ти е интуитивно защото не си свикнал да индексираш масив с друга променлива.
 

Back
Горе