【问题标题】:Passing data from PHP class to PHPExcel via AJAX通过 AJAX 将数据从 PHP 类传递到 PHPExcel
【发布时间】:2012-02-09 10:19:59
【问题描述】:

我被 OOP PHP 和 json 数据卡住了。我对 OOP 并不完全陌生,但我无法理解这一点。如果有人可以向我解释一下,那就太好了!

我在 PHP 中有以下网格对象:

    Class Grid {

        var $data;
        var $joins;
        var $fields;
        var $where;
        var $table;
        var $groupBy;
        var $having;
        var $limit;
        var $order_by;
        var $sort;
        var $security;
        var $set;
        var $sql;

....

        // loads data into the grid
        function load() {
    ...
            // setup the sql - bring it all together
            $sql = "
                SELECT $post[cols]
                FROM `$table`
                $joins
                $where
                $groupBy
                $having
                ORDER BY $order_by $sort
                $limit
            ";

            $this->sql = $sql;

            // execute the sql, get back a multi dimensial array
            $rows = $this->_queryMulti($sql);

            // form an array of the data to send back
            $data = array();
            $data['rows'] = array();
            foreach($rows as $i=>$row) {
                foreach($row as $col=>$cell) {
                    // use primary key if possible, other wise use index
                    $key = $primaryKey ? $row[$primaryKey] : $i;
                    // primary key has an _ infront becuase of google chrome re ordering JSON objects
                    //http://code.google.com/p/v8/issues/detail?id=164
                    $data['rows']["_".$key][$col] = $cell;
                }
            }

    ...        
            $data['order_by'] = $order_by;
            $data['sort'] = $sort;
            $data['page'] = $page;
            $data['start'] = $startRow + 1;
            $data['end'] = $startRow + $nRowsShowing;
            $data['colData'] = $colData;

            $this->data = $data;
        }

它被 AJAX callgrid.php 调用:

$grid->load();
        // here we need to add field in data[sql] = sql query, then we can pass it to toExcel() - how?
        echo json_encode($grid->data);

我想要的是能够使用 PHPExcel 将当前的 sql 查询(可以是全部或搜索结果)导出到 Excel 中。所以我有 toExcel.php 函数 toexcel($query) - 它将接受查询并将其导出到 excel。

现在 - 我如何通过 AJAX 将 sql 查询从网格传递到 toexcel?

  1. 我知道我需要添加到 $data():

    $data['sql'] = $sql;

接下来呢?


更新: 我正在使用以下 jquery 网格: http://square-bracket.com/openjs

我了解 PHPExcel 应该由 grid 或 jquery 启动

【问题讨论】:

  • 为什么要通过 AJAX?为什么不在 PHP 中完成这一切?
  • 因为网格本身是从 ajax 加载的。所以只有在ajax调用时才会形成sql查询:$(".grid.digital_edit").loadGrid({...})
  • 好的 - 我不需要被 AJAX 卡住。但那又如何呢?
  • 不要回显$grid->data,而是将其用作PHPExcel的输入数据
  • @ Mchl - 你是什么意思“代替”?那么网格将不会加载。它应该在浏览器中加载并且仍然具有导出到 Excel 的能力......而且我不需要每次都将它导出到 Excel - 只有当用户请求时,比如按下按钮?

标签: php ajax oop phpexcel


【解决方案1】:

大致了解您可以做什么:

创建一个按钮,例如

<a href="#" id="export">export to Excel</a>

然后在 jquery 中你必须创建类似的东西:

var grid = $(".grid.digital_edit").loadGrid({...}); //or similar - what you did to load the data into the grid

$('#export').click(function() {
    $.ajax({
        url: "export_to_excel.php", // the url of the php file that will generate the excel file
        data: grid.getData(), //or similar - based on the grid's API
        success: function(response){
            window.location.href = response.url;
        }
    })

});

文件 export_to_excel.php 将包含生成 excel 文件的代码:

  1. 您将在此处启动 PHPExcel 类并创建一个文件,例如new_excel.xls
  2. 在您的响应数组中,$response['url'] 将包含新创建文件的绝对 URL。 (http://www.example.com/files/new_excel.xls)

这听起来可能过于复杂,但请尝试将您的目标分开并一次实现一个。例如

  1. 创建按钮。
  2. 然后尝试在点击按钮时进行简单的 AJAX 调用。
  3. 然后创建您的 export_to_excel.php 文件并尝试使用 PHPExcel 类。
  4. 根据找到的教程创建一个示例 excel 文件。
  5. 根据自己的数据创建一个 excel 文件,但硬编码在 php 文件中。
  6. 创建正确的 AJAX 调用,将所需数据发送到 php 文件。
  7. 捕获正确的 AJAX 调用。
  8. 将 AJAX 调用中的数据传递给 PHPExcel 类。
  9. 创建 excel 文件。
  10. 将 url 发送回 excel 文件。
  11. 将用户重定向到excel文件的url。

编辑

为您提供更多帮助:您只需要一个 PHP 脚本/文件。同一个将接收来自 javascript 文件的 AJAX 调用,将生成 excel 文件并将文件 url 返回/响应到 javascript 文件(按该顺序)。一个简化的例子是:

<?php
//export_to_excel.php

$data = $_POST['data']; // get the data from the AJAX call - it's the "data: grid.getData()" line from above

//... format the received data properly for the PHPExcel class

// later on in the same file:
$xls = new PHPExcel();
$xls->loadData($formattedData); //I assume that there is a similar loadData() method
$xls->exportToFile('/vaw/www/example.com/public/files/new_excel.xls'); // I assume that there is an exportToFile() method

$response = array(
    'success' => true,
    'url' => 'http://www.example.com/files/new_excel.xls'
);

header('Content-type: application/json');

// and in the end you respond back to javascript the file location
echo json_encode($response);

然后在 javascript 中用这一行显示文件

window.location.href = response.url; //response.url is $response['url'] from the PHP script

【讨论】:

  • 谢谢 Aletzo - 我已经有了所有工作的 php 文件 - 我的问题是互连它们。所以你建议我可以通过简单地将它作为数据调用 AJAX 来访问当前运行的 sql 查询:grid.getData() - 我自己创建的这个 getData() 或者你假设这个函数应该已经在网格中可用?
  • grid.getData() 部分是javascript。您用来显示网格的 javascript 库,应该已经实现了一个方法,以便您可以获取网格数据(我称之为 getData)。如果没有,你必须自己做,但通常每个库都有类似的方法可以使用。
  • 在 javascript 中,您根本无法访问 sql 查询或 PHPExcel 类。这就是为什么你必须进行 AJAX 调用的原因,这意味着 javascript(客户端)正在要求 php(服务器端)做某事。 php 将处理 PHPExcel 类,将生成文件并告诉 javascript“好的,这里是我创建的 excel 文件的 url”。然后 javascript 将向用户显示该 url。
  • 我只是认为你在这里尝试做的是同时解决 2-3 个你以前没有解决过的不同问题,这对你来说太难了。发布一个完整的解决方案需要几个小时的编码,可悲的是我负担不起。这就是为什么,我建议你可以单独识别每个问题并解决它,然后将所有解决方案组合在一起。
  • 我接受了这个答案,尽管你忽略了我不需要 PHP 帮助的 cmets。我之所以接受它,是因为您的答案代码的第一部分实际上将我引向了正确的方向。我需要的实际答案是 - 在 VAR 中存储网格对象,然后在需要的地方访问它的选项
猜你喜欢
  • 1970-01-01
  • 2013-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多