phpexcel导出设置样式
2016-12-29 11:19
411 查看
通过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
文件。
这是上面那段很普通的代码输出结果:
上面的结果表明我们需要提供一些适当的格式。我在第一行上面添加了几行代码,设置值并
添加了些格式,从而创建了一个标题。
标题加上后:
提供的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”和(0,1)索引对应着同样的格子。 我们不仅可以插入数据已可以插入公式。下面我使用一个公式去求得当月事务的总数,用 法跟文字一样方便。 注意这个变量:$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); 最终结果如下:
相关文章推荐
- phpStudy6——php导出可以设置样式的excel表格
- NPOI导出至Excel——合并单元格、设置样式、输入公式
- C#+Aspose.Cells 导出Excel及设置样式 (Webform/Winform)
- phpexcel中文教程-设置表格字体颜色背景样式、数据格式、对齐方式、添加图片、批注、文字块、合并拆分单元格、单元格密码保护
- 导出excel设置样式(Aspose.Cells)
- PHP实现导出带样式的Excel
- 黄聪:phpexcel中文教程-设置表格字体颜色背景样式、数据格式、对齐方式、添加图片、批注、文字块、合并拆分单元格、单元格密码保护
- JavaEE_POI导出Excel, 设置导出Excel 单元格样式
- PHP实现导出带样式的Excel
- 封装对NPOIExcel的操作,方便的设置导出Excel的样式
- python导出excel常用格式样式设置
- 导出Excel之Epplus使用教程2(样式设置)
- PHPExcel探索之旅---阶段二 设置表格样式
- 导出Excel并设置样式
- PHP导出带样式的Excel示例代码
- phpexcel中文教程-设置表格字体颜色背景样式、数据格式、对齐方式、添加图片、批注、文字块、合并拆分单元格、单元格密码保护
- poi Excel导出样式设置
- PHPExcel-设置表格字体颜色背景样式、数据格式、对齐方式、添加图片、批注、文字块、合并拆分单元格、单元格密码保护
- phpexcel中文教程-设置表格字体颜色背景样式、数据格式、对齐方式、添加图片、批注、文字块、合并拆分单元格、单元格密码保护
- PHP导出带样式的Excel示例代码