无法通过Zend Framework导出到excel 2010学生版

时间:2011-06-01 22:19:29

标签: zend-framework

我正在尝试将数据导出到ms excel,我按照Pablo Viquez的帖子http://www.pabloviquez.com/2009/08/export-excel-spreadsheets-using-zend-framework/为我的应用程序提供了Office 2010学生版。

然而,我无法让它发挥以下作用

1.输入reports / report / todaysappointmentsreport / format / excel到地址栏,工作簿尝试保存为excel.xls

2.当我打开文件时,Excel给出了以下警告:您尝试打开的文件“excel.xls”的格式与文件扩展名指定的格式不同,验证文件是否已损坏且来自打开文件之前的可信来源。

  1. 在打开文件时,所有显示的内容都是我的todaysappointmentsreport.export.phtml文件中的代码
  2. 任何人都可以告诉我哪里出错了,因为我需要让它工作。

    我可以验证查询是否有效,并且数据显示在屏幕上的todaysappointmentsreport.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;             
                         } 
    
    }   
    

    我今天的appointmentsreport.excel.phtml代码正如我所说的那样,这是我打开它时出现在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();
    

3 个答案:

答案 0 :(得分:1)

确保“todaysappointmentsreport.excel.phtml”视图文件的内容包含在php开始和结束标记中。

答案 1 :(得分:1)

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, "\t" );
    }

    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();
}

答案 2 :(得分:0)

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

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

contextswitch view helper

我最终通过将标题直接放在控制器操作中设法导出到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');
}

}