PHP導出CSV

原生實現

$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');

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章