原生實現:
$sql = 'select * from user';
$pdo = new \PDO('mysql:host=127.0.0.1;dbname=test', 'root', 'root');
$pdo->setAttribute(\PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);
$rows = $pdo->query($sql);
$filename = date('Ymd') . '.csv'; //設置文件名
header('Content-Type: text/csv');
header("Content-Disposition: attachment;filename={$filename}");
$out = fopen('php://output', 'w');
fputcsv($out, ['id', 'username', 'password', 'create_time']);
foreach ($rows as $row) {
$line = [$row['id'], $row['username'], $row['password'], $row['create_time']];
fputcsv($out, $line);
}
fclose($out);
$memory = round((memory_get_usage() - $startMemory) / 1024 / 1024, 3) . 'M' . PHP_EOL;
file_put_contents('/tmp/test.txt', $memory, FILE_APPEND);
解決中文亂碼:
$str = mb_convert_encoding($str,'gb2312','utf-8');
讀取日期問題:
$t = 41807; //讀取到的值
$n = intval(($t - 25569) * 3600 * 24); //轉換成1970年以來的秒數
echo gmdate('Y-m-d H:i:s',$n);//格式化時間,不是用date哦, 時區相差8小時的
也可以用 \PHPExcel_Shared_Date::ExcelToPHP() 這個函數變成時間戳
導出CSV,不會出現文檔格式問題:(丟失前導0,暫無解決,目前加#)
<?php
/**
* VIP導出
* @author Hannibal
*/
ini_set('memory_limit','1024M');
set_time_limit(0);
$mysqli = new mysqli('localhost', 'root', 'root', 'xxx');
if (mysqli_connect_errno()){
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$sql="select u_user,sum(u_str_1) from data where u_type = 1 group by u_user";
$res=$mysqli->query($sql);
header('Content-Type: application/vnd.ms-excel;charset=gbk');
header('Content-Disposition: attachment;filename="用戶導出.csv"');
header('Cache-Control: max-age=0');
$fp = fopen('php://output', 'a');
$head = array(
0 => '用戶名',
1 => '本月XX'
);
foreach ($head as $i => $v){
$head[$i] = iconv('utf-8', 'gbk', $v);
}
fputcsv($fp, $head);
if($res){
while($row=mysqli_fetch_array($res,MYSQLI_ASSOC)){
$row['u_user']='#'.$row['u_user'];
fputcsv($fp, $row);
}
}else{
die("fetch data failed!");
}
//釋放遊標內存
mysqli_free_result($res);
//關閉數據庫連接
mysqli_close($mysqli);
?>
PHPEXCEL使用教程:
首先下載PHPExcel
到https://github.com/PHPOffice/PHPExcel下載PHPExcel,如果不懂得使用git,可以到這https://codeload.github.com/PHPOffice/PHPExcel/zip/1.8下載壓縮包,懂得的自行用git下載。
下載好文件,解壓可以得到如下文件:
PHPExcel
好了,現在我們就可以用PHPExcel愉快的讀取和製作表格了!
PHPExcel DEMO1:利用PHPExcel讀取excel信息:
我們在根目錄創建一個名爲read.php的文件來讀取文檔,創建一個test.xlsx的文件,裏面寫的信息如下:
然後在read.php寫以下代碼:
<?php
include './Classes/PHPExcel/IOFactory.php';
$inputFileName = './test.xls';
date_default_timezone_set('PRC');
// 讀取excel文件
try {
$inputFileType = PHPExcel_IOFactory::identify($inputFileName);
$objReader = PHPExcel_IOFactory::createReader($inputFileType);
$objPHPExcel = $objReader->load($inputFileName);
} catch(Exception $e) {
die('加載文件發生錯誤:"'.pathinfo($inputFileName,PATHINFO_BASENAME).'": '.$e->getMessage());
}
// 確定要讀取的sheet,什麼是sheet,看excel的右下角,真的不懂去百度吧
$sheet = $objPHPExcel->getSheet(0);
$highestRow = $sheet->getHighestRow();
$highestColumn = $sheet->getHighestColumn();
// 獲取一行的數據
for ($row = 1; $row <= $highestRow; $row++){
// Read a row of data into an array
$rowData = $sheet->rangeToArray('A' . $row . ':' . $highestColumn . $row, NULL, TRUE, FALSE);
//這裏得到的rowData都是一行的數據,得到數據後自行處理,我們這裏只打出來看看效果
var_dump($rowData);
echo "<br>";
}
得到的數據:
PHPexcel讀取文件
PHPExcel DEMO2:利用PHPExcel導出信息到excel:
<?php
/** Error reporting */
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);
date_default_timezone_set('PRC');
/** 引入PHPExcel */
require_once dirname(__FILE__) . './Classes/PHPExcel.php';
// 創建Excel文件對象
$objPHPExcel = new PHPExcel();
// 設置文檔信息,這個文檔信息windows系統可以右鍵文件屬性查看
$objPHPExcel->getProperties()->setCreator("作者簡慶旺")
->setLastModifiedBy("最後更改者")
->setTitle("文檔標題")
->setSubject("文檔主題")
->setDescription("文檔的描述信息")
->setKeywords("設置文檔關鍵詞")
->setCategory("設置文檔的分類");
//根據excel座標,添加數據
$objPHPExcel->setActiveSheetIndex(0)
->setCellValue('A1', '你好')
->setCellValue('B2', '世界')
->setCellValue('C1', '你好')
->setCellValue('D2', '世界');
// 混雜各種符號, 編碼爲UTF-8
$objPHPExcel->setActiveSheetIndex(0)
->setCellValue('A4', 'Miscellaneous glyphs')
->setCellValue('A5', 'éàèùâêîôûëïüÿäöüç');
$objPHPExcel->getActiveSheet()->setCellValue('A8',"你好世界");
$objPHPExcel->getActiveSheet()->getRowDimension(8)->setRowHeight(-1);
$objPHPExcel->getActiveSheet()->getStyle('A8')->getAlignment()->setWrapText(true);
$value = "-ValueA\n-Value B\n-Value C";
$objPHPExcel->getActiveSheet()->setCellValue('A10', $value);
$objPHPExcel->getActiveSheet()->getRowDimension(10)->setRowHeight(-1);
$objPHPExcel->getActiveSheet()->getStyle('A10')->getAlignment()->setWrapText(true);
$objPHPExcel->getActiveSheet()->getStyle('A10')->setQuotePrefix(true);
// 重命名工作sheet
$objPHPExcel->getActiveSheet()->setTitle('第一個sheet');
// 設置第一個sheet爲工作的sheet
$objPHPExcel->setActiveSheetIndex(0);
// 保存Excel 2007格式文件,保存路徑爲當前路徑,名字爲export.xlsx
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
$objWriter->save( 'export.xlsx');
// 保存Excel 95格式文件,,保存路徑爲當前路徑,
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
$objWriter->save('export.xls');