您的位置:首页 > 编程语言 > PHP开发

phpExcel的使用

2018-02-24 11:05 148 查看
phpExcel的使用、示例及注意事项:
标签: phpexcel示例excel含图片导出excel导入tpPDF生成

-------------导出------------------------------------------------
导出excel主要有以下几个步骤:
    加载PhpExcel核心文件
    创建一个excel
    设置excel属性
    导出excel
    结束
以下是以thinkphp5框架为例: 
步骤一:下载phpexcel压缩包,地址:https://github.com/PHPOffice/PHPExcel/tree/1.8,该压缩包中有一些示例可以参考,基本涵盖所有情况导出示例。在Examples文件夹中。将压缩包中Classes文件里边的所有文件复制到tp中extend目录下,并将PHPExcel.php文件改名为PHPExcel.class.php,如下图:


步骤二:在控制器中写个方法。以下是实现excel导出最简单的示例代码:
<?php
namespace app\index\controller;

use think\Db;

class Index
{
//文件导出
public function index()
{
//获取你要导出的数据,你要获取的到数据库的数据
$data = Db::name("user")->field("id,username,password,img")->order("id DESC")
->limit(520)->select();

//设置要导出excel的表头
$fileheader= array('ID', '用户名', '密码', '图片');
$this->exportExcel($data,'测试',$fileheader,'Sheet1');
}

/**
* 导出excel
* @param array $data 导入数据
* @param string $savefile 导出excel文件名
* @param array $fileheader excel的表头
* @param string $sheetname sheet的标题名
*/
public function exportExcel($data, $savefile, $fileheader, $sheetname){
//引入phpexcel核心文件,不是tp,你也可以用include(‘文件路径’)来引入
include ROOT_PATH."extend".DS."PHPExcel".DS."PHPExcel.class.php";
include ROOT_PATH."extend".DS."PHPExcel/PHPExcel/Reader/Excel2007.php";

//new一个PHPExcel类,或者说创建一个excel,tp中“\”不能掉
$excel = new \PHPExcel();
if (is_null($savefile)) {
$savefile = time();
}else{
//防止中文命名,下载时ie9及其他情况下的文件名称乱码
iconv('UTF-8', 'GB2312', $savefile);
}
//设置excel属性
$objActSheet = $excel->getActiveSheet();
//根据有生成的excel多少列,$letter长度要大于等于这个值
$letter = array('A','B','C','D','E','F','F','G');
//设置当前的sheet
$excel->setActiveSheetIndex(0);
//设置sheet的name
$objActSheet->setTitle($sheetname);
//设置表头
for($i = 0;$i < count($fileheader);$i++) {

//设置表头值,setCellValue第二个参数不能使用iconv,否则excel中显示false
$objActSheet->setCellValue("$letter[$i]1",$fileheader[$i]);
//设置表头字体样式
$objActSheet->getStyle("$letter[$i]1")->getFont()->setName('微软雅黑');
//设置表头字体大小
$objActSheet->getStyle("$letter[$i]1")->getFont()->setSize(12);
//设置表头字体是否加粗
$objActSheet->getStyle("$letter[$i]1")->getFont()->setBold(true);
//设置表头文字垂直居中
$objActSheet->getStyle("$letter[$i]1")
->getAlignment()
->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
//设置文字上下居中
$objActSheet->getStyle($letter[$i])
->getAlignment()
->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER);
//设置表头外的文字垂直居中
$excel->setActiveSheetIndex(0)
->getStyle($letter[$i])
->getAlignment()
->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
}
//单独设置D列宽度为15
$objActSheet->getColumnDimension('D')->setWidth(15);

//这里$i初始值设置为2,$j初始值设置为0,自己体会原因
for ($i = 2;$i <= count($data) + 1;$i++) {
$j = 0;
foreach ($data[$i - 2] as $key=>$value) {
//不是图片时将数据加入到excel,这里数据库存的图片字段是img
if($key != 'img'){
$objActSheet->setCellValue("$letter[$j]$i",$value);
}
//是图片是加入图片到excel
if($key == 'img'){
if($value != ''){
//防止中文命名的文件
$value = iconv("UTF-8","GB2312",$value);
// 图片生成
$objDrawing[$key] = new \PHPExcel_Worksheet_Drawing();
// 图片地址
$objDrawing[$key]->setPath('.\Uploads'.$value);
// 设置图片宽度高度
$objDrawing[$key]->setHeight('80px'); //照片高度
$objDrawing[$key]->setWidth('80px'); //照片宽度
// 设置图片要插入的单元格
$objDrawing[$key]->setCoordinates('D'.$i);
// 图片偏移距离
$objDrawing[$key]->setOffsetX(12);
$objDrawing[$key]->setOffsetY(12);
//$objDrawing[$key]->getShadow()->setVisible(true);
//$objDrawing[$key]->getShadow()->setDirection(50);
$objDrawing[$key]->setWorksheet($objActSheet);
}
}
$j++;
}
//设置单元格高度,暂时没有找到统一设置高度方法
$objActSheet->getRowDimension($i)->setRowHeight('80px');
}
header('Content-Type: application/vnd.ms-excel');
//下载的excel文件名称,为Excel5,后缀为xls,不过影响似乎不大
header('Content-Disposition: attachment;filename="' . $savefile . '.xlsx"');
header('Cache-Control: max-age=0');

// 用户下载excel
$objWriter = \PHPExcel_IOFactory::createWriter($excel, 'Excel2007');
$objWriter->save('php://output');
// 保存excel在服务器上
//$objWriter = new PHPExcel_Writer_Excel2007($excel);
//或者$objWriter = new PHPExcel_Writer_Excel5($excel);
//$objWriter->save("保存的文件地址/".$savefile);
}
}
代码说明:代码中exportExcel方法,可以根据自己实际需求,更改代码 
导出注意事项: 
1、数字导出时,第一个数字为0时,会被省略。将其以字符串格式导出即可,处理办法可以在该字段后加空格即可,导出显示是伪科学计算法导出也可以使用该办法,例如$data['num'] = $data['num'].' '。 
2、图片导出时,若出现图片导出有问题,可能是中文命名情况,可以用iconv对图片名先做处理。 
3、在从数据库中取数据,数据是要导入到excel中显示的,有中文时不要用iconv,否则excel中显示都是false 
4、下载的文件命名最好使用iconv处理下,因为可能会有浏览器兼容性问题导致下载的文件命名乱码而导致里边数据也是乱码的。 
5、如果下载的excel打开时乱码,在header() 前面加上ob_end_clean() 函数, 清除缓冲区, 这样就不会乱码了! 
ob_end_clean();//清除缓冲区,避免乱码 
header(‘Content-Type: application/vnd.ms-excel’);

------------------------------------------------------------导入-----------------------------------------------------------

导入excel主要有以下几个步骤:
    上传excel文件到服务器
    检查excel是否符合要求
    取出excel中的数据
    导入数据库
    是否做删除excel处理
    结束

以下是以thinkphp框架为例: 
步骤一: 与上边导出一样 
步骤二: 在控制器中写个方法。以下是实现excel导入最简单的示例代码:
前端视图代码:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<form enctype="multipart/form-data" action="{:url('daoru/uploadExcel')}"
method="post">
<input type="file" name="file"><br/>
<input type="submit" value="提交">
</form>
</body>
</html>
控制器代码:
<?php
namespace app\index\controller;

use think\Controller;
use think\Db;

class Daoru extends Controller
{
public function index(){
return $this->fetch();
}

//文件上传
public function upload(){
// 获取表单上传文件 例如上传了001.jpg
$file = request()->file('image');

// 移动到框架应用根目录/public/uploads/ 目录下
if($file){
$info = $file->move(ROOT_PATH . 'public' . DS . 'uploads');
if($info){
// 成功上传后 获取上传信息
// 输出 jpg
echo $info->getExtension();
// 输出 20160820/42a79759f284b767dfcb2a0197904287.jpg
echo $info->getSaveName();
// 输出 42a79759f284b767dfcb2a0197904287.jpg
echo $info->getFilename();
}else{
// 上传失败获取错误信息
echo $file->getError();
}
}
}

//上传excel文件,非tp框架可以使用move_uploaded_file写文件上传函数
public function uploadExcel()
{
if (is_uploaded_file($_FILES['file']['tmp_name'])) {
header("Content-Type:text/html;charset=utf-8");
$file = request()->file('file');
// 移动到框架应用根目录/public/uploads/ 目录下
if($file){
$info = $file->move(ROOT_PATH . 'public' . DS . 'uploads');
$exts=$info->getExtension();
$filename = 'uploads/'.$info->getSaveName();
if (!$info) {// 上传错误提示错误信息
$this->error($file->getError());
} else {// 上传成功
$this->getExcelData($filename, $exts);
}

}
}
}

//取出excel中的数据
protected function getExcelData($filename, $exts)
{
//导入PHPExcel类库
include ROOT_PATH."extend".DS."PHPExcel".DS."PHPExcel.class.php";
//        import("Org.Util.PHPExcel");
//不同类型的文件导入不同的类
if ($exts == 'xls') {
//            import("Org.Util.PHPExcel.Reader.Excel5");
include ROOT_PATH."extend".DS."PHPExcel/PHPExcel/Reader/Excel5.php";
$PHPReader = new \PHPExcel_Reader_Excel5();
} else if ($exts == 'xlsx') {
include ROOT_PATH."extend".DS."PHPExcel/PHPExcel/Reader/Excel2007.php";
//            import("Org.Util.PHPExcel.Reader.Excel2007");
$PHPReader = new \PHPExcel_Reader_Excel2007();
}
//载入文件
$PHPExcel = $PHPReader->load($filename);
//获取表中的第一个工作表,如果要获取第二个,把0改为1,依次类推
$currentSheet = $PHPExcel->getSheet(0);
//获取总列数
$allColumn = $currentSheet->getHighestColumn();
//获取总行数
$allRow = $currentSheet->getHighestRow();
//循环获取表中的数据,$currentRow表示当前行
for ($currentRow = 1; $currentRow <= $allRow; $currentRow++) {
//从哪列开始,A表示第一列
for ($currentColumn='A';$currentColumn<=$allColumn;$currentColumn++){
//数据坐标
$address = $currentColumn . $currentRow;
//读取到的数据,保存到数组$arr中
$data[$currentRow][$currentColumn] = $currentSheet
->getCell($address)
->getValue();
}
}
@unlink($filename); //删除上传的文件
$this->importData($data);
}

//保存数据到数据库
public function importData($data)
{

//检测模版是否标准
$title = array(
'A' => 'ID',
'B' => '用户名',
'C'=>'密码',
'D'=>'图片',
);
if ($title != $data[1]) {
$this->error('您的模版不正确,请下载标准模版');
}
foreach ($data as $k => $v) {
if ($k > 1) {
//                $dataList[$k - 2]['id'] = $v['A'];
$dataList[$k - 2]['username'] = $v['B'];
$dataList[$k - 2]['password'] = $v['C'];
$dataList[$k - 2]['img'] = $v['D'];
}
}
//        var_dump($dataList);die;

//批量导入数组键名必须从0开始
$result = Db::name('user')->insertAll($dataList);
if ($result) {
$this->success('用户导入成功');
} else {
$this->error('用户导入失败');
}
}
}


-----------------------------------------------PDF生成------------------------------------------------------------

phpexcel中的例子代码,移植到tp中示例: 
步骤一: phpexcel pdf writer 包装了三个pdf渲染库,tcPDF,mPDF,DomPDF。在1.7.8以前的版本phpexcel集成了tcPDF,但是从1.7.8开始被去掉了,所以必须安装一个pdf渲染器。 
下载地址: 
tcPDF 5.9 :http://www.tcpdf.org/ PDF_RENDERER_TCPDF 
mPDF 5.4 :http://www.mpdf1.com/mpdf/ PDF_RENDERER_MPDF 
domPDF 0.6.0 :https://github.com/dompdf/dompdf PDF_RENDERER_DOMPDF 
下载地址后边对应的大写英文字母,不同的pdf渲染器对应下边代码$rendererName静态调用的方法。 
下载压缩包后解压,放在项目的某个文件下,下边代码中$rendererLibraryPath写上该对应路径。

<?php
namespace app\index\controller;

use think\Controller;

/*phpexcel pdf writer 包装了三个pdf渲染库,tcPDF,mPDF,DomPDF。
在1.7.8以前的版本phpexcel集成了tcPDF,
但是从1.7.8开始被去掉了,所以必须安装一个pdf渲染器。*/
//下载地址:
//tcPDF 5.9 :http://www.tcpdf.org/ PDF_RENDERER_TCPDF
//mPDF 5.4 :http://www.mpdf1.com/mpdf/ PDF_RENDERER_MPDF
//domPDF 0.6.0 :https://github.com/dompdf/dompdf PDF_RENDERER_DOMPDF

//下载地址后边对应的大写英文字母,
//不同的pdf渲染器对应下边代码$rendererName静态调用的方法。
//下载压缩包后解压,放在项目的某个文件下,
//下边代码中$rendererLibraryPath写上该对应路径。
class Pdf extends Controller
{
//导出pdf
public function pdfImport(){

//------------------需要引入phpExcel文件-------------------
include ROOT_PATH."extend".DS."PHPExcel".DS."PHPExcel.class.php";

//-----------------需要根据上边的文档修改对应的常量------
$rendererName = \PHPExcel_Settings::PDF_RENDERER_TCPDF;

//---------------需要修改对应的路径---------------------
$rendererLibrary = 'TCPDF-master';
$rendererLibraryPath = ROOT_PATH."extend/" . $rendererLibrary;

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

// Set document properties
$objPHPExcel->getProperties()->setCreator("Maarten Balliauw")
->setLastModifiedBy("Maarten Balliauw")
->setTitle("PDF Test Document")
->setSubject("PDF Test Document")
->setDescription("Test document for PDF, generated using PHP classes.")
->setKeywords("pdf php")
->setCategory("Test result file");

//写入行和列
$objPHPExcel->setActiveSheetIndex(0)
->setCellValue('A1', 'Hello')
->setCellValue('B1', 'world!')
->setCellValue('C1', 'Hello')
->setCellValue('D1', 'world!');
$objPHPExcel->setActiveSheetIndex(0)
->setCellValue('A4', 'Miscellaneous glyphs')
->setCellValue('A5', 'ssssssssssssss');

//设置标题
$objPHPExcel->getActiveSheet()->setTitle('Simple');
$objPHPExcel->getActiveSheet()->setShowGridLines(false);
$objPHPExcel->setActiveSheetIndex(0);

if (!\PHPExcel_Settings::setPdfRenderer(
$rendererName,
$rendererLibraryPath
)) {
die(
'NOTICE: Please set the $rendererName and $rendererLibraryPath values' .
'<br />' .
'at the top of this script as appropriate for your directory structure'
);
}
header('Content-Type: application/pdf');
header('Content-Disposition: attachment;filename="01simple.pdf"');
header('Cache-Control: max-age=0');

$objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'PDF');
$objWriter->save('php://output');
exit;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息