phpexcel导出设置样式

通过PHP和Open XML,我创建了一个可以从CSV文件自动生成电子表格的工具。我用它把银行
提供的CSV文件变得更加易于处理。希望以后银行可以提供更友好的导出选项。一些新式的
财会软件已经提供以恰当的格式导出到Excel的方法,很多人会喜欢这一点因为他们不需要
在每次下载后都手动处理这些格式。

回到代码上来说,我大学以后就没有进行过PHP的开发,然而下面的一些资源我觉得使起步
变得容易:

XAMPP http://www.apachefriends.org/en/xampp.html 一个集成的PHP环境

W3schools PHP http://www.w3schools.com/php/php_intro.asp, PHP入门教程

这是一个教你怎样用PHP处理Open XML的练习,所以我没有投入过多的精力在安全性、错误
处理和输入检查上。
PHPExcel这个包(http://www.codeplex.com/PHPExcel
)会让任务变得非常简单。附带的文档非常有用,会让你对这些类轻易上手。这儿有很多的
样例,可以方便地满足你的需求。这些例子值得你优先敲一遍,因为它们会给你怎样使用这
个包的灵感。

首先,我准备转换下面的CSV文件:
这里写图片描述
到一个格式良好的文档,包括完整的公式从而进行收支的计算,自动过滤和排序,还有一些
样式:
这里写图片描述

开始的时候我想我需要一大堆正则从CSV文件中获取到数据。然而惊喜地发现,使用
PHPExcel类会让这一切变得非常简洁。事实上,我只用了10行代码就把CSV文件转换为XSLX
文件。


<?php
/** PHPExcel_IOFactory */
include 'PHPExcel/IOFactory.php'; 

// 使文件直接从浏览器导出来
header('Content-Type: 
application/vnd.openXMLformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="myfile.xlsx"');
header('Cache-Control: max-age=0');

//-----创建一个阅读器,设置参数,读文件
$objReader = PHPExcel_IOFactory::createReader('CSV');
$objReader->setDelimiter(’,’); 
$objReader->setEnclosure('');
$objReader->setLineEnding("\r\n");
$objReader->setSheetIndex(0);
$objPHPExcel = $objReader->load('C:/SampleData.csv’');

//-----创建一个写入器,把文件输出到浏览器
$objWriter2007 = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
$objWriter2007->save('php://output');  // 从浏览器推送出文件
?>

这是上面那段很普通的代码输出结果:
这里写图片描述
上面的结果表明我们需要提供一些适当的格式。我在第一行上面添加了几行代码,设置值并
添加了些格式,从而创建了一个标题。

$objPHPExcel->getActiveSheet()->insertNewRowBefore(1, 2);//一些空行
$objPHPExcel->getActiveSheet()->setCellValue('A1', 'Transactions for the Month');
$objPHPExcel->getActiveSheet()->getStyle('A1')->getFont()->getColor()->setARGB(PHPExcel_Style_Color::COLOR_RED);
$objPHPExcel->getActiveSheet()->getStyle('A1')->getFont()->setSize(18);

标题加上后:
这里写图片描述

提示:这段代码应该添加在接下来要提到的代码后面,在写入器写入之前。加入标题会在表
格最上方加入一些新行,而这些新行会影响到后面从头到尾处理导入的数据的流程。如果时
刻注意这些额外的数据会让后面的代码处理起来变得复杂。

设置一些元数据和打印的参数也是同样简单的流程:

// 设置打印参数
$objPHPExcel->getActiveSheet()->getHeaderFooter()->setOddHeader('Summary of 
Transactions for the Month'); //Set print header
$objPHPExcel->getActiveSheet()->getPageSetup()->setOrientation(PHPExcel_Worksheet_PageSetup::ORIENTATION_LANDSCAPE); 
// 设置打印介绍

// 设置元数据

$objPHPExcel->getProperties()->setCreator("Professor X");
$objPHPExcel->getProperties()->setLastModifiedBy("Professor X");
$objPHPExcel->getProperties()->setTitle("Monthly Account Transactions");
$objPHPExcel->getProperties()->setSubject("Monthly Account Transactions");
$objPHPExcel->getProperties()->setDescription("Summary of account activity of 
the previous month.");
$objPHPExcel->getProperties()->setKeywords("money account spending");
$objPHPExcel->getProperties()->setCategory("Finance");

一个我觉得最有用的函数是 getHighestRow()
$highestRow = $objPHPExcel->getActiveSheet()->getHighestRow();

这个函数会提供当前工作的表格的最大行数。在我们需要处理所有的行或格子的时候非常有
用,当我们需要在表格特定的位置添加新行的时候也同样有用。

同样的,你可以用getHighestColumn()获取表格的列数。一个自动过滤器会给用户提供对列
进行排序和过滤的功能。你只需要传递setAutoFilter()到需要提供过滤的格子中:
// 将自动过滤器放进去
$objPHPExcel->getActiveSheet()->setAutoFilter('A1:' . 
$objPHPExcel->getActiveSheet()->getHighestColumn() . 
$objPHPExcel->getActiveSheet()->getHighestRow() );

设置列宽有两种方式。宽度可以设置为固定的数值,也可以设置为自动宽度。为了在列“A”
中设置一个标题,这一列的宽度可能会比需要的宽度要宽,我明确地将这列宽度设为18个字
符。剩下的列直接设置成自动宽度。

//set the width of the columns

$objPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth(12);//我们要在这列设置一个标题,所以明确地设定宽度

$highestColumn = $objPHPExcel->getActiveSheet()->getHighestColumn(); //例如 “G”
$highestColumnIndex = PHPExcel_Cell::columnIndexFromString($highestColumn); //例如“6”

for($column =1; $column < $highestColumnIndex; $column++) // 虽然列索引从0开始,但是第一列已明确设定了
{
    $objPHPExcel->getActiveSheet()->getColumnDimension(PHPExcel_Cell::stringFromColumnIndex($column))->setAutoSize(true);
}

设置了自动过滤器和自动宽度后,我们得到如下所示:

这里写图片描述

为了更适宜阅读,我给CSV里得到的数据设置了填充和边框。单独地设置样式参数并不难,
然而更好的法子是将一个格子的样式复制给别的格子:

//-----为表格加样式使之更易于阅读

$highestRow = $objPHPExcel->getActiveSheet()->getHighestRow();
$highestColumn = $objPHPExcel->getActiveSheet()->getHighestColumn();
$objPHPExcel->getActiveSheet()->insertNewRowBefore($highestRow + 1, 1);//添加一行作为页脚

//将头加粗并在头部和脚部设置边框
$objPHPExcel->getActiveSheet()->getStyle('A1')->getFont()->setBold(true);
$objPHPExcel->getActiveSheet()->getStyle('A1')->getBorders()->getTop()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);
$objPHPExcel->getActiveSheet()->getStyle('A' . ($highestRow + 1) 
)->getBorders()->getBottom()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);

//循环所有行,填充颜色,在边缘添加边框
for($row =1; $row<$highestRow + 2; $row++)
{
//设置颜色,头和尾为中度蓝灰,中间则是白色和浅蓝交替
if ($row == 1 || $row ==$highestRow + 1) $color = 'FFCFDAE7'; 
else if ($row%2==0) $color = 'FFFFFFFF';
else $color = 'FFE7EDF5';

 // 设置填充类型,填充颜色
 $objPHPExcel->getActiveSheet()->getStyle('A' . $row)->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID);
 $objPHPExcel->getActiveSheet()->getStyle('A' . $row)->getFill()->getStartColor()->setARGB($color);

 $objPHPExcel->getActiveSheet()->duplicateStyle($objPHPExcel->getActiveSheet()->getStyle('A' . $row), 'B' . $row . ':'. $highestColumn . $row); //将第一列的样式复制给本行剩下的列

 //一行的最左边和最右边设置边框
 $objPHPExcel->getActiveSheet()->getStyle('A' . $row)->getBorders()->getLeft()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);
 $objPHPExcel->getActiveSheet()->getStyle('G' . $row)->getBorders()->getRight()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);
 }

 加了一些设置后结果如下:

这里写图片描述

现在,我已经自定义了大多数格子的参数。不出意外的,修改格子的内容很简单:我前面已经做过
 了,我在格子“A1”里使用了setCellValue()函数。我们同样可以使用索引来设置格子的值(相对格子
 的名字例如“A1”)。我们可以通过setCellValueByCOlumnAndRow()来实现。这儿很重要的一点是列索引
 是从0开始的,而行索引是从1开始的,所以“A1”和(01)索引对应着同样的格子。
 我们不仅可以插入数据已可以插入公式。下面我使用一个公式去求得当月事务的总数,用
 法跟文字一样方便。
注意这个变量:$amountColumn在提供的文档的最上面:

$amountColumn = 'B'; // 这是CSV文档中获取到的开支的列
//-----使用一个公式计算当月开支并提供一个根据条件设置颜色的方式
$highestRow = $objPHPExcel->getActiveSheet()->getHighestRow(); 

$rowToInsert = ($highestRow + 3); 
$columnToInsert = PHPExcel_Cell::columnIndexFromString($amountColumn) -1;
$formula = '=SUM(' . $amountColumn . '2:' . $amountColumn . ($highestRow - 1) .')'; 
// $amountColumn 是“B”最大行是31的话公式$formula=SUM(B2:B30),这样会得出列B所有数值的和

 $objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow($columnToInsert, $rowToInsert, $formula);
 $objPHPExcel->getActiveSheet()->getStyleByColumnAndRow($columnToInsert, $rowToInsert)->getFont()->setBold(true);

 $columnToInsert= $columnToInsert -1 ; //数值左面那个格子,用来显示 Balance标记
 $objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow(0, $rowToInsert, 'Balance: '); 
 $objPHPExcel->getActiveSheet()->getStyleByColumnAndRow($columnToInsert, $rowToInsert)->getFont()->setBold(true);

 你该知道的一点是可以通过getValue()获取格子的值,例如:
 $objPHPExcel->getActiveSheet()->getCell('B8')->getValue(); 
 或
 $objPHPExcel->getActiveSheet()->getCellByColumnAndRow(1, 8)->getValue();

插入条件样式,例如数值小于0时设置为红色
//如果得到的结果是负数,将结果设为红色

//设定条件
$objConditional1 = new PHPExcel_Style_Conditional();
$objConditional1->setConditionType(PHPExcel_Style_Conditional::CONDITION_CELLIS);
$objConditional1->setOperatorType(PHPExcel_Style_Conditional::OPERATOR_LESSTHAN);
$objConditional1->addCondition('0');
$objConditional1->getStyle()->getFont()->getColor()->setARGB(PHPExcel_Style_Color::COLOR_RED);
$objConditional1->getStyle()->getFont()->setBold(true);

$conditionalStyles = $objPHPExcel->getActiveSheet()->getStyle($amountColumn .  $rowToInsert)->getConditionalStyles();
array_push($conditionalStyles, $objConditional1);
$objPHPExcel->getActiveSheet()->getStyle($amountColumn .  $rowToInsert)->setConditionalStyles($conditionalStyles);

最终结果如下:

这里写图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用PHPExcel导出MySQL数据到Excel,首先需要安装并引入PHPExcel库。 步骤如下: 1. 创建一个新的PHP文件,并包含PHPExcel库的文件: ```php require_once 'PHPExcel/PHPExcel.php'; ``` 2. 连接到MySQL数据库: ```php $servername = "localhost"; $username = "root"; $password = "password"; $dbname = "database"; $conn = new mysqli($servername, $username, $password, $dbname); if ($conn->connect_error) { die("连接失败: " . $conn->connect_error); } ``` 3. 执行查询语句获取数据: ```php $sql = "SELECT * FROM tablename"; $result = $conn->query($sql); ``` 4. 新建一个PHPExcel对象并设置一些属性: ```php $objPHPExcel = new PHPExcel(); $objPHPExcel->getProperties() ->setCreator("Your Name") ->setLastModifiedBy("Your Name") ->setTitle("MySQL导出Excel") ->setSubject("MySQL导出Excel") ->setDescription("MySQL数据导出到Excel"); ``` 5. 将数据填充到Excel中: ```php $row = 1; while($row_data = $result->fetch_assoc()) { $col = 0; foreach($row_data as $value) { $objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow($col, $row, $value); $col++; } $row++; } ``` 6. 设置Excel的输出: ```php $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); header('Content-Type: application/vnd.ms-excel'); header('Content-Disposition: attachment;filename="mysql_export.xls"'); header('Cache-Control: max-age=0'); $objWriter->save('php://output'); ``` 7. 关闭数据库连接: ```php $conn->close(); ``` 以上就是用PHPExcel导出MySQL数据到Excel的简单步骤。根据需要,您可以添加更多的样式设置来自定义导出的Excel文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值