require_once 'PHPExcel.php';
$PHPReader = new PHPExcel_Reader_Excel2007();
$filePath = 'wjyl.xlsx';
if(!$PHPReader->canRead($filePath)){
$PHPReader = new PHPExcel_Reader_Excel5();//讀取舊版本
}
$PHPExcel = $PHPReader->load($filePath);//讀取Excel文件
$sheetCount = $PHPExcel->getSheetCount();//獲取工作表的數目
for($s = 0; $s < $sheetCount; $s++){
echo '<b>這是表'.$s."</b><br />";
$currentSheet = $PHPExcel->getSheet($s); //讀取excel工作表
$allColumn = $currentSheet->getHighestColumn(); //取得最大的列号
$allRow = $currentSheet->getHighestRow();//取得一共有多少行
for($currentRow = 2; $currentRow <= $allRow; $currentRow++){
for($currentColumn= 'A';$currentColumn <= $allColumn; $currentColumn++){
$val = $currentSheet->getCell($currentColumn.$currentRow)->getValue();
echo $val." ";
}
echo "<br />";
}
}
echo 'Well Done!!!';
exit;
/**如果输出汉字有乱码,则需将输出内容用iconv函数进行编码转换,如下将gb2312编码转为utf-8编码输出*/
//echo iconv('utf-8','gb2312', $val);
當excel表的總列數超過了26的時候,也就是超過了Z的時候,再繼續增加就上升為AA,AB,AC......AZ格式,在這種情況下,上面代碼在列循環只會循環第一個A。
了解字母比較:
字母的比較,實際上是字母在ASCII表中所對應的10進制數字大小的比較,例如A 的 ASCII表中十進制對應數字為65,Z的為90;
echo ord('A');//65
echo ord('Z');//90
比較規則:
A與AB比較,首先,A與AB中的A比較,由於相等,則跳過A,繼續與B比較,得出
echo 'A' < 'AB' ? 1 : 0;//1
A與AA比較,先進行字母逐個比較,當每個都相等的情況下,最後進行字符串的長度對比,得出
echo 'A' < 'AA' ? 1 : 0;//1
A與BA比較,首先A與B比較,A小於B,得出結果
echo 'A' < 'BA' ? 1 : 0;//1
得出結果:
例如上面最後一列為AP,A首先會與allRow中的第一個字母進行比較,相同字母跳過,再與第二個字母比較,A<P,進入循環,執行完第一次代碼之後,列數增加,此時為B與AP比較,由於B>A,所以第一個字母判斷就不成立,退出循環。
解決辦法:
$ColumnArr = array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','AA','AB','AC','AD','AE','AF','AG','AH','AI','AJ','AK','AL','AM','AN','AO','AP');
for($currentRow = 2;$currentRow <= $allRow;$currentRow++){
for($c_Column= 0;$c_Column < count($ColumnArr); $c_Column++){
$val = $currentSheet->getCell($ColumnArr[$c_Column].$currentRow)->getValue();
echo $val." ";
}
echo "<br />";
}
解決辦法的原理就是能夠確保列的循環能夠順利的進行,上面固定列出來數組只是方便理解,具體操作可以對$allCloumn進行處理動態獲取列的相關數據。
导入来的excel表里面若存在日期数据,获取到的结果竟然是一串数字,原来phpexcel中用一个距离1900年的天数序列记录时间 1900-01-01 为整数1900-01-02为整数2,以次类推。我们知道,在windows的PHP中只支持1970-2038年时间计算,那怎么才能让它变成正常的日期呢,其中phpexcel原本就有提供一个日期处理的方法的。
$value = date("Y-m-d", PHPExcel_Shared_Date::ExcelToPHP($value));
下面是一段简单的excel导出function
/**
* 导出excel文件数据
* @param $table_header
* @param $type 0 直接下载,1生成文件
* @param $data
*/
function export_excel_data($table_header, $data, $type=0){
include_once BASE_PATH.'/public/plugin/PHPExcel/PHPExcel.php';
$excel = new PHPExcel();
$letter = array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z');
//写入头部标题信息
for($i = 0;$i < count($table_header);$i++) {
$excel->getActiveSheet()->setCellValue($letter[$i].'1', $table_header[$i]);
}
//填充表格信息
for ($i = 2;$i <= count($data)+1;$i++) {
$j = 0;
foreach ($data[$i - 2] as $key=>$value) {
$excel->getActiveSheet()->setCellValue($letter[$j].$i, $value);
$j++;
}
}
//创建Excel输入对象
$file_name = date("YmdHi").".xlsx";
$write = new PHPExcel_Writer_Excel2007($excel);
if($type){//保存到文件
$path = BASE_PATH."/public/excel/".$file_name;
$url = "/public/excel/".$file_name;
$write->save($path);
return $url;
}else{//直接下载
header("Pragma: public");
header("Expires: 0");
header("Cache-Control:must-revalidate, post-check=0, pre-check=0");
header("Content-Type:application/force-download");
header("Content-Type:application/vnd.ms-execl");
header("Content-Type:application/octet-stream");
header("Content-Type:application/download");
header('Content-Disposition:attachment;filename="'.$file_name.'"');
header("Content-Transfer-Encoding:binary");
$write->save('php://output');
exit;
}
}
导出小技巧,若导出的数据里面有数字,而且数字数值比较大,一般情况下excel会将大数字转换成科学记数法方法显示,若想直接保存数字字符串,只需要在数字后面连接上一个空格字符串就可以了。例如 $value = '12345'.' ';