我的建议是使用 PHPExcel。
这是我所做的:
我将 PHPExcel 文件下载到 Vendor 文件夹中。
我现在的结构是:
app
|---Vendor
|----- PHPExcel
|----PHPExcel
|----PHPExcel.php
出于我自己的原因,我需要对 PHPExcel 进行自己的分叉更改。因此,我下载了一个副本,而不是使用来自存储库的最新版本以及 git submodules 或 composer 之类的包管理解决方案。随意使用这些。
然后我在我的 cakephp 应用程序中编写了我自己的 Lib 代码。
app
|---Lib
|----- Print
|----Excel
|----SomeExcel.php
|----AnotherExcel.php
我写了两个类SomeExcel
,AnotherExcel
因为我需要生成两个不同的 excel 文件。
在里面SomeExcel
我写了这样的东西:
require_once(APP . DS . 'Vendor' . DS . 'PHPExcel' . DS . 'PHPExcel.php');
class SomeExcel {
private $yourOwnPrivateProperty;
private $objPHPExcel;
public function __construct($data) {
$this->objPHPExcel = new PHPExcel();
$this->objPHPExcel->writeDebugLog = true;
$this->_createFilename();
}
public function create() {
// you have to study PHPExcel yourself and write this
$this->_setFileProperties();
// you have to study PHPExcel and write whatever you want
$this->_createSheets();
$result = $this->_save();
if ($result) {
return $this->_getAttachmentFormat();
} else {
return $result;
}
}
protected function _save() {
$objWriter = PHPExcel_IOFactory::createWriter($this->objPHPExcel, 'Excel2007');
/* I will create the folder inside the webroot outputfiles folder
* in case it does not exist.
* I am not going to provide it here as it is not relevant to the question.
* You need to write your own.
*/
$this->_createFolder();
try {
$objWriter->save($this->outputPath . $this->filename);
} catch (Exception $e) {
return false;
}
return true;
}
protected function _getAttachmentFormat() {
return array(
$this->filename => array(
'file' => $this->outputPath . $this->filename,
'mimetype' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
'contentId' => 'excelfile-for-something'
)
);
}
AnotherExcel
类是类似的。
通常它是触发 Excel 文件生成的控制器操作。但是,为了遵守这个FatModel-ThinController
原则,我有一个模型方法来做到这一点。
所以我有一个这样的控制器动作:
/**
* print_to_excel method (testing only)
*
* @return void
*/
public function print_to_excel($id = null) {
set_time_limit(120);
$result = $this->SomeModel->printExcel($id);
if (is_array($result)){
$filename = key($result);
$this->redirect('/outputfiles/Excel/' . $id . '/' . $filename);
}
}
在我的 SomeModel 中,我有以下内容:
/**
*
* print excel file for said Quotation
*
* @param $id Quotation id
* @throws NotExistException
* @return boolean Return true if successful
*/
public function printExcel($id = null) {
if (!$this->exists($id)) {
throw new NotFoundException(__('Invalid whatever'));
}
$data = $this->find('first', array(
'conditions' => array('SomeModel.id' => $id),
));
// do whatever you need to get the data you want printed in the Excel
App::uses('SomeExcel', 'Lib/Print/Excel');
$someExcel = new SomeExcel($data);
return $someExcel->create();
}
这是我使用 Excel 和 CakePHP 的方式
这是一种方式,但不是唯一的方式。
我也很自豪地告诉你,这是我为一家大型电信公司编写的企业应用程序所使用的确切代码,用于完成他们自己的内部数字文书工作。
该公司至少有 10 人使用它。