之前有写过用插件导入xlsx文件的方法,但是那个需要第三方插件,在某些项目里面不是很适用,所以这里介绍一种csv文件的导入方式。csv可以通过xlsx文件直接转换,很方便。
/**
* @param string $file 文件地址
* @param array $filed 预设字段,设置好这个,第一行数据会自动加上对应的key
* @param int $line 读取几行
* @param int $offset 偏移量
* @return array|string
*/
private function csvHandle(string $file = '', $filed=['gif', 'title'], $line=0, $offset=1)
{
setlocale(LC_ALL, 'zh_CN');
$handle = fopen($file,'r');
if(!$handle){
return '文件打开失败';
}
$i = 0;
$arr = [];
while($data = fgetcsv($handle)){
$j = 0;
//小于偏移量则不读取,但$i仍然需要自增
if($i < $offset && $offset){
$i++;
continue;
}
//大于读取行数则退出
if($i > $line && $line){
break;
}
$tmp = [];
foreach ($data as $key => $value) {
//$content = iconv("gbk","utf-8//IGNORE",$value);//转化编码
$content = $this->convertToUTF8($value);
//$arr[][$filed[$j]] = $content;
$tmp[$filed[$j]] = $content;
$j++;
}
$arr[] = json_encode($tmp);
$i++;
}
return $arr;
}
private function convertToUTF8($text){
$encoding = mb_detect_encoding($text, mb_detect_order(), true);
if($encoding == "UTF-8")
{
$text = mb_convert_encoding($text, 'UTF-8', 'UTF-8');
}
if ($encoding === false) {
$encoding = 'GBK';//短字符串无法判断字符串类型。。一般是文字出现这种问题,所以设置为gbk
}
$out = iconv($encoding, "UTF-8//IGNORE", $text);
return $out;
}
导出:
导出可老简单了,直接复制我的,改一改数据就能用,要注意如果数据过大可能需要分页等操作来进行下载
1.$exportUrl = 'php://output' 表示表示直接输出到浏览器自动下载。
2.exportUrl="服务器目录地址/文件名.csv"表示输出到指定路径文件下。举例:exportUrl = "/data/a.csv")。
/**
* 导出Excel数据表格
* @param array $dataList 要导出的数组格式的数据
* @param array $headList 导出的Excel数据第一列表头
* @param string $fileName 输出Excel表格文件名
* @param string $exportUrl 直接输出到浏览器or输出到指定路径文件下
* @return bool|false|string
*/
public function toExcel($dataList,$headList,$fileName,$exportUrl){
//set_time_limit(0);//防止超时
//ini_set("memory_limit", "512M");//防止内存溢出
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="'.$fileName.'.csv"');
header('Cache-Control: max-age=0');
//打开PHP文件句柄,php://output 表示直接输出到浏览器,$exportUrl表示输出到指定路径文件下
$fp = fopen($exportUrl, 'a');
//输出Excel列名信息
foreach ($headList as $key => $value) {
//CSV的Excel支持GBK编码,一定要转换,否则乱码
$headList[$key] = iconv('utf-8', 'gbk', $value);
}
//将数据通过fputcsv写到文件句柄
fputcsv($fp, $headList);
//计数器
$num = 0;
//每隔$limit行,刷新一下输出buffer,不要太大,也不要太小
$limit = 100000;
//逐行取出数据,不浪费内存
$count = count($dataList);
for ($i = 0; $i < $count; $i++) {
$num++;
//刷新一下输出buffer,防止由于数据过多造成问题
if ($limit == $num) {
ob_flush();
flush();
$num = 0;
}
$row = $dataList[$i];
foreach ($row as $key => $value) {
$row[$key] = iconv('utf-8', 'gbk', $value);
}
fputcsv($fp, $row);
}
return $fileName;
}
测试代码:
$headList = ['id', '姓名', '年龄'];
$dataList = [[1, 'zhangsan', 10], [2, 'lisi', 20]];
toExcel($dataList, $headList, '测试文件名称', 'php://output');
参考链接可以点击这里
前端注意不要用ajax,可以简单的一行代码来进行下载:
window=window.open('/lyt/data/export?user_id='+data.user_id);
0 条评论