本文主要向您介绍有关php中一般excel导出方法的相关信息。本文介绍的方法对每个人学习或使用php都有一定的参考学习价值。需要它的朋友将跟随我们一起学习。
一.常规导出方法
有很多方法可以在Internet上导出excel。在crm或oa系统中导出excel是很常见的。每个完成此功能的人都知道,主要操作实际上是循环数据列表,然后将其放置在网格中。将数据添加到固定的单元格。只需执行一次,然后复制相关代码进行修改和修改,即可完成其他位置的导出功能。
但这有两个问题:
1.修改列表数据字段时,需要修改很多代码,难以维护且难以更改;
2.多次出现导出功能时,需要在多个位置复制很多冗余代码,这看起来很不舒服;

因此,有必要统一导出excel的方法。使用它时,只需传入数据的标题,标题字段名称,数据列表和数据表名称即可导出excel。
二.使用常见的导出方法
如下图所示,只要传入4个参数,就可以完成导出,并且使用和维护变得更加简单。

好的,目标很明确,下一步是代码实现。
显然,要实现此功能,最大的困难是根据单个数据的索引和标头字段的顺序(例如A1, B 3)。

然后让我们分析excel的单元格坐标。从A1开始,数字的值在垂直方向上增加,而字母在水平方向上增加。当水平字母变为Z时,下一个字母为AA,然后是AB,...,ZZ,...,AAA ...
在这种情况下,我们将知道垂直坐标很简单,并且可以根据每条数据的索引值进行计算。困难的是水平坐标。怎么计算呢?在仔细分析水平坐标后,可以发现它是一个类似于26个基数的字母数字。如果将A视为0,则Z表示25。但是此数字与我们常见的十六进制,八进制等不同,因为携带Z时,下一个数字不是BA而是AA。在常见的基数中(例如十进制的9进位),它变为10而不是00;否则,它变为10。十六进制的0xF进位变为0x10,而不是0x00。
因此,您可以参考十六进制转换算法,然后对其进行更改以获取计算excel(十进制到伪26十六进制)水平坐标的方法:
//AAA转换
public static function toAAA($dec)
{
if ($dec < 0) return '';
$y = $dec % 26;
$x = floor($dec / 26);
return self::toAAA($x - 1) . chr($y + 65);
}最后,附上完整的代码
该框架为Yii2,而excel导出组件为moonlandsoft / yii2-phpexcel;
其他类似
//导出xls
public static function exportXls($array)
{
set_time_limit(0);
include(Url::to('@vendor/moonland/phpexcel/PHPExcel.php'));
include(Url::to('@vendor/moonland/phpexcel/PHPExcel/Writer/Excel2007.php'));
$titles = $array['titles'];
$fields = $array['fields'];
$list = $array['list'];
$name = $array['name'];
$count = count($titles);
$keys = [];//A=>chr(65)
foreach ($titles as $k => $v) {
$keys[] = self::toAAA($k);
}
$objPHPExcel = new \PHPExcel();
$objWriter = new \PHPExcel_Writer_Excel2007($objPHPExcel);
$objPHPExcel->setActiveSheetIndex(0);
$activeSheet = $objPHPExcel->getActiveSheet();
$activeSheet->setTitle($name);
$activeSheet->getStyle("A1:{$keys[$count-1]}1")->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
$activeSheet->mergeCells("A1:{$keys[$count-1]}1");
$activeSheet->setCellValue('A1', $name);
//设置title,样式
foreach ($titles as $key => $title) {
$activeSheet->setCellValue($keys[$key] . '2', $title);
$activeSheet->getColumnDimension($keys[$key])->setWidth(20);
$activeSheet->getRowDimension(($key + 1))->setRowHeight(18);
}
$i = 3;
foreach ($list as &$item) {
foreach ($keys as $k => $v) {
$val = isset($item[$fields[$k]]) ? $item[$fields[$k]] . ' ' : ' ';
$activeSheet->setCellValue($v . $i, $val);
}
$i++;
}
$fileName = $name . "_" . date('Y_m_d_His') . '.xlsx';
header("Cache-Control: public");
header("Pragma: public");
header("Content-type:application/vnd.ms-excel");
header("Content-Disposition:attachment;filename=" . iconv("utf-8", "GB2312//TRANSLIT", $fileName));
header('Content-Type:APPLICATION/OCTET-STREAM');
ob_clean();
ob_start();
$objWriter->save('php://output');
ob_end_flush();
}
//AAA转换
public static function toAAA($dec)
{
if ($dec < 0) return '';
$y = $dec % 26;
$x = floor($dec / 26);
return self::toAAA($x - 1) . chr($y + 65);
}三.导出结果示例
导出结果:

摘要
以上是本文的全部内容。希望本文的内容对每个人的学习或工作都有一定的参考学习价值。如有任何疑问,您可以留言和交流。感谢您对Scripthome的支持。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/shumachanpin/article-365700-1.html
谁让你那么遭人恨呢
DF26