php生成excel文件
❶ php怎麼導出大量數據的Excel
php導出大量數據到Excel,可以通過生成多個Excel文件,然後壓縮成壓縮包解決。
方案是:假如我們資料庫有10w條數據,每2000條數據生成一個Excel文件,這樣每次只要從資料庫里查詢出2000條數據即可,一定要分頁去查詢。
原因:主要是資料庫性能和寫文件性能。分頁查詢可以解決資料庫壓力的問題, 生成多個文件可以解決單個文件太大,後期維護Excel文件的問題。
要注意的:
1. 在導出邏輯文件開頭,一定要聲明 set_time_limit(0) ,防止腳本超時;
2. 每個文件生成後,適當的sleep一下,讓程序休息一下下;
3. 因為一次導出最後要將生成的多個Excel文件打包成一個壓縮包,所以要刪除掉生成的Excel文件,節省伺服器存儲空間;
❷ PHP如何導入導出Excel
最近在PHP培訓學習過程中,需要開發一個模塊,把系統中的一些數據導出成Excel,修改後再導回系統。就趁機對這個研究了一番,下面進行一些總結。雖然我們在平時用的也有一些,但沒有作者列出來的全,寫excel的時候,我用過pear的庫,也用過pack壓包的頭,同樣那些利用smarty等作的簡單替換xml的也用過,csv的就更不用談了。但是在讀的時候,只用過一種,具體是什麼忘了,要回去翻代碼了。
基本上導出的文件分為兩種:
1:類Excel格式,這個其實不是傳統意義上的Excel文件,只是因為Excel的兼容能力強,能夠正確打開而已。修改這種文件後再保存,通常會提示你是否要轉換成Excel文件。優點:簡單。缺點:難以生成格式,如果用來導入需要自己分別編寫相應的程序。2:Excel格式,與類Excel相對應,這種方法生成的文件更接近於真正的Excel格式。
如果導出中文時出現亂碼,可以嘗試將字元串轉換成gb2312,例如下面就把$yourStr從utf-8轉換成了gb2312:$yourStr = mb_convert_encoding(」gb2312″, 「UTF-8″, $yourStr);
下面詳細列舉幾種方法。
1:利用smarty,生成符合Excel規范的XML或HTML文件支持格式,非常完美的導出方案。不過導出來的的本質上還是XML文件,如果用來導入就需要另外處理了。詳細內容請見rardge大俠的帖子:http://bbs.chinaunix.net/viewthread.php?tid=745757
需要注意的是如果導出的表格行數不確定時,最好在模板中把」ss:ExpandedColumnCount=」5″ ss:ExpandedRowCount=」21″」之類的東西刪掉。
2、利用pack函數列印出模擬Excel格式的斷句符號,這種更接近於Excel標准格式,用office2003修改後保存,還不會彈出提示,推薦用這種方法。缺點是無格式。
PHP代碼<?php // Send Header header(」Pragma: public」); header(」Expires: 0″); header(」Cache-Control: must-revalidate, post-check=0, pre-check=0″); header(」Content-Type: application/force-download」); header(」Content-Type: application/octet-stream」); header(」Content-Type: application/download」);; header(」Content-Disposition: attachment;filename=test.xls 「); header(」Content-Transfer-Encoding: binary 「); // XLS Data Cell xlsBOF(); xlsWriteLabel(1,0,」My excel line one」); xlsWriteLabel(2,0,」My excel line two : 「); xlsWriteLabel(2,1,」Hello everybody」); xlsEOF(); function xlsBOF() { echo pack(」ssssss」, 0×809, 0×8, 0×0, 0×10, 0×0, 0×0); return; } function xlsEOF() { echo pack(」ss」, 0×0A, 0×00); return; } function xlsWriteNumber($Row, $Col, $Value) { echo pack(」sssss」, 0×203, 14, $Row, $Col, 0×0); echo pack(」d」, $Value); return; } function xlsWriteLabel($Row, $Col, $Value ) { $L = strlen($Value); echo pack(」ssssss」, 0×204, 8 + $L, $Row, $Col, 0×0, $L); echo $Value; return; } ?> 不過筆者在64位linux系統中使用時失敗了,斷句符號全部變成了亂碼。
3、使用製表符、換行符的方法 製表符」\t」用戶分割同一行中的列,換行符」\t\n」可以開啟下一行。 <?php header(」Content-Type: application/vnd.ms-execl」); header(」Content-Disposition: attachment; filename=myExcel.xls」); header(」Pragma: no-cache」); header(」Expires: 0″); /*first line*/ echo 「hello」.」\t」; echo 「world」.」\t」; echo 「\t\n」; /*start of second line*/ echo 「this is second line」.」\t」; echo 「Hi,pretty girl」.」\t」; echo 「\t\n」;
❸ 如何使用PHP導出csv和excel文件
(一)phpexcel文件導出:
步驟1,引入文件require APPPATH.'/libraries/PHPExcel.PHP';
步驟2, 實例化PHPEXCEL對象 $objPHPExcel=new PHPExcel();
步驟3, 設置表頭 $column = array('A','B','C'); $line = array('詞語','頻次','詞性');
//填充表頭信息
for($i = 0;$i < count($tableheader_all);$i++) {
$objPHPExcel->getActiveSheet()->setCellValue("$letter[$i]1","$tableheader[$i]");
//上一行中"$letter[$i]1"表示第「1」行第「$i」列
}
步驟4, 填充數據
for ($i = 2;$i <= count($data) + 1;$i++) {//因為內容是從第二行開始的,所以i=2表示從第二行開始填充數據
$j = 0;
foreach ($tmp as $key=>$val ){
$objPHPExcel->getActiveSheet()->setCellValue("$letter[$j]$i",$data[$i-2][$val]); //數據是從第一條開始但是i的初值是2所以想從第一條開始應該是$data[$i-2]開始
$j++;
}
}
步驟5,寫進excel中並輸出
$write = new PHPExcel_Writer_Excel5($objPHPExcel);
header("Pragma: public");
header("Expires: 0");
header("Cache-Control:must-revalidate, post-check=0, pre-check=0");
header("Content-Type:application/force-download");
header("Content-Type:application/vnd.ms-execl");
header("Content-Type:application/octet-stream");
header("Content-Type:application/download");;
header('Content-Disposition:attachment;filename="數據導出_詞雲圖.xls"');
header("Content-Transfer-Encoding:binary");
$write->save('php://output');
(一)CSV文件導出:
csv文件導出最令人頭疼的問題就是編碼問題,現在分享一下我的經驗
首先看伺服器是Linux的還是windows的 如果是windows的伺服器那麼編碼問題只能藉助於mb_convert_encoding()或者是iconv兩個函數相互轉換中文編碼
如果伺服器是linux的 那麼很簡單 utf-8: setlocale(LC_ALL, 『en_US.UTF-8′); 簡體中文:setlocale(LC_ALL, 『zh_CN');
下面來說csv導出步驟:
$result = mysql_query("select * from student order by id asc");
$str = "姓名,性別,年齡\n";
$str = iconv('utf-8','gb2312',$str);
while($row=mysql_fetch_array($result)){
$name = iconv('utf-8','gb2312',$row['name']); //中文轉碼
$sex = iconv('utf-8','gb2312',$row['sex']);
$str .= $name.",".$sex.",".$row['age']."\n"; //用引文逗號分開
}
$filename = date('Ymd').'.csv'; //設置文件名
export_csv($filename,$str); //導出
要將數據導出到本地即下載,需要修改header信息,代碼如下:
function export_csv($filename,$data) {
header("Content-type:text/csv");
header("Content-Disposition:attachment;filename=".$filename);
header('Cache-Control:must-revalidate,post-check=0,pre-check=0');
header('Expires:0');
header('Pragma:public');
echo $data;
}
❹ php怎麼導出大量數據的Excel
簡介:可以利用工具軟體導出成Excel文件
工具原料:Apache+php+mysql網站運行環境,phpMyAdmin v4.6.2
1、下載phpMyAdmin v4.6.2軟體後解壓放在網站根目錄
2、用root用戶和密碼登入phpMyAdmin,在左邊欄點擊要導出的資料庫,然後點擊要導出的數據表,最後點擊導出如圖所示。
5、最後點擊執行按鈕,OK.
❺ PHP導出excel 怎麼做
方法一:特點,簡單,省心,
<?php
header("Content-type:application/vnd.ms-excel");
header("Content-Disposition:attachment;filename=test_data.xls");
$tx='表頭';
echo $tx."\n\n";
//輸出內容如下:
echo "姓名"."\t";
echo "年齡"."\t";
echo "學歷"."\t";
echo "\n";
echo "張三"."\t";
echo "25"."\t";
echo "本科"."\t";
?>
方法二: 引用google code中推薦的小類庫(大體同方法一,比較復雜點)
http://code.google.com/p/php-excel/downloads/list
方法三: PHPEXCEL 類庫,功能強大,支持win Excel2003 ,Win Excel2007.
http://www.codeplex.com/PHPExcel
<?
//設置PHPExcel類庫的include path
set_include_path('.'. PATH_SEPARATOR .
'D:\Zeal\PHP_LIBS' . PATH_SEPARATOR .
get_include_path());
/**
* 以下是使用示例,對於以 //// 開頭的行是不同的可選方式,請根據實際需要
* 打開對應行的注釋。
* 如果使用 Excel5 ,輸出的內容應該是GBK編碼。
*/
require_once 'PHPExcel.php';
// uncomment
////require_once 'PHPExcel/Writer/Excel5.php'; // 用於其他低版本xls
// or
////require_once 'PHPExcel/Writer/Excel2007.php'; // 用於 excel-2007 格式
// 創建一個處理對象實例
$objExcel = new PHPExcel();
// 創建文件格式寫入對象實例, uncomment
////$objWriter = new PHPExcel_Writer_Excel5($objExcel); // 用於其他版本格式
// or
////$objWriter = new PHPExcel_Writer_Excel2007($objExcel); // 用於 2007 格式
//$objWriter->setOffice2003Compatibility(true);
//*************************************
//設置文檔基本屬性
$objProps = $objExcel->getProperties();
$objProps->setCreator("Zeal Li");
$objProps->setLastModifiedBy("Zeal Li");
$objProps->setTitle("Office XLS Test Document");
$objProps->setSubject("Office XLS Test Document, Demo");
$objProps->setDescription("Test document, generated by PHPExcel.");
$objProps->setKeywords("office excel PHPExcel");
$objProps->setCategory("Test");
//*************************************
//設置當前的sheet索引,用於後續的內容操作。
//一般只有在使用多個sheet的時候才需要顯示調用。
//預設情況下,PHPExcel會自動創建第一個sheet被設置SheetIndex=0
$objExcel->setActiveSheetIndex(0);
$objActSheet = $objExcel->getActiveSheet();
//設置當前活動sheet的名稱
$objActSheet->setTitle('測試Sheet');
//*************************************
//設置單元格內容
//
//由PHPExcel根據傳入內容自動判斷單元格內容類型
$objActSheet->setCellValue('A1', '字元串內容'); // 字元串內容
$objActSheet->setCellValue('A2', 26); // 數值
$objActSheet->setCellValue('A3', true); // 布爾值
$objActSheet->setCellValue('A4', '=SUM(A2:A2)'); // 公式
//顯式指定內容類型
$objActSheet->setCellValueExplicit('A5', '847475847857487584',
PHPExcel_Cell_DataType::TYPE_STRING);
//合並單元格
$objActSheet->mergeCells('B1:C22');
//分離單元格
$objActSheet->unmergeCells('B1:C22');
//*************************************
//設置單元格樣式
//
//設置寬度
$objActSheet->getColumnDimension('B')->setAutoSize(true);
$objActSheet->getColumnDimension('A')->setWidth(30);
$objStyleA5 = $objActSheet->getStyle('A5');
//設置單元格內容的數字格式。
//
//如果使用了 PHPExcel_Writer_Excel5 來生成內容的話,
//這里需要注意,在 PHPExcel_Style_NumberFormat 類的 const 變數定義的
//各種自定義格式化方式中,其它類型都可以正常使用,但當setFormatCode
//為 FORMAT_NUMBER 的時候,實際出來的效果被沒有把格式設置為"0"。需要
//修改 PHPExcel_Writer_Excel5_Format 類源代碼中的 getXf($style) 方法,
//在 if ($this->_BIFF_version == 0x0500) { (第363行附近)前面增加一
//行代碼:
//if($ifmt === '0') $ifmt = 1;
//
//設置格式為PHPExcel_Style_NumberFormat::FORMAT_NUMBER,避免某些大數字
//被使用科學記數方式顯示,配合下面的 setAutoSize 方法可以讓每一行的內容
//都按原始內容全部顯示出來。
$objStyleA5
->getNumberFormat()
->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_NUMBER);
//設置字體
$objFontA5 = $objStyleA5->getFont();
$objFontA5->setName('Courier New');
$objFontA5->setSize(10);
$objFontA5->setBold(true);
$objFontA5->setUnderline(PHPExcel_Style_Font::UNDERLINE_SINGLE);
$objFontA5->getColor()->setARGB('FF999999');
//設置對齊方式
$objAlignA5 = $objStyleA5->getAlignment();
$objAlignA5->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_RIGHT);
$objAlignA5->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);
//設置邊框
$objBorderA5 = $objStyleA5->getBorders();
$objBorderA5->getTop()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);
$objBorderA5->getTop()->getColor()->setARGB('FFFF0000'); // color
$objBorderA5->getBottom()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);
$objBorderA5->getLeft()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);
$objBorderA5->getRight()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);
//設置填充顏色
$objFillA5 = $objStyleA5->getFill();
$objFillA5->setFillType(PHPExcel_Style_Fill::FILL_SOLID);
$objFillA5->getStartColor()->setARGB('FFEEEEEE');
//從指定的單元格復制樣式信息.
$objActSheet->plicateStyle($objStyleA5, 'B1:C22');
//*************************************
//添加圖片
$objDrawing = new PHPExcel_Worksheet_Drawing();
$objDrawing->setName('ZealImg');
$objDrawing->setDescription('Image inserted by Zeal');
$objDrawing->setPath('./zeali.net.logo.gif');
$objDrawing->setHeight(36);
$objDrawing->setCoordinates('C23');
$objDrawing->setOffsetX(10);
$objDrawing->setRotation(15);
$objDrawing->getShadow()->setVisible(true);
$objDrawing->getShadow()->setDirection(36);
$objDrawing->setWorksheet($objActSheet);
//添加一個新的worksheet
$objExcel->createSheet();
$objExcel->getSheet(1)->setTitle('測試2');
//保護單元格
$objExcel->getSheet(1)->getProtection()->setSheet(true);
$objExcel->getSheet(1)->protectCells('A1:C22', 'PHPExcel');
//*************************************
//輸出內容
//
$outputFileName = "output.xls";
//到文件
////$objWriter->save($outputFileName);
//or
//到瀏覽器
////header("Content-Type: application/force-download");
////header("Content-Type: application/octet-stream");
////header("Content-Type: application/download");
////header('Content-Disposition:inline;filename="'.$outputFileName.'"');
////header("Content-Transfer-Encoding: binary");
////header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
////header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
////header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
////header("Pragma: no-cache");
////$objWriter->save('php://output');
?>
❻ 實時生成並下載大數據量的EXCEL文件,用PHP如何實現
對於任何一個網站肯定是少不了下載功能,常見的下載功能有圖片、視頻、Excel表格,如果文件比較小的話,那麼不會遇到任何的問題,但是當文件信息而超明銀過了PHP的最大內存,那麼在這個時候它就會有的內存溢出的問題。
那麼它們是因為什麼而發生的?對於這個過程的原理才是埋碧我們應該真正要去弄明白的事情
下載大數據量的EXCEL文件為何要報錯?
PHP在下載大Excel表格的時候,那麼首先它是需要去把MySQL的數據從硬碟上面讀取到內存,但讀取它是一次性載入到我們的內存,如果說它一次性載入的數據量遠遠大於最大內存,然後再來執行瀏覽器的業務下載。那麼這個時候它就會發生我們這個內存溢出。
就比如:說我們現在有100M的數據量,但是我們PHP內存最大隻有64M,那麼這個它肯定是裝不了的,我們可以把那個內存比喻為一個水杯,這個水杯的容量比喻為內存,現在杯子最大容量為64L。你要存放100L。肯定放不下
大事化小,小事化了。拆分成段
從上面可以看到文件下載,它是分為兩步,首先是載入內存然後執行瀏覽器的輸出下載,那麼既然大型文件一次性載入不了,那可以採用「大事化小,小事化了」思路,我們可以實現邊寫邊下載,也激液宴就是分批次的讀取與寫入。
因為用戶的話,只要最終拿到這個文件就可以,對於瀏覽器的下載原理不需要關心。只需要給到文件下載提示給用戶即可,然後後端在實時的分批次的寫入到要下載的文件當中。
實現思路步驟:
1、一設置瀏覽器下載Excel需要的Header
2、打開php://output流,並設置寫入文件句柄。
註:(php://output,是一個可寫的輸出流,允許程序像操作文件一樣將輸出寫入到輸出流中,PHP會把輸出流中的內容發送給web伺服器並返回給發起請求的瀏覽器)
3、獲取資料庫所有數據量,並設置每次查詢的條數,通過這兩個值計算分批查詢的次數
4、基於分批查詢的次數循環查詢資料庫,然後寫入到文件中,同時清除本次操作變數內存,刷新緩沖到瀏覽器,讓瀏覽器的文件始終實時保持到最新的大小
註:刷新用ob_flush、flush()PHP的I/O流
在這里我們用到了PHP的一個IO的輸入輸出,也就是我們常用的
php://inputphp://output。php://input
php://input可以讀取原始的POST數據。相較於$form-data」.
註:p>php://output是一個只寫的數據流,允許你以print和echo一樣的方式寫入到輸出緩沖區。
綜上:實現思維與原理很重要如有感悟,歡迎在線咨詢
❼ PHP如何導出當前頁面中的表格至Excel
1.
這屬於php的技術;
2.
php可以用PHPExcel直接導出成excel文件;
代碼如下:
require_once("../lib/excelcreator.class.php");
$myxls
=
new
ExcelCreator
("中文Excel");
$aTableHead
=
'
<Row
ss:AutoFitHeight="0">
<Cell><Data
ss:Type="String">Name3</Data></Cell>
<Cell><Data
ss:Type="String">Surname3</Data></Cell>
</Row>';
$aTableBody
=
'
<Row
ss:AutoFitHeight="0">
<Cell><Data
ss:Type="String">Schwarz3</Data></Cell>
<Cell><Data
ss:Type="String">Oliver3</Data></Cell>
</Row>';
$aTableBottom
=
'
<Row
ss:AutoFitHeight="0">
<Cell><Data
ss:Type="String">123</Data></Cell>
<Cell><Data
ss:Type="String">Peter3</Data></Cell>
</Row>';
$workSheet
=
$myxls->createWorkSheet
(
"中文sheet1",
$aTableHead,
$aTableBody,
$aTableBottom
);
echo
$myxls->createExcel
(
$workSheet
);