先贴数字转大写字母的代码:数字1-26转A-Z,超过26,例如:27,转成AA,一直到ZZ,再从AAA开始。
(这里在整数倍的的时候会出问题,因为通过26进制的方式去做。没有办法,只能特殊处理。如果有大佬能改进,欢迎讨论区进行改进)
/**
* 将数字转化成对应的大写字母(衍生:AA对应的数字为27,依次类推)
* @param string $str 需要转换的字母
* @return str_lenth 返回的数字
*/
function numToStr($num)
{
$decimal = base_convert($num, 10, 26);
// echo $decimal." ";
$array = str_split($decimal);
$lenth = strlen($decimal);
//方法可处理675列以内的excel的转化,超过会报错,待优化,做特殊处理,可出礼到727以内;
if ($num==676) {
$str = 'YZ';
}elseif ($num==702) {
$str = 'ZZ';
}
if ($str) {
return $str;
}
for ($i=$lenth; $i >0 ; $i--) {
$key = $lenth - $i;
if ($array[$key]=="0") {
if ($array[$key-1]==1&&$key==1) {
$str = 'Z';
}elseif ($array[$key-1]==1&&$key>1) {
$str .= 'Z';
}else{
$str = numToStr(base_convert($array[$key-1], 26, 10)-1).'Z';
}
}else{
$str .= chr(base_convert($array[$key], 26, 10)+64);
}
}
return $str;
}
正文:在开发中经常遇到导入excel的问题,开始用的以前项目中的function,发现只能读取到A-Z列的数据,但是经常会超过26列,即超过AA列。这是原本的代码,$k='A',k++的方式,因为字符串比较大小方式的原因,其实行不通。
function import_excel($file){
//判断文件是什么格式
$type = pathinfo($file);
$type = strtolower($type["extension"]);
if ($type=='xlsx') {
$type='Excel2007';
}elseif($type=='xls') {
$type = 'Excel5';
}
ini_set('max_execution_time', '0');
Vendor('PHPExcel.PHPExcel');
// 判断使用哪种格式
$objReader = PHPExcel_IOFactory::createReader($type);
$objPHPExcel = $objReader->load($file);
$sheet = $objPHPExcel->getSheet(0);
// 取得总行数
$highestRow = $sheet->getHighestRow();
// 取得总列数
$highestColumn = $sheet->getHighestColumn();
//循环读取excel文件,读取一条,插入一条
$data=array();
//从第一行开始读取数据
for($j=1;$j<=$highestRow;$j++){
//从A列读取数据
for($k='A';$column<=$highestColumn;$k++){
// 读取单元格
$data[$j][]=$objPHPExcel->getActiveSheet()->getCell("$k$j")->getValue();
}
}
return $data;
}
改进后有点问题,已经在开头说明,但是现在能用于1-727的转化。
/**
* 导入excel文件
* @param string $file excel文件路径
* @return array excel文件内容数组
*/
function import_excel($file){
//判断文件是什么格式
$type = pathinfo($file);
$type = strtolower($type["extension"]);
if ($type=='xlsx') {
$type='Excel2007';
}elseif($type=='xls') {
$type = 'Excel5';
}
ini_set('max_execution_time', '0');
Vendor('PHPExcel.PHPExcel');
// 判断使用哪种格式
$objReader = PHPExcel_IOFactory::createReader($type);
$objPHPExcel = $objReader->load($file);
$sheet = $objPHPExcel->getSheet(0);
// 取得总行数
$highestRow = $sheet->getHighestRow();
// 取得总列数
$highestColumn = $sheet->getHighestColumn();
//循环读取excel文件,读取一条,插入一条
// p($highestColumn);
$columnLenth = strToNum($highestColumn);
$data=array();
//从第一行开始读取数据
for($j=1;$j<=$highestRow;$j++){
//从A列读取数据
for($column=1;$column<=$columnLenth;$column++){
// 读取单元格
$k = numToStr($column);
$data[$j][]=$objPHPExcel->getActiveSheet()->getCell("$k$j")->getValue();
}
}
return $data;
}
/**
* 将大写字母转化成对应的1-26的数字(衍生:AA对应的数字为27,依次类推)
* @param string $str 需要转换的字母
* @return str_lenth 返回的数字
*/
function strToNum($str)
{
$array = str_split(strtoupper($str));
$lenth = strlen($str);
for ($i=$lenth; $i >0 ; $i--) {
$key = $lenth - $i;
$str_lenth += pow(26,($i-1))*(ord($array[$key]) - 64);
// p($key);p($str_lenth);
}
return $str_lenth;
}
/**
* 将数字转化成对应的大写字母(衍生:AA对应的数字为27,依次类推)
* @param string $str 需要转换的字母
* @return str_lenth 返回的数字
*/
function numToStr($num)
{
$decimal = base_convert($num, 10, 26);
// echo $decimal." ";
$array = str_split($decimal);
$lenth = strlen($decimal);
//方法可处理675列以内的excel的转化,超过会报错,待优化,做特殊处理,可出礼到727以内;
if ($num==676) {
$str = 'YZ';
}elseif ($num==702) {
$str = 'ZZ';
}
if ($str) {
return $str;
}
for ($i=$lenth; $i >0 ; $i--) {
$key = $lenth - $i;
if ($array[$key]=="0") {
if ($array[$key-1]==1&&$key==1) {
$str = 'Z';
}elseif ($array[$key-1]==1&&$key>1) {
$str .= 'Z';
}else{
$str = numToStr(base_convert($array[$key-1], 26, 10)-1).'Z';
}
}else{
$str .= chr(base_convert($array[$key], 26, 10)+64);
}
}
return $str;
}