如何从PHP生成包含多个工作表的Excel文档?

如何从PHP生成包含多个工作表的Excel文档?,php,spreadsheet,Php,Spreadsheet,我想从PHP生成一个MS Excel文件。我知道一个人可以做这样的事情: header ( "Content-type: application/vnd.ms-excel" ); header ( "Content-Disposition: attachment; filename=foo_bar.xls" ); 但它将生成一个只包含一张图纸的文件。我想要的是生成一个包含多张图纸的文件。我该怎么做?也许有第三方库,但我没有找到太多。试试看。这是一个创建包含两张工作表的Excel文件的简单示例:

我想从PHP生成一个MS Excel文件。我知道一个人可以做这样的事情:

header ( "Content-type: application/vnd.ms-excel" );
header ( "Content-Disposition: attachment; filename=foo_bar.xls" );
但它将生成一个只包含一张图纸的文件。我想要的是生成一个包含多张图纸的文件。我该怎么做?也许有第三方库,但我没有找到太多。

试试看。这是一个创建包含两张工作表的Excel文件的简单示例:

<?php
require_once 'PHPExcel.php';
require_once 'PHPExcel/IOFactory.php';

// Create new PHPExcel object
$objPHPExcel = new PHPExcel();

// Create a first sheet, representing sales data
$objPHPExcel->setActiveSheetIndex(0);
$objPHPExcel->getActiveSheet()->setCellValue('A1', 'Something');

// Rename sheet
$objPHPExcel->getActiveSheet()->setTitle('Name of Sheet 1');

// Create a new worksheet, after the default sheet
$objPHPExcel->createSheet();

// Add some data to the second sheet, resembling some different data types
$objPHPExcel->setActiveSheetIndex(1);
$objPHPExcel->getActiveSheet()->setCellValue('A1', 'More data');

// Rename 2nd sheet
$objPHPExcel->getActiveSheet()->setTitle('Second sheet');

// Redirect output to a client’s web browser (Excel5)
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="name_of_file.xls"');
header('Cache-Control: max-age=0');
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
$objWriter->save('php://output');

如果你想让你的PHP脚本创建一个Excel文件,在任何工作表上写一些东西,然后提供给客户端下载,你可以使用PHP内置的COM扩展。请参阅:有关各种示例。但是,您需要在服务器上安装Excel(或类似OpenOffice的克隆)。如果你不这样做,也许马克·贝克上面的答案在没有它的情况下会起作用。


 <?php 
  require_once 'PHPExcel.php';
  require_once 'PHPExcel/IOFactory.php';
  //Update the multiple sheets in PHP excel
 $report_file = 'Report_' . date('Y-m-d') . '.xlsx';
 $report_file_exists  = 0;
 //If the file doesnot exist , create new otherwise append the data at last
 if (!file_exists($report_file)) {
      $objPHPExcel = new PHPExcel();
 } else {
      $report_file_exists = 1;
      $objPHPExcel = PHPExcel_IOFactory::load($report_file);
 }

 $columns = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z');

 //Sheet details
 $sheet_details = array(
                        //1st sheet details
                        0 => array('sheet_title' => 'Products', 
                                   'sheet_heading' => array('Article_Number','Name'),
                                   'sheet_data' => array('1234','Pen')
                                   ),
                        //2nd Sheet Details
                        1 => array('sheet_title' => 'Categories',
                                   'sheet_heading' => array('Category Id','Name'),
                                   'sheet_data' => array(123,'Accessories')
                                  )
                   );

 $sheet_count = 0;
 $row = 1;
 $column = 0;
 while ($sheet_count <= count($sheet_details)) {
      $objWorkSheet = '';
      if ($report_file_exists == 0) {
           if ($sheet_count > 0) {
                $objWorkSheet = $objPHPExcel->createSheet($sheet_count);
           } else {
                $objWorkSheet = $objPHPExcel->getActiveSheet();
           }
           $row = 1;
           $column = 0;
           foreach ($sheet_details[$sheet_count]['sheet_heading'] as $head) {
                $objWorkSheet->setCellValue($columns[$column] . $row, $head);
                $column++;
           }
      } else {
           $objPHPExcel->setActiveSheetIndex($sheet_count);
           $objWorkSheet = $objPHPExcel->getActiveSheet($sheet_count);
      }

      $row = $objWorkSheet->getHighestRow() + 1; //row count
      foreach ($sheet_details[$sheet_count]['sheet_data'] as $report_details) {
           $column = 0;
           foreach ($report_details as $data) {
                $objWorkSheet->setCellValue($columns[$column] . $row, $data);
                $column++;
           }
           $row++;
      }

      $objWorkSheet->setTitle($sheet_details[$sheet_count]['sheet_title']);
      $sheet_count++;
 }

 $objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel);

 $objWriter->save($report_file);
 ?>

您可以通过以下方式实现此目的

 $objPHPExcel = new PHPExcel();
 $objPHPExcel->getProperties()->setCreator("creater");
 $objPHPExcel->getProperties()->setLastModifiedBy("Middle field");
 $objPHPExcel->getProperties()->setSubject("Subject");
 $objWorkSheet = $objPHPExcel->createSheet();
 $work_sheet_count=3//number of sheets you want to create
 $work_sheet=0;
 while($work_sheet<=$work_sheet_count){ 
     if($work_sheet==0){
         $objWorkSheet->setTitle("Worksheet$work_sheet");
         $objPHPExcel->setActiveSheetIndex($work_sheet)->setCellValue('A1', 'SR No. In sheet 1')->getStyle('A1')->getFont()->setBold(true);
         $objPHPExcel->setActiveSheetIndex($work_sheet)->setCellValueByColumnAndRow($col++, $row++, $i++);//setting value by column and row indexes if needed
     }
     if($work_sheet==1){
         $objWorkSheet->setTitle("Worksheet$work_sheet");
         $objPHPExcel->setActiveSheetIndex($work_sheet)->setCellValue('A1', 'SR No. In sheet 2')->getStyle('A1')->getFont()->setBold(true);
         $objPHPExcel->setActiveSheetIndex($work_sheet)->setCellValueByColumnAndRow($col++, $row++, $i++);//setting value by column and row indexes if needed
     }
     if($work_sheet==2){
         $objWorkSheet = $objPHPExcel->createSheet($work_sheet_count);
         $objWorkSheet->setTitle("Worksheet$work_sheet");
         $objPHPExcel->setActiveSheetIndex($work_sheet)->setCellValue('A1', 'SR No. In sheet 3')->getStyle('A1')->getFont()->setBold(true);
         $objPHPExcel->setActiveSheetIndex($work_sheet)->setCellValueByColumnAndRow($col++, $row++, $i++);//setting value by column and row indexes if needed
     }
     $work_sheet++;
 }

只是你问题措辞上的一个小注释;你说你已经用一张纸生成了一个文件,但是你上面发布的代码没有生成任何东西,它只设置了一个已经存在的文件的下载。您是否已经有一个名为foo_bar.xls的文件?或者,是否缺少只使用一张工作表生成文件的代码。@lucideer我只是想说明我知道如何生成XLS文件。只是为了避免回答那些建议我做我已经做过的事情。当然,生成文件的代码是完整的;我只是展示了它的一个片段。只是想澄清一下,我相信OP的意思是,他可以流式传输CSV文件,但有那些标题,它将作为XLS文件被大多数浏览器处理。(我以前这样做过)他不知道接受的答案中的PHPExcel类型方法。我不相信OpenOffice支持COM,我认为这仅限于一系列MS应用程序,这确实将此选项限制在Windows服务器上。COM非常强大,效率也很高,但遗憾的是并不好documented@Mark贝克:OpenOffice支持COM。请看:谢谢你的指点,这是非常有用的知道。。。我得玩一下它。在其他操作系统(XPCOM、CORBA)上模仿COM是可能的,但它看起来非常复杂,而且不知道PHP是否能够与这些操作系统一起工作。我相信你也可以用葡萄酒来伪装。OSX()应该开箱即用。忘了提一下:我再也找不到PHP手册上的引文了,但它建议不要在服务器上使用COM。这是个好建议。如果客户端正在访问同一个Excel文件,则可能发生损坏。如果出现弹出提示,如“您确定要执行此操作吗?”,则请求将挂起,希望服务器本身单击“确定”。感谢您在示例中进行编辑。希望你发现这个库很容易使用这个库非常棒。。。事实上,我想捐一笔钱。谢谢分享@Christian-我确实对共享感兴趣:我是主要作者之一:-)@Vimal-用于在服务器上存储:删除行设置标题,并替换'php://output'在调用save()时使用您选择的文件路径/文件名。。。。如果要告诉浏览器如果下载给用户,文件应该存储在哪里,请忘记它-浏览器不是这样工作的,您无法控制用户选择在自己的PC上存储文件的位置您好,我很感谢您的回答,但是在第行
$objPHPExcel->getActiveSheet()->setCellValue('A1','Something')它写在第一列和第一行,我有动态行和列,我想写。它取决于数据库中的数据。所以请解释一下或者让我知道它的文档。
        $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
        $objWriter->save('php://output');