English 中文(简体)
无法通过Zend Framework导出到excel 2010学生版
原标题:Cant export to excel 2010 student edition via Zend Framework

我正试图将数据导出到ms-excel,我的应用程序有Office 2010学生版,请关注Pablo Viquez的帖子http://www.pabloviquez.com/2009/08/export-excel-spreadsheets-using-zend-framework/

然而,我无法让它工作,发生了以下情况

1.在地址栏中输入reports/report/todaysappointmentsreport/format/excel时,工作簿会尝试另存为excel.xls

2.当我打开文件时,Excel会向我发出以下警告:您试图打开的文件Excel.xls的格式与文件扩展名指定的格式不同,请在打开文件之前验证该文件是否已损坏,并且来源可靠。

  1. On opening the file all that is shown is the code in my todaysappointmentsreport.export.phtml file

有人能告诉我哪里出了问题吗,因为我需要让它发挥作用。

我可以验证查询是否有效,并且数据是否显示在屏幕上我的todayappointmentsreport.phtml文件中。我还可以验证该组件是否与它所依赖的OLE组件一起安装在pear中。

我的控制器代码

class Reports_ReportController extends Zend_Controller_Action 
 { 
  public function init() 
  { 

       // Excel format context 
            $excelConfig = 
            array( excel  => array 
                                            ( suffix   =>  excel , 
                                                     headers  => array( 
                                                                                     Content-type  =>  application/vnd.ms-excel )), 
            ); 

       //initalise context switch 
       $contextSwitch = $this->_helper->contextSwitch(); 

       // Add the new context 
            $contextSwitch->setContexts($excelConfig); 



            // Set the new context to the reports action 
            $contextSwitch->addActionContext( todaysappointmentsreport ,  excel ); 

            $contextSwitch->initContext(); 

} 

 // action to redirect user straight to login page 
 public function preDispatch() 
 { 
   // set admin layout 
  // check if user is authenticated 
  // if not, redirect to login page 
  $url = $this->getRequest()->getRequestUri();           
  if (!Zend_Auth::getInstance()->hasIdentity()) { 
  $session = new Zend_Session_Namespace( petmanager.auth ); 
  $session->requestURL = $url; 
  $this->_redirect( /login ); 
 } 
    } 

 // report to print todays appointments 
 public function todaysappointmentsreportAction() 
 { 
     $t=date( y-m-d ); 
            $q = Doctrine_Query::create()   
                    ->from( PetManager_Model_Groomappointments g ) 
        ->leftJoin( g.PetManager_Model_Clients c ) 
                    ->leftJoin( g.PetManager_Model_Pets p ) 
                    ->leftJoin( g.PetManager_Model_Users u ) 
                    ->leftJoin( g.PetManager_Model_Groomservices s ) 
                    ->leftJoin( s.PetManager_Model_Groomprocedures r ) 
                    ->where( g.gapmtStatus = 1 AND g.gapmtDate = ? ,$t) 
                    ->orderBy( g.gapmtSTime,g.gapmtSTime,u.name ); 
                     $result = $q->fetchArray(); 
                     if (count($result) >= 1) { 
                     $this -> view -> records = $result;             
                     } 

}   

正如我所说,这是我打开excel文件时出现在excel文件中的内容。

 // Change error reporting for compatibility 
 // Spreadsheet Excel Writter was built using PHP4, 
 // so there s a lot of DEPRECATED notices 
   error_reporting(E_ERROR | E_WARNING | E_PARSE); 

 /** 
 * PEAR package 
 * 
 * @link http://pear.php.net/package/Spreadsheet_Excel_Writer
 * @see PEAR/Spreadsheet/Excel/Writer.php 
 */ 
 require_once  Spreadsheet/Excel/Writer.php ; 

 // Lets define some custom colors codes 
 define( CUSTOM_DARK_BLUE , 20); 
 define( CUSTOM_BLUE , 21); 
 define( CUSTOM_LIGHT_BLUE , 22); 
 define( CUSTOM_YELLOW , 23); 
 define( CUSTOM_GREEN , 24); 

// First, we create a Workbook 
$workbook = new Spreadsheet_Excel_Writer(); 

 // Add one sheet, called: Users Report 
 $worksheet = &$workbook->addWorksheet( Todays Grooming Appointments Report ); 

 // Create the custom colors on our new workbook 
 // This function takes 4 params: 
 //    - Code index [1 to 64] 
 //    - RGB colors (0-255) 
  $workbook->setCustomColor(CUSTOM_DARK_BLUE, 31, 73, 125); 
  $workbook->setCustomColor(CUSTOM_BLUE, 0, 112, 192); 
  $workbook->setCustomColor(CUSTOM_LIGHT_BLUE, 184, 204, 228);  
  $workbook->setCustomColor(CUSTOM_YELLOW, 255, 192, 0); 
  $workbook->setCustomColor(CUSTOM_GREEN, 0, 176, 80); 

  // Lets hide gridlines 
  //$worksheet->hideScreenGridlines(); 

  // Lets create some custom styles 
  $formatHeader = &$workbook->addFormat(); 
  $formatHeader = 
  &$workbook->addFormat( 
    array( Size     => 16, 
           VAlign   =>  vcenter , 
           HAlign   =>  center , 
           Bold     => 1, 
           Color    =>  white , 
           FgColor  => CUSTOM_DARK_BLUE)); 

   $formatReportHeader = 
   &$workbook->addFormat( 
    array( Size      => 9, 
           VAlign    =>  bottom , 
           HAlign    =>  center , 
           Bold      => 1, 
           FgColor   => CUSTOM_LIGHT_BLUE, 
           TextWrap  => true)); 

   $formatData = 
    &$workbook->addFormat( 
      array( 
         Size    => 8, 
         HAlign  =>  center , 
         VAlign  =>  vcenter )); 

   /** 
   * First, format the worksheet, adding the headers 
   * and row/columns custom sizes 
   */ 

   // Create a nice header with a dark blue background 
   // The function setRow takes 3 parameters: 
   //    - row index 
   //    - row height 
   //    - Format to apply to row [Optional] 
   $worksheet->setRow(0, 11, $formatHeader); 
   $worksheet->setRow(1, 46, $formatHeader); 
   $worksheet->setRow(2, 11, $formatHeader); 
   $worksheet->setRow(3, 11, $formatHeader); 
   $worksheet->setRow(4, 11, $formatHeader); 

// Set the size of the columns 
// The function setColumn takes 5 params: 
//     - First column 
//     - Last column 
//     - Column Width 
//     - Format [Optional, default = 0] 
//     - Hidden [Optional, default = 0] 
 $worksheet->setColumn(0, 0, 7); //  shrink it to 7 
 $worksheet->setColumn(1, 1, 12); // set the width to 12 
 $worksheet->setColumn(1, 1, 15); // set the width to 15 
 $worksheet->setColumn(1, 1, 15); // set the width to 15 
 $worksheet->setColumn(1, 1, 15); // set the width to 15 

/** 
* 
* Once we have the format ready, add the text to the spreadsheet 
* 
*/ 
// Write a text header 
$worksheet->write(1, 1,  Todays Grooming Appointments Report , $formatHeader); 

 // Create the header for the data starting @ row 6
 $indexCol = 0; 
 $indexRow = 6; 
 $worksheet->write($indexRow, $indexCol++,  Scheduled Time , $formatReportHeader); 
 $worksheet->write($indexRow, $indexCol++,  Client , $formatReportHeader); 
 $worksheet->write($indexRow, $indexCol++,  Pet , $formatReportHeader); 
 $worksheet->write($indexRow, $indexCol++,  Procedure , $formatReportHeader); 
 $worksheet->write($indexRow, $indexCol++,  Groomer , $formatReportHeader); 

 $indexRow++;   // Advance to the next row 
 $indexCol = 0; // Start @ column 0 

 // Print the report data 
 if(count($this->records) == 0) { 
  // No data 
  $worksheet->write( 
    $indexRow, 
    $indexCol, 
     No Appointments , 
    $formatData); 

 } else { 
  // Write the data 
   foreach ($this->records as $r) { 
    $worksheet->write( 
        $indexRow, 
        $indexCol++, 
        $this->$r[ gapmtSTime ] - $this->substr$r[ gapmtETime ], 
        $formatData); 

    $worksheet->write( 
        $indexRow, 
        $indexCol++, 
        $this->$r[ PetManager_Model_Clients ][ firstName ] $this->$r [ PetManager_Model_Clients ][ lastName ], 
        $formatData); 

    $worksheet->write( 
        $indexRow, 
        $indexCol++, 
        $this->$r[ PetManager_Model_Pets ][ name ], 
        $formatData); 

        $worksheet->write( 
        $indexRow, 
        $indexCol++, 
        $this->$r[ PetManager_Model_Groomservices ][ PetManager_Model_Groomprocedures ][ groomprocedure ], 
        $formatData); 

            $worksheet->write( 
        $indexRow, 
        $indexCol++, 
        $this->$r[ PetManager_Model_Users ][ name ], 
        $formatData);   

    // Advance to the next row 
     $indexRow++; 
  } 
 } 

 /** 
 * 
 * Response with the excel file 
 * 
 */ 

 // Sends HTTP headers for the Excel file. 
 $workbook->send( todaysappointmentsreport.xls ); 

// Calls finalization methods. 
// This method should always be the last one to be called on every workbook 
$workbook->close();
问题回答

确保您的“todyappointmentsreport.exel.phtml”视图文件的内容包含在php打开和关闭标记中。

public function indexAction()
{
    $this->filename = "/excel-" . date( "m-d-Y" ) . "-".mt_rand(10000,20000).".xls";

    $realPath = realpath($this->filename);
    if (false === $realPath )
    {
        touch($this->filename);
        chmod($this->filename, 0777); 
    }

    $this->filename = realpath( $this->filename );
    $this->handle = fopen( $this->filename, "w" );

    $projectsModul = new Model_DbTable_Projects();
    $projects = $projectsModul->fetchProjects();

    foreach ($projects->toArray() as $row)
    {
        $this->finalData[] = array(
            $row[ id ],
            $row[ company ],
            $row[ project ],
            $row[ start ],
            $row[ end ]
        );
    }

    foreach ( $this->finalData AS $finalRow )
    {
        fputcsv( $this->handle, $finalRow, "	" );
    }

    fclose( $this->handle );

    $this->_helper->layout->disableLayout();
    $this->_helper->viewRenderer->setNoRender();

    $this->getResponse()->setRawHeader( "Content-Type: application/vnd.ms-excel; charset=UTF-8")
        ->setRawHeader("Content-Disposition: attachment; filename=excel.xls")
        ->setRawHeader("Content-Transfer-Encoding: binary")
        ->setRawHeader("Expires: 0")
        ->setRawHeader("Cache-Control: must-revalidate, post-check=0, pre-check=0")
        ->setRawHeader("Pragma: public")
        ->setRawHeader("Content-Length: " . filesize($this->filename))
        ->sendResponse();

    readfile($this->filename); 
    exit();
}

我正在为我自己的项目做一个类似的例子,所以如果我发现了一个解决方案,我会用任何结果更新这个线程。

这里有一篇关于contextSwitch视图助手的有用文章(maltblue),它更深入地解释了这个助手。

上下文切换视图助手

最后,我把标题直接放在控制器操作中,成功地导出到csv-ok,如下所示。

在我的行动中。。。

//create the csv file header and filename based on the action name
    $actionName = $this->getRequest()->getActionName();
    new Admin_Model_Resource_csvFileHeader( $actionName );

此处的其余代码用于获取要传递到视图文件的数据。。。

管理模型资源如下所示,因此任何控制器都可以使用它。。。

class Admin_Model_Resource_csvFileHeader

{

private $_csvFileNameFromAction = null;

/**
 * Create the first part of the csv file name from the action name
 * @param <string> $actionName - name of the controller action for the report
 */
public function __construct( $actionName )
{
    $this->_csvFileNameFromAction = $actionName;
    $this->generateCsvHeader();
}

/**
 * Method is called direct from the constructor
 * to centralise and make consistent the csv file header
 * so it maximises code re-use
 * @return null - just generate the csv header
 */
public function generateCsvHeader()
{
    $dateSuffix = date( d-m-Y , time());
    $csvFileName = $this->_csvFileNameFromAction. _ .$dateSuffix;

    header( Content-Type: text/x-csv; name=" .$csvFileName. .csv" );
    header( Content-Disposition: inline; filename=" .$csvFileName. .csv" );
    header( Pragma: public );
    header( Last-Modified:  .gmdate( D, d M Y H:i:s ) .   GMT );
    header( Cache-Control: no-store, no-cache, must-revalidate );
    header( Cache-Control: pre-check=0, post-check=0, max-age=0 );
    header( Content-Transfer-Encoding: none );
}

}





相关问题
Zend 邮件问题,涉及外国char子+ com子

泽斯德邮局在名称被定为具有外国性质(如“保”)和 com(”)的物品时,就放弃了一种例外(因为邮局(邮局)退回假)。 重新提出以下守则。

PHP Framework: Ebay Like Site

I am going to be builiding a site like ebay - with all the features of ebay. Please note my payment method is limited to paypal. What would be the best PHP framework to use to build this quickly, ...

Link to a specific step in onepage checkout

Is it possible to redirect the browser to nth step in the onepage checkout? If so, how would one go about doing it? I m working on a payment module and have a sort of "cancel" action that i would ...

Tagging with Zend Framework

I m trying to create the same solutions as below, but using a simple MySQL query (instead of the static version used below where the words/tags are implemented in the code). The name of the MySQL ...

dynamicaly adding textboxes to zend_form

I hope that this is a quick question to answer. I am developing a form using Zend_Form, I have a number of Zend_Dojo_Form_Element_Textboxs to add to this form dynamically. These are added from rows ...

热门标签