将Google Spreadsheets数据与PHP集成,第2部分

在本文的第一部分中,我向您介绍了Google Spreadsheets Data API,这是一种REST API,开发人员可以使用该API轻松围绕Google Spreadsheets云中托管的用户空间电子表格数据构建新的应用程序。 我解释了电子表格,工作表,列表和单元供稿的基础知识,说明了如何将这些供稿与Zend Framework一起使用,以快速有效地将电子表格内容导入PHP应用程序。

但是,Google Spreadsheets Data API不仅支持检索和搜索电子表格。 在本结论部分中,我将研究如何通过从远程PHP应用程序中添加,更新和删除行,单元格和工作表,来使用Data API远程操作电子表格内容。 本文概述的技术是两个示例应用程序的补充,它们分别使用Data API将RSS feed和SQL结果集读取和导入到Google Spreadsheet中。

添加工作表

每个电子表格都包含一个或多个工作表,而Google Spreadsheets Data API允许您以编程方式访问和操作这些工作表。 要查看其工作原理,请转到Google Spreadsheets服务,登录并创建一个空的电子表格。 请注意电子表格密钥,该密钥应该在URL中可见。 您的空电子表格类似于图1

图1.一个新的空电子表格
新的空白Google电子表格的屏幕截图

要将新工作表添加到该电子表格,您需要以Atom格式生成一个新的工作表条目,然后将该条目发布到指定电子表格的工作表URL中。 考虑清单1 ,它说明了该过程。

清单1.添加一个新的工作表
<!DOCTYPE html 
  PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <title>Creating worksheets</title>
    <style>
    body {
      font-family: Verdana;      
    }
    </style>    
  </head>
  <body>
    <?php
    // load Zend Gdata libraries
    require_once 'Zend/Loader.php';
    Zend_Loader::loadClass('Zend_Gdata_Spreadsheets');
    Zend_Loader::loadClass('Zend_Gdata_ClientLogin');

    // set credentials for ClientLogin authentication
    $user = "someuser@gmail.com";
    $pass = "somepass";

    try {
      // connect to API
      $service = Zend_Gdata_Spreadsheets::AUTH_SERVICE_NAME;
      $client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $service);
      $service = new Zend_Gdata_Spreadsheets($client);

      // get spreadsheet entry
      $ssEntry = $service->getSpreadsheetEntry(
        'https://spreadsheets.google.com/feeds/spreadsheets/ssid');

      // get worksheet feed for this spreadsheet
      $wsFeed = $service->getWorksheetFeed($ssEntry);

      // create new entry
      $doc  = new DOMDocument();
      $doc->formatOutput = true;
      $entry = $doc->createElement('atom:entry');
      $entry->setAttributeNS('http://www.w3.org/2000/xmlns/' ,
        'xmlns:atom', 'http://www.w3.org/2005/Atom');
      $entry->setAttributeNS('http://www.w3.org/2000/xmlns/' ,
        'xmlns:gs', 'http://schemas.google.com/spreadsheets/2006');
      $doc->appendChild($entry);

      // add title, row and column counts
      $title = $doc->createElement('atom:title', 'Jan 2011');
      $entry->appendChild($title);
      $rows = $doc->createElement('gs:rowCount', '10');
      $entry->appendChild($rows);
      $cols = $doc->createElement('gs:colCount', '10');
      $entry->appendChild($cols);

      // insert entry
      $entryResult = $service->insertEntry($doc->saveXML(), 
        $wsFeed->getLink('self')->getHref());
      echo 'The ID of the new worksheet entry is: ' . $entryResult->id;

    } catch (Exception $e) {
      die('ERROR: ' . $e->getMessage());
    }
    ?>

  </body>
<html>

首先,请注意Zend_Gdata_Spreadsheets组件尚不提供本机方法来添加或更新工作表,这一点很重要。 仍然可以这样做。 您必须手动创建XML工作表元素,并使用通用的insertEntry()方法将其发布到正确的URL。

清单1首先获得对命名电子表格条目的引用,然后获得该条目的工作表提要。 接下来,创建一个DOMDocument对象来表示实际的条目,并向其中添加元素以指定工作表标题,行数和列数。 最后, insertEntry()方法将XML片段发送到工作表提要的URL,以将更改提交给电子表格。

执行此脚本并返回到Google Spreadsheets GUI时,您将在空白电子表格中看到一个新的工作表, 如图2所示

图2.添加了新工作表的电子表格
电子表格的屏幕截图,其中包含一个新工作表,标为“ Jan 2011”

此任务的另一种方法是创建Zend_Gdata_Spreadsheets_WorksheetEntry对象的实例,设置其属性,然后将此条目对象发布到工作表供稿URL。 最终结果是相同的,但是采用这种方法会更简单,因为Zend_Gdata_Spreadsheets负责生成工作表条目XML的细节。 考虑清单2 ,该清单演示了这种替代方法来产生与清单1等效的输出。

清单2.添加一个新的工作表
<!DOCTYPE html 
  PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <title>Creating worksheets</title>
    <style>
    body {
      font-family: Verdana;
    }
    </style>    
  </head>
  <body>
    <?php
    // load Zend Gdata libraries
    require_once 'Zend/Loader.php';
    Zend_Loader::loadClass('Zend_Gdata_Spreadsheets');
    Zend_Loader::loadClass('Zend_Gdata_ClientLogin');

    // set credentials for ClientLogin authentication
    $user = "someuser@gmail.com";
    $pass = "somepass";

    try {
      // connect to API
      $service = Zend_Gdata_Spreadsheets::AUTH_SERVICE_NAME;
      $client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $service);
      $service = new Zend_Gdata_Spreadsheets($client);

      // get spreadsheet entry
      $ssEntry = $service->getSpreadsheetEntry(
        'https://spreadsheets.google.com/feeds/spreadsheets/ssid');

      // get worksheet feed for this spreadsheet
      $wsFeed = $service->getWorksheetFeed($ssEntry);

      // create new entry
      $wsEntry = new Zend_Gdata_Spreadsheets_WorksheetEntry();
      $title = new Zend_Gdata_App_Extension_Title('Jan 2011');
      $wsEntry->setTitle($title);
      $row = new Zend_Gdata_Spreadsheets_Extension_RowCount('10');
      $wsEntry->setRowCount($row);
      $col = new Zend_Gdata_Spreadsheets_Extension_ColCount('10');
      $wsEntry->setColumnCount($col);

      // insert entry
      $entryResult = $service->insertEntry($wsEntry, 
        $wsFeed->getLink('self')->getHref());
      echo 'The ID of the new worksheet entry is: ' . $entryResult->id;

    } catch (Exception $e) {
      die('ERROR: ' . $e->getMessage());
    }
    ?>

  </body>
<html>

清单2为工作表标题,行数和列数创建Zend_Gdata_Spreadsheets_Extension对象,然后将这些对象附加到基础Zend_Gdata_Spreadsheets_WorksheetEntry对象。 这种方法不仅更易于理解,而且实现起来不太繁琐。 然后, insertEntry() ,最后的输入对象使用insertEntry()方法传输到工作表供稿URL。

更新和删除工作表

除了添加工作表外,Google Spreadsheets Data API还支持以编程方式更新和删除工作表。 这两个操作都要求用户检索要修改或删除的工作表条目,根据需要对条目进行更改,然后将其发送回服务器以执行。 请求的性质(PUT或DELETE)确定工作表条目是更新还是删除。

要了解这一点,请考虑清单3 ,该清单3更新了清单1中创建的工作表的标题。请注意,对于此清单和后续清单,必须具有工作表密钥,您可以从电子表格供稿或insertEntry()方法返回的入口对象。

清单3.更新工作表
<!DOCTYPE html 
  PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <title>Updating worksheets</title>
    <style>
    body {
      font-family: Verdana;      
    }
    table, td {
      border: 1px solid black;
      vertical-align: top;
    }
    </style>    
  </head>
  <body>
    <?php
    // load Zend Gdata libraries
    require_once 'Zend/Loader.php';
    Zend_Loader::loadClass('Zend_Gdata_Spreadsheets');
    Zend_Loader::loadClass('Zend_Gdata_ClientLogin');

    // set credentials for ClientLogin authentication
    $user = "someuser@gmail.com";
    $pass = "somepass";

    try {
      // connect to API
      $service = Zend_Gdata_Spreadsheets::AUTH_SERVICE_NAME;
      $client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $service);
      $service = new Zend_Gdata_Spreadsheets($client);

      // get worksheet entry
      $query = new Zend_Gdata_Spreadsheets_DocumentQuery();
      $query->setSpreadsheetKey('ssid');
      $query->setWorksheetId('wsid');
      $wsEntry = $service->getWorksheetEntry($query);
      $title = new Zend_Gdata_App_Extension_Title('Feb 2012');
      $wsEntry->setTitle($title);

      // update entry
      $entryResult = $service->updateEntry($wsEntry, 
        $wsEntry->getLink('edit')->getHref());
      echo 'The ID of the updated worksheet entry is: ' . $entryResult->id;

    } catch (Exception $e) {
      die('ERROR: ' . $e->getMessage());
    }
    ?>

  </body>
<html>

清单3使用前面示例中看到的getWorksheetEntry()方法通过其唯一标识符检索特定的工作表条目。 然后,输入对象的setTitle()方法更改工作表标题,然后使用updateEnry()方法将修订后的条目发送回去。 请注意,修订必须发送到入口对象指定的编辑URL。

执行此过程之后,您可以在图3的Google Spreadsheets GUI中看到修改后的工作表。

图3.更新了新工作表的电子表格
电子表格的屏幕截图,其中新工作表的名称已更新为“ 2012年2月”

要删除工作表,只需调用相应工作表条目的delete()方法。 清单4提供了一个从清单3中删除工作表的示例。

清单4.删除工作表
<!DOCTYPE html 
  PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <title>Deleting worksheets</title>
    <style>
    body {
      font-family: Verdana;      
    }
    </style>    
  </head>
  <body>
    <?php
    // load Zend Gdata libraries
    require_once 'Zend/Loader.php';
    Zend_Loader::loadClass('Zend_Gdata_Spreadsheets');
    Zend_Loader::loadClass('Zend_Gdata_ClientLogin');

    // set credentials for ClientLogin authentication
    $user = "someuser@gmail.com";
    $pass = "somepass";

    try {  
      // connect to API
      $service = Zend_Gdata_Spreadsheets::AUTH_SERVICE_NAME;
      $client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $service);
      $service = new Zend_Gdata_Spreadsheets($client);

      // get worksheet entry
      $query = new Zend_Gdata_Spreadsheets_DocumentQuery();
      $query->setSpreadsheetKey('ssid');
      $query->setWorksheetId('wsid');
      $wsEntry = $service->getWorksheetEntry($query);

      // delete entry
      $service->delete($wsEntry->getLink('edit')->getHref());
      echo 'The worksheet entry has been deleted';

    } catch (Exception $e) {
      die('ERROR: ' . $e->getMessage());
    }
    ?>
  </body>
<html>

和以前一样,此脚本检索工作表条目,然后调用delete()方法以将DELETE请求传输到条目的编辑URL。 该请求由Google API服务器解释和执行,从而从电子表格中删除了工作表。 此步骤在图4中清晰可见,该显示了电子表格已还原到其原始状态。

图4.删除新工作表后的电子表格
删除新工作表后电子表格的屏幕截图

添加工作表行

Google Spreadsheets Data API还使您可以向工作表中添加行,这一次,Zend_Gdata_Spreadsheets组件确实具有执行此操作的本机方法。 要添加行,请创建一个新的Zend_Gdata_Spreadsheets_ListEntry对象,该对象代表该行,并用值填充它,然后将此对象发布到列表供稿URL。 清单5有一个示例。

清单5.添加工作表行
<!DOCTYPE html 
  PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <title>Adding worksheet rows</title>
    <style>
    body {
      font-family: Verdana;
    }
    </style>    
  </head>
  <body>
    <?php
    // load Zend Gdata libraries
    require_once 'Zend/Loader.php';
    Zend_Loader::loadClass('Zend_Gdata_Spreadsheets');
    Zend_Loader::loadClass('Zend_Gdata_ClientLogin');

    // set credentials for ClientLogin authentication
    $user = "someuser@gmail.com";
    $pass = "somepass";

    try {
      // connect to API
      $service = Zend_Gdata_Spreadsheets::AUTH_SERVICE_NAME;
      $client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $service);
      $service = new Zend_Gdata_Spreadsheets($client);

      // set target spreadsheet and worksheet
      $ssKey = 'ssid';
      $wsKey = 'wsid';

      // create row content
      $row = array(
        "date" => "24-12-2010", 
        "task" => "Server reconfiguration", 
        "hours" => "3.5"
      );

      // insert new row
      $entryResult = $service->insertRow($row, $ssKey, $wsKey);
      echo 'The ID of the new row entry is: ' . $entryResult->id;
      
    } catch (Exception $e) {
      die('ERROR: ' . $e->getMessage());
    }
    ?>
  </body>
<html>

清单5设置了目标电子表格和工作表,然后创建一个包含列值映射的行数据数组。 然后,此数组传递到insertRow()方法,该方法创建必要的入口对象并将其发布到提要URL。 图5在Google Spreadsheets GUI中显示结果。 (查看图5大图 。)

图5.添加了新行的工作表
电子表格的屏幕截图,其中添加了新的列标题和新的数据行

以编程方式添加行时,请注意以下重要警告:

  • 目标工作表必须已经存在,并且必须已经定义了标题行的字段。
  • 传递给insertRow()的行数组必须包含与目标工作表中的列相对应的键; 仅提供值是不够的,而是会产生名称空间错误。
  • 仅插入键与目标工作表中的标题行匹配的那些字段。
  • 行数组的键不能大写,因为这种格式通常会产生服务器错误,并且行插入失败。

更新和删除工作表行

您还可以使用Data API更新和删除行。 为此,您必须检索要修改的行条目,对其进行更改,然后将其发送回列表供稿URL。 请求是以PUT还是DELETE的形式发送,决定是否修改行或从工作表中删除行。

清单6说明了更新工作表中的行的过程。

清单6.更新工作表行
<!DOCTYPE html 
  PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <title>Updating worksheet rows</title>
    <style>
    body {
      font-family: Verdana;
    }
    </style>    
  </head>
  <body>
    <?php
    // load Zend Gdata libraries
    require_once 'Zend/Loader.php';
    Zend_Loader::loadClass('Zend_Gdata_Spreadsheets');
    Zend_Loader::loadClass('Zend_Gdata_ClientLogin');

    // set credentials for ClientLogin authentication
    $user = "someuser@gmail.com";
    $pass = "somepass";

    try {
      // connect to API
      $service = Zend_Gdata_Spreadsheets::AUTH_SERVICE_NAME;
      $client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $service);
      $service = new Zend_Gdata_Spreadsheets($client);

      // set target spreadsheet and worksheet
      $ssKey = 'ssid';
      $wsKey = 'wsid';

      // get rows matching query
      $query = new Zend_Gdata_Spreadsheets_ListQuery();
      $query->setSpreadsheetKey($ssKey);
      $query->setWorksheetId($wsKey);
      $query->setSpreadsheetQuery('salesunits > 25000')
      $listFeed = $service->getListFeed($query);

      // iterate over matching rows
      // increase sales units by 50%
      // write updated rows back to spreadsheet
      foreach ($listFeed as $listEntry) {
        $rowData = $listEntry->getCustom(); 
        $newRow = array();
        foreach($rowData as $field) {
          $newRow[$field->getColumnName()] = $field->getText();
          if ($field->getColumnName() == 'salesunits') {
            $newRow[$field->getColumnName()] = $field->getText()*1.5;
          }
        }
        $entryResult = $service->updateRow($listEntry, $newRow);
      }
      echo 'Rows successfully updated.';

    } catch (Exception $e) {
      die('ERROR: ' . $e->getMessage());
    }
    ?>
  </body>
<html>

清单6创建了一个列表查询,该列表查询返回工作表中具有特定限制以上的销售单位的所有行作为列表供稿。 然后,它遍历此提要,依次处理每一行并调整每一行中某些单元格的值。 然后,通过updateRow()方法将更新后的行写回到电子表格中。

图6说明了更新前后的电子表格。 (查看图6大图 。)

图6.工作表,其中一些行已更新
工作表的屏幕截图,其中一些行已更新

删除行遵循类似的过程,除了您可以调用行条目的delete()方法,而不是调用服务对象的updateRow()方法。 清单7通过删除指定工作表的最后一行来说明。

清单7.删除工作表行
<!DOCTYPE html 
  PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <title>Deleting worksheet rows</title>
    <style>
    body {
      font-family: Verdana;
    }
    </style>    
  </head>
  <body>
    <?php
    // load Zend Gdata libraries
    require_once 'Zend/Loader.php';
    Zend_Loader::loadClass('Zend_Gdata_Spreadsheets');
    Zend_Loader::loadClass('Zend_Gdata_ClientLogin');

    // set credentials for ClientLogin authentication
    $user = "someuser@gmail.com";
    $pass = "somepass";

    try {
      // connect to API
      $service = Zend_Gdata_Spreadsheets::AUTH_SERVICE_NAME;
      $client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $service);
      $service = new Zend_Gdata_Spreadsheets($client);

      // set target spreadsheet and worksheet
      $ssKey = 'ssid';
      $wsKey = 'wsid';

      // get list feed
      $query = new Zend_Gdata_Spreadsheets_ListQuery();
      $query->setSpreadsheetKey($ssKey);
      $query->setWorksheetId($wsKey);
      $listFeed = $service->getListFeed($query);  

      // get and delete last row
      $lastEntry = $listFeed->offsetGet($listFeed->count()-1);
      $lastEntry->delete(); 
      echo 'Row successfully deleted.';

    } catch (Exception $e) {
      die('ERROR: ' . $e->getMessage());
    }
    ?>
  </body>
<html>

图7说明了更新前后的电子表格。 (查看图7大图 。)

图7.删除一行的工作表
工作表的屏幕截图,其中删除了一行

示例应用程序:RSS转换器

既然您知道如何添加和删除行,那么让我们尝试构建一个简单的应用程序来实际演示这一点。 您将创建一个RSS到电子表格转换器,该转换器从远程RSS提要中检索所有新闻报道,从提要中提取故事元数据,并将其放置在电子表格的行和列中。

在开始之前,请返回Google Spreadsheets GUI并创建一个空的电子表格,其标题行与典型RSS feed中的字段相对应。 结果应类似于图8

图8.一个空的工作表
具有列标题且无数据的空工作表的屏幕截图

本例中的示例提要是BBC的英国(UK)新闻提要,其中包含对英国主要新闻报道的简短描述。 使用Zend Framework的Zend_Feed组件,可以很容易地解析新闻提要,从中提取信息,然后使用Data API将其写入Google Spreadsheet。 清单8包含了代码。

清单8.从RSS feed导入工作表行
<!DOCTYPE html 
  PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <title>Importing worksheet rows from an RSS feed</title>
    <style>
    body {
      font-family: Verdana;
    }
    </style>    
  </head>
  <body>
    <?php
    // load Zend Gdata libraries
    require_once 'Zend/Loader.php';
    Zend_Loader::loadClass('Zend_Gdata_Spreadsheets');
    Zend_Loader::loadClass('Zend_Gdata_ClientLogin');
    Zend_Loader::loadClass('Zend_Feed_Rss');

    // set credentials for ClientLogin authentication
    $user = "someuser@gmail.com";
    $pass = "somepass";

    try {
      // connect to API
      $service = Zend_Gdata_Spreadsheets::AUTH_SERVICE_NAME;
      $client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $service);
      $service = new Zend_Gdata_Spreadsheets($client);

      // set target spreadsheet and worksheet
      $ssKey = 'ssid';
      $wsKey = 'wsid';

      // consume RSS feed
      // insert each channel item as a spreadsheet row
      // if large feed, increase PHP script execution time
      $channel = new Zend_Feed_Rss('http://feeds.bbci.co.uk/news/uk/rss.xml');
      foreach ($channel as $item) {
          $row = array();
          $row['title'] = $item->title();
          $row['description'] = $item->description();
          $row['link'] = $item->link();
          $row['date'] = $item->pubDate();
          $entryResult = $service->insertRow($row, $ssKey, $wsKey);
      }    

    } catch (Exception $e) {
      die('ERROR: ' . $e->getMessage());
    }
    ?>
  </body>
<html>

使用Zend_Feed组件可以很容易地解析RSS feed:只需将RSS feed URL传递给对象构造函数,然后构造函数将检索feed,对其进行解析,然后将其转换为可以迭代的一系列对象。 清单8做到了这一点,遍历feed中的项目并为每个项目创建一个数组。 然后,使用insertRow()方法将此数组作为行插入电子表格中。 该过程继续进行,直到处理RSS feed中的所有项目为止。

图9显示了结果。

图9.具有来自RSS feed的行的工作表
具有从RSS feed填充的数据行的工作表的屏幕截图

请注意,Data API当前不允许批量插入行数据。 但是,如果行的顺序并不重要,则可以考虑并行发送请求以加快处理速度。

修改工作表单元格

就像可以修改工作表行一样,您也可以修改工作表单元格。 您可能已经猜到,要完成此修改,您需要将修订后的条目发送到工作表的单元格提要,其中包含要更新的单元格的详细信息。

服务对象的updateCell()方法更新单元格。 此方法接受五个参数:行索引,列索引,单元格值,电子表格键和工作表键。 行和列索引从1开始。 清单9展示了它的工作方式。

清单9.更新工作表单元格
<!DOCTYPE html 
  PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <title>Updating worksheet cells</title>
    <style>
    body {
      font-family: Verdana;
    }
    </style>
  </head>
  <body>
    <?php
    // load Zend Gdata libraries
    require_once 'Zend/Loader.php';
    Zend_Loader::loadClass('Zend_Gdata_Spreadsheets');
    Zend_Loader::loadClass('Zend_Gdata_ClientLogin');

    // set credentials for ClientLogin authentication
    $user = "someuser@gmail.com";
    $pass = "somepass";

    try {
      // connect to API
      $service = Zend_Gdata_Spreadsheets::AUTH_SERVICE_NAME;
      $client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $service);
      $service = new Zend_Gdata_Spreadsheets($client);

      // set target spreadsheet and worksheet
      $ssKey = 'ssid';
      $wsKey = 'wsid';

      // update cell at row 6, column 5
      $entry = $service->updateCell('6', '5', 'Hello, world', $ssKey, $wsKey);
      echo 'Updated cell ' . $entry->getTitle()->getText() . '
'; // clear cell at row 1, column 1 $entry = $service->updateCell('1', '1', '', $ssKey, $wsKey); echo 'Cleared cell ' . $entry->getTitle()->getText(); } catch (Exception $e) { die('ERROR: ' . $e->getMessage()); } ?> </body> <html>

updateCell()的调用返回一个单元格条目对象,可以updateCell()进行解析以获取特定信息。 特别是,请注意,单元格输入对象的标题返回已更新单元格的字母数字坐标。

图10说明了脚本的输出。

图10.更新单元的结果
屏幕显示更新单元格的结果指示:更新单元格E6,清除单元格A1

图11在Google Spreadsheets GUI中显示了结果。

图11.具有更新的单元格的工作表
具有更新的单元格(E6和A1)的工作表的屏幕截图

另一种方法是使用单元格查询返回特定的单元格,然后使用setInputValue()方法更新该单元格。 请注意,您也可以输入公式,而不是静态值。 清单10演示。

清单10.更新工作表单元
<!DOCTYPE html 
  PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <title>Updating worksheet cells</title>
    <style>
    body {
      font-family: Verdana;
    }
    </style>
  </head>
  <body>
    <?php
    // load Zend Gdata libraries
    require_once 'Zend/Loader.php';
    Zend_Loader::loadClass('Zend_Gdata_Spreadsheets');
    Zend_Loader::loadClass('Zend_Gdata_ClientLogin');

    // set credentials for ClientLogin authentication
    $user = "someuser@gmail.com";
    $pass = "somepass";

    try {
      // connect to API
      $service = Zend_Gdata_Spreadsheets::AUTH_SERVICE_NAME;
      $client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $service);
      $service = new Zend_Gdata_Spreadsheets($client);

      // set target spreadsheet and worksheet
      $ssKey = 'ssid';
      $wsKey = 'wsid';

      // get cell feed
      // restrict feed to single cell E4
      $query = new Zend_Gdata_Spreadsheets_CellQuery();
      $query->setSpreadsheetKey($ssKey);
      $query->setWorksheetId($wsKey);
      $query->setMinRow(4);      
      $query->setMaxRow(4);      
      $query->setMinCol(5);      
      $query->setMaxCol(5);      
      $cellFeed = $service->getCellFeed($query);  

      // get cell from query
      $cellEntry = $cellFeed->offsetGet(0); 

      // update cell value and save back to spreadsheet
      $cellEntry->getCell()->setInputValue('=B2');
      $service->updateEntry($cellEntry, $cellEntry->getLink('edit')->getHref());
      echo 'Updated cell ' . $cellEntry->getTitle()->getText();      
    } catch (Exception $e) {
      die('ERROR: ' . $e->getMessage());
    }
    ?>
  </body>
<html>

在这种情况下,将单元格值设置为引用另一个单元格的公式,并使用服务对象的updateEntry()方法写回修改后的条目。

示例应用程序:数据库导入器

掌握了所有这些信息后,请看另一个示例:从MySQL数据库导入电子表格数据。 考虑您具有图12中的数据库结构。 (查看图12纯文本版本 。)

图12.一个示例数据库
示例数据库的屏幕截图

执行SQL查询然后从查询结果集的每个字段中创建电子表格单元格非常容易。 考虑清单11 ,其中有一个有效的示例。

清单11.从数据库导入工作表单元
<!DOCTYPE html 
  PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <title>Importing worksheet cells from a database</title>
    <style>
    body {
      font-family: Verdana;
    }
    </style>    
  </head>
  <body>
    <?php
    // load Zend Gdata libraries
    require_once 'Zend/Loader.php';
    Zend_Loader::loadClass('Zend_Gdata_Spreadsheets');
    Zend_Loader::loadClass('Zend_Gdata_ClientLogin');

    // set credentials for ClientLogin authentication
    $user = "someuser@gmail.com";
    $pass = "somepass";

    // create PDO connection
    $dbh = new PDO('mysql:host=localhost;dbname=library', 'user', 'pass');
    $sql = "SELECT title, author FROM library";

    try {
      // connect to API
      $service = Zend_Gdata_Spreadsheets::AUTH_SERVICE_NAME;
      $client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $service);
      $service = new Zend_Gdata_Spreadsheets($client);

      // set target spreadsheet and worksheet
      $ssKey = 'ssid';
      $wsKey = 'wsid';

      // get results from database
      // insert header row
      $rowCount = 1;
      $result = $dbh->query($sql, PDO::FETCH_ASSOC);
      for ($x=0; $x<$result->columnCount(); $x++) {
        $col = $result->getColumnMeta($x);
          $service->updateCell($rowCount, ($x+1), $col['name'], $ssKey, $wsKey);
      }
      $rowCount++;
      // insert each field of each row as a spreadsheet cell
      // if large result set, increase PHP script execution time
      foreach($result as $row) {
        $colCount=1;
        foreach ($row as $k=>$v) {        
          $service->updateCell($rowCount, $colCount, $v, $ssKey, $wsKey);
          $colCount++;
        }
        $rowCount++;
      }

    } catch (Exception $e) {
      die('ERROR: ' . $e->getMessage());
    }
    ?>
  </body>
<html>

清单11包括必需的类并设置了Data API凭据。 然后,它创建一个与MySQL数据库的PDO连接,并制定一个查询,该查询返回作者和标题的列表。 它还连接到Spreadsheets Data API并创建一个经过身份验证的连接。

接下来,脚本使用PDO getColumnMeta()方法返回结果集的列名,并使用updateCell()方法将这些列名作为标题行写入电子表格。 然后,它将继续遍历结果集,将每个字段作为单独的单元格写入电子表格,并在完成后跳转到下一行。 通过这种方式,整个结果集的内容将传输到电子表格中。

图13在Google Spreadsheets GUI中演示了结果。

图13.从数据库结果集中生成的Google电子表格
从图12中的数据库结果集中生成的Google电子表格的屏幕截图

结论

Google Spreadsheets Data API使您可以通过PHP应用程序修改Google Spreadsheets云中的数据。 支持所有常见任务,例如添加,修改和删除工作表,行和单元格,并且可以使用Zend_Gdata来执行。 本文提供了所有这些任务的示例,以及两个示例应用程序:RSS提要的电子表格导入器和数据库查询结果。

如这些示例所示,Google Spreadsheets Data API是一款功能强大且灵活的工具,适用于希望在云中围绕电子表格数据构建富有创意的新应用程序的开发人员。 数据API目前正在开发中,因此希望将来有更多有趣的补充。


翻译自: https://www.ibm.com/developerworks/xml/library/x-googledata2/index.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值