Deprecated: htmlspecialchars(): Passing null to parameter #1 ($string) of type string is deprecated in /webData/hua/www.ascwh.com/var/Typecho/Feed.php on line 221
ASCWH - Excel https://www.ascwh.com/tag/Excel/ PhpSpreadsheet 导入导出基础应用 https://www.ascwh.com/392.html 2021-09-02T16:56:00+08:00 由于PHPExcel已经不再维护,PhpSpreadsheet是PHPExcel的下一个版本。PhpSpreadsheet是一个用纯PHP编写的库,并引入了命名空间,PSR规范等。这里简单介绍下PhpSpreadsheet的导入导出功能。1、安装使用composer安装:composer require phpoffice/phpspreadsheetGitHub下载:https://github.com/PHPOffice/PhpSpreadsheet2、excel文件导出 // 命名空间引入 use PhpOffice\PhpSpreadsheet\IOFactory; use PhpOffice\PhpSpreadsheet\Spreadsheet; /** * @title export 导出 */ public function export() { $data = [ ['title1' => '111', 'title2' => '222'], ['title1' => '111', 'title2' => '222'], ['title1' => '111', 'title2' => '222'] ]; $title = ['标题1', '标题2']; array_unshift($data, $title); // Create new Spreadsheet object $spreadsheet = new Spreadsheet(); $sheet = $spreadsheet->getActiveSheet()->setTitle('工作表标题'); foreach ($data as $k => $item) { $column = 1; foreach ($item as $value) { // 因不想定义 A… 一大串大写字母 所以使用数字单元格坐标设置单元格值。 $sheet->setCellValueByColumnAndRow($column, $k + 1, $value); $column++; } } // Redirect output to a client’s web browser (Xlsx) header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); header('Content-Disposition: attachment;filename="01simple.xlsx"'); header('Cache-Control: max-age=0'); // If you're serving to IE 9, then the following may be needed header('Cache-Control: max-age=1'); // If you're serving to IE over SSL, then the following may be needed header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT'); // always modified header('Cache-Control: cache, must-revalidate'); // HTTP/1.1 header('Pragma: public'); // HTTP/1.0 $writer = IOFactory::createWriter($spreadsheet, 'Xlsx'); $writer->save('php://output'); exit; }3、读取excel文件内容/** // 命名空间引入 use PhpOffice\PhpSpreadsheet\IOFactory; * @title readExcel 读取excel文件内容 * @return array */ public function readExcel() { $inputFileName = './test.xlsx'; $spreadsheet = IOFactory::load($inputFileName); // toArray() 具体参数参考官方文档 $sheetData = $spreadsheet->getActiveSheet()->toArray(null, true, true, true); return $sheetData; } PHP 导入 Excel 时间格式处理 https://www.ascwh.com/360.html 2020-03-26T22:22:00+08:00 public static function formatExcelTime($time, $format = 'Y-m-d H:i:s') { $formatTime = $time; // 这里要注意 `.` 因为不具体到时间的话,是没有 `.` 的,而具体到时间之后,就有 `.` 了 if (preg_match('/^[\d.]*$/', $time)) { // 正常的时间处理 if (strtotime($time)) { $formatTime = date($format, strtotime($time)); } else { // 如果是 excel 的时间,则另外处理 $formatTime = gmdate($format, ($time - 25569) * 86400); } } return $formatTime; }相关函数gmdate() 函数格式化 GMT/UTC 日期和时间,并返回格式化的日期字符串。 format 必需。规定输出日期字符串的格式。可使用下列字符: d - 一个月中的第几天(从 01 到 31) D - 星期几的文本表示(用三个字母表示) j - 一个月中的第几天,不带前导零(1 到 31) l('L' 的小写形式)- 星期几的完整的文本表示 N - 星期几的 ISO-8601 数字格式表示(1表示Monday[星期一],7表示Sunday[星期日]) S - 一个月中的第几天的英语序数后缀(2 个字符:st、nd、rd 或 th。与 j 搭配使用) w - 星期几的数字表示(0 表示 Sunday[星期日],6 表示 Saturday[星期六]) z - 一年中的第几天(从 0 到 365) W - 用 ISO-8601 数字格式表示一年中的星期数字(每周从 Monday[星期一]开始) F - 月份的完整的文本表示(January[一月份] 到 December[十二月份]) m - 月份的数字表示(从 01 到 12) M - 月份的短文本表示(用三个字母表示) n - 月份的数字表示,不带前导零(1 到 12) t - 给定月份中包含的天数 L - 是否是闰年(如果是闰年则为 1,否则为 0) o - ISO-8601 标准下的年份数字 Y - 年份的四位数表示 y - 年份的两位数表示 a - 小写形式表示:am 或 pm A - 大写形式表示:AM 或 PM B - Swatch Internet Time(000 到 999) g - 12 小时制,不带前导零(1 到 12) G - 24 小时制,不带前导零(0 到 23) h - 12 小时制,带前导零(01 到 12) H - 24 小时制,带前导零(00 到 23) i - 分,带前导零(00 到 59) s - 秒,带前导零(00 到 59) u - 微秒(PHP 5.2.2 中新增的) e - 时区标识符(例如:UTC、GMT、Atlantic/Azores) I(i 的大写形式)- 日期是否是在夏令时(如果是夏令时则为 1,否则为 0) O - 格林威治时间(GMT)的差值,单位是小时(实例:+0100) P - 格林威治时间(GMT)的差值,单位是 hours:minutes(PHP 5.1.3 中新增的) T - 时区的简写(实例:EST、MDT) Z - 以秒为单位的时区偏移量。UTC 以西时区的偏移量为负数(-43200 到 50400) c - ISO-8601 标准的日期(例如 2013-05-05T16:34:42+00:00) r - RFC 2822 格式的日期(例如 Fri, 12 Apr 2013 12:01:05 +0200) U - 自 Unix 纪元(January 1 1970 00:00:00 GMT)以来经过的秒数 同时,也可使用下列预定义常量(从 PHP 5.1.0 开始可用): DATE_ATOM - Atom(例如:2013-04-12T15:52:01+00:00) DATE_COOKIE - HTTP Cookies(例如:Friday, 12-Apr-13 15:52:01 UTC) DATE_ISO8601 - ISO-8601(例如:2013-04-12T15:52:01+0000) DATE_RFC822 - RFC 822(例如:Fri, 12 Apr 13 15:52:01 +0000) DATE_RFC850 - RFC 850(例如:Friday, 12-Apr-13 15:52:01 UTC) DATE_RFC1036 - RFC 1036(例如:Fri, 12 Apr 13 15:52:01 +0000) DATE_RFC1123 - RFC 1123(例如:Fri, 12 Apr 2013 15:52:01 +0000) DATE_RFC2822 - RFC 2822(Fri, 12 Apr 2013 15:52:01 +0000) DATE_RFC3339 - 与 DATE_ATOM 相同(从 PHP 5.1.3 开始) DATE_RSS - RSS(Fri, 12 Aug 2013 15:52:01 +0000) DATE_W3C - 万维网联盟(例如:2013-04-12T15:52:01+00:00) timestamp 可选。规定整数的 Unix 时间戳。默认是当前的本地时间(time())。 PHP 导出百万数据 CSV https://www.ascwh.com/246.html 2019-09-12T14:52:00+08:00 最近公司项目要求把数据除了页面输出也希望有导出功能,虽然之前也做过几个导出功能,但这次数据量相对比较大,差不多一天数据就20W条,要求导7天或者30天,那么数据量就轻松破百万了甚至破千万,因此开发的过程中发现了一些大数据导出的坑,在此跟大家分享一下,互相学习,多多提提意见。废话不多说直接上以 ThinkPHP 为例function putCsv($head, $mark = 'user_info', $fileName = "test.csv") { set_time_limit(0); $sqlCount = Db::table('user')->count(); //输出Excel文件头,可把user.csv换成你要的文件名 header('Content-Type: application/vnd.ms-excel;charset=utf-8'); header('Content-Disposition: attachment;filename="' . $fileName . '"'); header('Cache-Control: max-age=0'); $sqlLimit = 100000;//每次只从数据库取100000条以防变量缓存太大 //每隔$limit行,刷新一下输出buffer,不要太大,也不要太小 $limit = 100000; //buffer计数器 $cnt = 0; $fileNameArr = array(); //逐行取出数据,不浪费内存 for ($i = 0; $i < ceil($sqlCount / $sqlLimit); $i++) { $tmpFile = '../runtime/temp/' . $mark . '_' . $i . '.csv'; $fp = fopen($tmpFile, 'w'); //生成临时文件 //chmod($tmpFile,777);//修改可执行权限 $fileNameArr[] = $tmpFile; //将数据通过fputcsv写到文件句柄 fputcsv($fp, $head); $dataArr = Db::table('user')->limit($i * $sqlLimit,$sqlLimit)->select(); foreach ($dataArr as $a) { $cnt++; if ($limit == $cnt) { //刷新一下输出buffer,防止由于数据过多造成问题 ob_flush(); flush(); $cnt = 0; } fputcsv($fp, $a); } fclose($fp);//每生成一个文件关闭 } //进行多个文件压缩 $zip = new ZipArchive(); $filename = '../runtime/temp/'.$mark . ".zip"; $zip->open($filename, ZipArchive::CREATE);//打开压缩包 foreach ($fileNameArr as $file) { $zip->addFile($file, basename($file));//向压缩包中添加文件 } $zip->close();//关闭压缩包 foreach ($fileNameArr as $file) { unlink($file);//删除csv临时文件 } //输出压缩文件提供下载 header("Cache-Control: max-age=0"); header("Content-Description: File Transfer"); header('Content-disposition: attachment; filename=' . basename($filename)); header("Content-Type: application/zip"); header("Content-Transfer-Encoding: binary"); header('Content-Length: ' . filesize($filename)); @readfile($filename);//输出文件; unlink($filename); //删除压缩包临时文件 }public function excelout() { $array = array('ulId', 'aucSUPI', 'ucRatRest', 'ausForbidden', 'ausForbidde', 'ausAllowedArea_1', 'ausAllowedArea_2', 'ausNonAl', 'ausNonAllow', 'ausAllowN', 'ausAllow', 'ucMicoMode','aucDnn_1', 'aucDnn_2', 'aucDnn_3', 'aucLand','ulTa1','ulTa2' ); $this->putCsv($array); }