phpspreadsheet 中文文檔(六)讀寫文件+讀取文件

2019年10月11日14:05:58php

 

讀寫文件

體系結構您已經知道,使用基本PhpSpreadsheet類沒法對持久性存儲進行讀寫。爲此,PhpSpreadsheet提供讀者和做家,這是實現\PhpOffice\PhpSpreadsheet\Reader\IReader和 \PhpOffice\PhpSpreadsheet\Writer\IWriterhtml

\ PhpOffice \ PhpSpreadsheet \ IOFactory

PhpSpreadsheet API提供了多種建立 \PhpOffice\PhpSpreadsheet\Reader\IReader或 \PhpOffice\PhpSpreadsheet\Writer\IWriter實例的方法:git

經過直接建立\PhpOffice\PhpSpreadsheet\IOFactory下面的全部示例都演示了直接建立方法。請注意,您也可使用\PhpOffice\PhpSpreadsheet\IOFactory該類來執行此操做。github

\PhpOffice\PhpSpreadsheet\Reader\IReader使用建立\PhpOffice\PhpSpreadsheet\IOFactory

有兩種方法能夠將文件讀入PhpSpreadsheet:使用自動文件類型解析或顯式。web

自動文件類型解析可\PhpOffice\PhpSpreadsheet\Reader\IReader使用PhpSpreadsheet 檢查不一樣的 分佈。若是其中之一能夠加載指定的文件名,則使用該文件名加載文件\PhpOffice\PhpSpreadsheet\Reader\IReader顯式模式要求您指定 \PhpOffice\PhpSpreadsheet\Reader\IReader應使用的模式。數據庫

您能夠使用如下代碼示例在自動文件類型解析模式下建立\PhpOffice\PhpSpreadsheet\Reader\IReader實例 \PhpOffice\PhpSpreadsheet\IOFactory數組

$spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load("05featuredemo.xlsx"); 

此功能的典型用法是當您須要讀取用戶上傳的文件時,而且您不知道他們是在上傳xls仍是xlsx文件。安全

若是您須要在閱讀器上設置一些屬性(例如,僅讀取數據,請參閱稍後的更多內容),則能夠改用如下變體:服務器

$reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReaderForFile("05featuredemo.xlsx"); $reader->setReadDataOnly(true); $reader->load("05featuredemo.xlsx"); 

您能夠使用如下代碼示例以顯式模式使用建立\PhpOffice\PhpSpreadsheet\Reader\IReader實例 \PhpOffice\PhpSpreadsheet\IOFactorydom

$reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader("Xlsx"); $spreadsheet = $reader->load("05featuredemo.xlsx"); 

請注意,自動類型解析模式比顯式模式稍慢。

\PhpOffice\PhpSpreadsheet\Writer\IWriter使用建立\PhpOffice\PhpSpreadsheet\IOFactory

您能夠\PhpOffice\PhpSpreadsheet\Writer\IWriter使用建立實例 \PhpOffice\PhpSpreadsheet\IOFactory

$writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, "Xlsx"); $writer->save("05featuredemo.xlsx"); 

Excel 2007(SpreadsheetML)文件格式

Xlsx文件格式是PhpSpreadsheet的主要文件格式。它容許將內存電子表格輸出到.xlsx文件。

\ PhpOffice \ PhpSpreadsheet \ Reader \ Xlsx

閱讀電子表格

您可使用如下代碼讀取.xlsx文件:

$reader = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx(); $spreadsheet = $reader->load("05featuredemo.xlsx"); 

僅讀取數據

您能夠在閱讀器上設置選項setReadDataOnly,以指示閱讀器忽略樣式,數據驗證等,而僅讀取單元格數據:

$reader = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx(); $reader->setReadDataOnly(true); $spreadsheet = $reader->load("05featuredemo.xlsx"); 

僅閱讀特定的工做表

您能夠在閱讀器上設置選項setLoadSheetsOnly,以指示閱讀器僅加載具備給定名稱的圖紙:

$reader = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx(); $reader->setLoadSheetsOnly(["Sheet 1", "My special sheet"]); $spreadsheet = $reader->load("05featuredemo.xlsx"); 

僅讀取特定的單元格

您能夠在閱讀器上設置選項setReadFilter,以指示閱讀器僅加載與給定規則匹配的單元格。讀取過濾器能夠是任何實現的類 \PhpOffice\PhpSpreadsheet\Reader\IReadFilter默認狀況下,使用讀取全部單元格\PhpOffice\PhpSpreadsheet\Reader\DefaultReadFilter

如下代碼將僅讀取Excel文件中任何工做表的第1行和第20至30行:

class MyReadFilter implements \PhpOffice\PhpSpreadsheet\Reader\IReadFilter { public function readCell($column, $row, $worksheetName = '') { // Read title row and rows 20 - 30 if ($row == 1 || ($row >= 20 && $row <= 30)) { return true; } return false; } } $reader = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx(); $reader->setReadFilter( new MyReadFilter() ); $spreadsheet = $reader->load("06largescale.xlsx"); 

\ PhpOffice \ PhpSpreadsheet \ Writer \ Xlsx

編寫電子表格

您可使用如下代碼編寫.xlsx文件:

$writer = new \PhpOffice\PhpSpreadsheet\Writer\Xlsx($spreadsheet); $writer->save("05featuredemo.xlsx"); 

公式預計算

默認狀況下,該編寫器會預先計算電子表格中的全部公式。在大型電子表格上,這可能會很慢,甚至多是沒必要要的。可是,您能夠禁用公式預計算:

$writer = new \PhpOffice\PhpSpreadsheet\Writer\Xlsx($spreadsheet); $writer->setPreCalculateFormulas(false); $writer->save("05featuredemo.xlsx"); 

Office 2003兼容性包

因爲Office2003兼容性包中的錯誤,打開Xlsx電子表格時可能會出現一些小問題(主要與公式計算有關)。您可使用如下代碼啓用Office2003兼容性:

$writer = new \PhpOffice\PhpSpreadsheet\Writer\Xlsx($spreadsheet); $writer->setOffice2003Compatibility(true); $writer->save("05featuredemo.xlsx"); 

Office2003兼容性僅應在須要時使用 Office2003兼容性選項應僅在須要時使用。此選項禁用多個Office2007文件格式選項,從而致使使用該選項時功能較低的Office2007電子表格。

Excel 5(BIFF)文件格式

Xls文件格式是舊的Excel文件格式,已在PhpSpreadsheet中實現,以提供統一的方式來建立.xlsx和.xls文件。它基本上是PEAR Spreadsheet_Excel_Writer的修改版本,儘管它已被擴展而且比舊的PEAR庫具備更少的限制和更多的功能。這能夠經過BIFF8讀取全部使用OLE2的BIFF版本:BIFF5(由Office 95引入),但不能讀取早期版本。

Xls文件格式將再也不進行開發,它只是爲PhpSpreadsheet提供了其餘文件格式。

Excel5(BIFF)限制請注意,BIFF文件格式在樣式設置單元格和經過PHP處理大型電子表格方面有一些限制。

\ PhpOffice \ PhpSpreadsheet \ Reader \ Xls

閱讀電子表格

您可使用如下代碼讀取.xls文件:

$reader = new \PhpOffice\PhpSpreadsheet\Reader\Xls(); $spreadsheet = $reader->load("05featuredemo.xls"); 

僅讀取數據

您能夠在閱讀器上設置選項setReadDataOnly,以指示閱讀器忽略樣式,數據驗證等,而僅讀取單元格數據:

$reader = new \PhpOffice\PhpSpreadsheet\Reader\Xls(); $reader->setReadDataOnly(true); $spreadsheet = $reader->load("05featuredemo.xls"); 

僅閱讀特定的工做表

您能夠在閱讀器上設置選項setLoadSheetsOnly,以指示閱讀器僅加載具備給定名稱的圖紙:

$reader = new \PhpOffice\PhpSpreadsheet\Reader\Xls(); $reader->setLoadSheetsOnly(["Sheet 1", "My special sheet"]); $spreadsheet = $reader->load("05featuredemo.xls"); 

僅讀取特定的單元格

您能夠在閱讀器上設置選項setReadFilter,以指示閱讀器僅加載與給定規則匹配的單元格。讀取過濾器能夠是任何實現的類 \PhpOffice\PhpSpreadsheet\Reader\IReadFilter默認狀況下,使用讀取全部單元格\PhpOffice\PhpSpreadsheet\Reader\DefaultReadFilter

如下代碼將僅讀取Excel文件中任何工做表的第1行和第20至30行:

class MyReadFilter implements \PhpOffice\PhpSpreadsheet\Reader\IReadFilter { public function readCell($column, $row, $worksheetName = '') { // Read title row and rows 20 - 30 if ($row == 1 || ($row >= 20 && $row <= 30)) { return true; } return false; } } $reader = new \PhpOffice\PhpSpreadsheet\Reader\Xls(); $reader->setReadFilter( new MyReadFilter() ); $spreadsheet = $reader->load("06largescale.xls"); 

\ PhpOffice \ PhpSpreadsheet \ Writer \ Xls

編寫電子表格

您可使用如下代碼編寫.xls文件:

$writer = new \PhpOffice\PhpSpreadsheet\Writer\Xls($spreadsheet); $writer->save("05featuredemo.xls"); 

Excel 2003 XML文件格式

Excel 2003 XML文件格式是能夠在較早版本的Microsoft Excel中使用的文件格式。

Excel 2003 XML限制請注意,Excel 2003 XML格式在樣式設置單元格和經過PHP處理大型電子表格方面有一些限制。

\ PhpOffice \ PhpSpreadsheet \ Reader \ Xml

閱讀電子表格

您可使用如下代碼讀取Excel 2003 .xml文件:

$reader = new \PhpOffice\PhpSpreadsheet\Reader\Xml(); $spreadsheet = $reader->load("05featuredemo.xml"); 

僅讀取特定的單元格

您能夠在閱讀器上設置選項setReadFilter,以指示閱讀器僅加載與給定規則匹配的單元格。讀取過濾器能夠是任何實現的類 \PhpOffice\PhpSpreadsheet\Reader\IReadFilter默認狀況下,使用讀取全部單元格\PhpOffice\PhpSpreadsheet\Reader\DefaultReadFilter

如下代碼將僅讀取Excel文件中任何工做表的第1行和第20至30行:

class MyReadFilter implements \PhpOffice\PhpSpreadsheet\Reader\IReadFilter { public function readCell($column, $row, $worksheetName = '') { // Read title row and rows 20 - 30 if ($row == 1 || ($row >= 20 && $row <= 30)) { return true; } return false; } } $reader = new \PhpOffice\PhpSpreadsheet\Reader\Xml(); $reader->setReadFilter( new MyReadFilter() ); $spreadsheet = $reader->load("06largescale.xml"); 

符號連接(SYLK)是Microsoft文件格式,一般用於在應用程序(尤爲是電子表格)之間交換數據。SYLK文件一般具備.slk後綴。它僅由可顯示的ANSI字符組成,能夠很容易地由其餘應用程序(例如數據庫)建立和處理。

SYLK限制請注意,SYLK文件格式在樣式設置單元格和經過PHP處理大型電子表格方面有一些限制。

\ PhpOffice \ PhpSpreadsheet \ Reader \ Slk

閱讀電子表格

您可使用如下代碼讀取.slk文件:

$reader = new \PhpOffice\PhpSpreadsheet\Reader\Slk(); $spreadsheet = $reader->load("05featuredemo.slk"); 

僅讀取特定的單元格

您能夠在閱讀器上設置選項setReadFilter,以指示閱讀器僅加載與給定規則匹配的單元格。讀取過濾器能夠是任何實現的類 \PhpOffice\PhpSpreadsheet\Reader\IReadFilter默認狀況下,使用讀取全部單元格\PhpOffice\PhpSpreadsheet\Reader\DefaultReadFilter

如下代碼將僅讀取SYLK文件中任何工做表的第1行和第20至30行:

class MyReadFilter implements \PhpOffice\PhpSpreadsheet\Reader\IReadFilter { public function readCell($column, $row, $worksheetName = '') { // Read title row and rows 20 - 30 if ($row == 1 || ($row >= 20 && $row <= 30)) { return true; } return false; } } $reader = new \PhpOffice\PhpSpreadsheet\Reader\Slk(); $reader->setReadFilter( new MyReadFilter() ); $spreadsheet = $reader->load("06largescale.slk"); 

開放/自由辦公室(.ods)

Open Office或Libre Office .ods文件是Open Office或Libre Office Calc文件的標準文件格式。

\ PhpOffice \ PhpSpreadsheet \ Reader \ Ods

閱讀電子表格

您可使用如下代碼讀取.ods文件:

$reader = new \PhpOffice\PhpSpreadsheet\Reader\Ods(); $spreadsheet = $reader->load("05featuredemo.ods"); 

僅讀取特定的單元格

您能夠在閱讀器上設置選項setReadFilter,以指示閱讀器僅加載與給定規則匹配的單元格。讀取過濾器能夠是任何實現的類 \PhpOffice\PhpSpreadsheet\Reader\IReadFilter默認狀況下,使用讀取全部單元格\PhpOffice\PhpSpreadsheet\Reader\DefaultReadFilter

如下代碼將僅讀取Calc文件中任何工做表的第1行和第20至30行:

class MyReadFilter implements \PhpOffice\PhpSpreadsheet\Reader\IReadFilter { public function readCell($column, $row, $worksheetName = '') { // Read title row and rows 20 - 30 if ($row == 1 || ($row >= 20 && $row <= 30)) { return true; } return false; } } $reader = new PhpOffice\PhpSpreadsheet\Reader\Ods(); $reader->setReadFilter( new MyReadFilter() ); $spreadsheet = $reader->load("06largescale.ods"); 

CSV(逗號分隔值)

CSV(逗號分隔值)一般與其餘系統一塊兒用做導入/導出文件格式。PhpSpreadsheet容許讀取和寫入CSV文件。

CSV限制請注意,CSV文件格式在樣式單元格,數字格式等方面有一些限制。

\ PhpOffice \ PhpSpreadsheet \ Reader \ Csv

讀取CSV文件

您可使用如下代碼讀取.csv文件:

$reader = new \PhpOffice\PhpSpreadsheet\Reader\Csv(); $spreadsheet = $reader->load("sample.csv"); 

設置CSV選項

CSV文件一般不是真正的「逗號分隔」,或使用分號(;)做爲分隔符。您能夠\PhpOffice\PhpSpreadsheet\Reader\Csv在讀取CSV文件以前指示 一些選項。

分隔符將被自動檢測,所以在大多數狀況下,無需指定分隔符。可是,若是自動檢測不適合用例,則能夠手動設置。

請注意,\PhpOffice\PhpSpreadsheet\Reader\Csv默認狀況下假定加載的CSV文件是UTF-8編碼的。若是要讀取在Microsoft Office Excel中建立的CSV文件,則正確的輸入編碼多是Windows-1252(CP1252)。始終確保正確設置了輸入編碼。

$reader = new \PhpOffice\PhpSpreadsheet\Reader\Csv(); $reader->setInputEncoding('CP1252'); $reader->setDelimiter(';'); $reader->setEnclosure(''); $reader->setSheetIndex(0); $spreadsheet = $reader->load("sample.csv"); 

閱讀特定的工做表

CSV文件只能包含一個工做表。所以,您能夠指定要從CSV中讀取的工做表:

$reader->setSheetIndex(0); 

讀入現有電子表格

使用CSV文件時,可能會出現要將CSV數據導入到現有Spreadsheet對象中的狀況。如下代碼將CSV文件加載到$spreadsheet包含某些工做表的現有文件中,並導入到第6個工做表中:

$reader = new \PhpOffice\PhpSpreadsheet\Reader\Csv(); $reader->setDelimiter(';'); $reader->setEnclosure(''); $reader->setSheetIndex(5); $reader->loadIntoExisting("05featuredemo.csv", $spreadsheet); 

\ PhpOffice \ PhpSpreadsheet \ Writer \ Csv

編寫CSV文件

您可使用如下代碼編寫.csv文件:

$writer = new \PhpOffice\PhpSpreadsheet\Writer\Csv($spreadsheet); $writer->save("05featuredemo.csv"); 

設置CSV選項

CSV文件一般不是真正的「逗號分隔」,或使用分號(;)做爲分隔符。您能夠\PhpOffice\PhpSpreadsheet\Writer\Csv在編寫CSV文件以前指示 一些選項:

$writer = new \PhpOffice\PhpSpreadsheet\Writer\Csv($spreadsheet); $writer->setDelimiter(';'); $writer->setEnclosure(''); $writer->setLineEnding("\r\n"); $writer->setSheetIndex(0); $writer->save("05featuredemo.csv"); 

寫一個特定的工做表

CSV文件只能包含一個工做表。所以,您能夠指定要寫入CSV的工做表:

$writer->setSheetIndex(0); 

公式預計算

默認狀況下,該編寫器會預先計算電子表格中的全部公式。在大型電子表格上,這可能會很慢,甚至多是沒必要要的。可是,您能夠禁用公式預計算:

$writer = new \PhpOffice\PhpSpreadsheet\Writer\Csv($spreadsheet); $writer->setPreCalculateFormulas(false); $writer->save("05featuredemo.csv"); 

寫入UTF-8 CSV文件

經過編寫BOM表文件頭,能夠將CSV文件標記爲UTF-8。可使用如下代碼啓用此功能:

$writer = new \PhpOffice\PhpSpreadsheet\Writer\Csv($spreadsheet); $writer->setUseBOM(true); $writer->save("05featuredemo.csv"); 

十進制和千位分隔符

若是要導出的工做表包含帶小數或千位分隔符的數字,則在進行導出以前,應考慮要對那些字符使用哪些字符。

默認狀況下,PhpSpreadsheet在服務器的區域設置中查找以決定要使用的字符。可是爲避免出現問題,建議以下所示顯式設置字符。

英文用戶將要在導出以前使用它:

\PhpOffice\PhpSpreadsheet\Shared\StringHelper::setDecimalSeparator('.'); \PhpOffice\PhpSpreadsheet\Shared\StringHelper::setThousandsSeparator(','); 

德國用戶將要使用相反的值。

\PhpOffice\PhpSpreadsheet\Shared\StringHelper::setDecimalSeparator(','); \PhpOffice\PhpSpreadsheet\Shared\StringHelper::setThousandsSeparator('.'); 

請注意,上面的代碼將小數和千位分隔符設置爲全局選項。這也會影響HTML和PDF的導出方式。

的HTML

PhpSpreadsheet容許您以HTML格式讀取或寫入電子表格,以便向PC上沒有電子表格應用程序的任何人快速表示其中的數據,或加載由其餘腳本保存的文件,這些腳本只是建立HTML標記併爲其提供.xls文件擴展。

HTML限制請注意,HTML文件格式在樣式單元格,數字格式等方面有一些限制。

\ PhpOffice \ PhpSpreadsheet \ Reader \ HTML

閱讀電子表格

您可使用如下代碼讀取.html或.htm文件:

$reader = new \PhpOffice\PhpSpreadsheet\Reader\Html(); $spreadsheet = $reader->load("05featuredemo.html"); 

HTML限制請注意,HTML閱讀器仍處於試驗階段,尚不支持乾淨的合併單元格或嵌套表

\ PhpOffice \ PhpSpreadsheet \ Writer \ Html

請注意,\PhpOffice\PhpSpreadsheet\Writer\Html默認狀況下僅輸出第一個工做表。

編寫電子表格

您可使用如下代碼編寫.htm文件:

$writer = new \PhpOffice\PhpSpreadsheet\Writer\Html($spreadsheet); $writer->save("05featuredemo.htm"); 

編寫全部工做表

HTML文件能夠包含一個或多個工做表。若是要將全部工做表都寫到一個HTML文件中,請使用如下代碼:

$writer->writeAllSheets(); 

寫一個特定的工做表

HTML文件能夠包含一個或多個工做表。所以,您能夠指定要寫入HTML的工做表:

$writer->setSheetIndex(0); 

設置HTML文件的圖片根目錄

在某些狀況下,您須要顯式設置所包含映像的根目錄。例如,代替:

html <img src="./images/logo.jpg">

您可能想看看:

<img src="http://www.domain.com/images/logo.jpg"> 

您可使用如下代碼來實現此結果:

$writer->setImagesRoot('http://www.example.com'); 

公式預計算

默認狀況下,該編寫器會預先計算電子表格中的全部公式。在大型電子表格上,這可能會很慢,甚至多是沒必要要的。可是,您能夠禁用公式預計算:

$writer = new \PhpOffice\PhpSpreadsheet\Writer\Html($spreadsheet); $writer->setPreCalculateFormulas(false); $writer->save("05featuredemo.htm"); 

將生成的HTML嵌入網頁中

在某些狀況下,您可能但願將生成的HTML嵌入到現有網站中。\ PhpOffice \ PhpSpreadsheet \ Writer \ Html支持僅生成HTML代碼的特定部分,從而使您能夠在網站中使用這些部分。

支持的方法:

  • generateHTMLHeader()
  • generateStyles()
  • generateSheetData()
  • generateHTMLFooter()

這是一個示例,該示例獨立地檢索全部部分並將它們合併到結果HTML頁面中:

<?php $writer = new \PhpOffice\PhpSpreadsheet\Writer\Html($spreadsheet); echo $writer->generateHTMLHeader(); ?> <style> <!-- html { font-family: Times New Roman; font-size: 9pt; background-color: white; } <?php echo $writer->generateStyles(false); // do not write <style> and </style> ?> --> </style> <?php echo $writer->generateSheetData(); echo $writer->generateHTMLFooter(); ?> 

編寫UTF-8 HTML文件

經過編寫BOM表文件頭,能夠將HTML文件標記爲UTF-8。可使用如下代碼啓用此功能:

$writer = new \PhpOffice\PhpSpreadsheet\Writer\Html($spreadsheet); $writer->setUseBOM(true); $writer->save("05featuredemo.htm"); 

十進制和千位分隔符

請參閱「 \PhpOffice\PhpSpreadsheet\Writer\Csv如何控制它們的外觀」部分。

PDF格式

PhpSpreadsheet容許您將電子表格寫入PDF格式,以快速分發表示的數據。

PDF限制請注意,PDF文件格式在樣式單元格,數字格式等方面有一些限制。

\ PhpOffice \ PhpSpreadsheet \ Writer \ Pdf

PhpSpreadsheet的PDF Writer是第三方PDF渲染庫(如TCPDF,mPDF或Dompdf)的包裝。如今,您必須本身安裝PDF渲染庫。但PhpSpreadsheet能夠與許多不一樣的庫一塊兒使用。

當前,支持如下庫:

圖書館 可從下載 PhpSpreadsheet做家
技術合做夥伴 https://github.com/tecnickcom/tcpdf pdf文件
PDF文件 https://github.com/mpdf/mpdf pdf文件
Dompdf https://github.com/dompdf/dompdf Dompdf

不一樣的庫具備不一樣的優勢和缺點。有些生成比其餘格式更好的格式輸出,有些比其餘格式更快或使用更少的內存,而有些生成較小的.pdf文件。他們但願根據本身的狀況使用的是開發人員的選擇。

您可使用其特定名稱實例化writer,以下所示:

$writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Mpdf'); 

或者,您可使用更通用的名稱註冊正在使用的編寫器,所以您沒必要記住選擇的是哪一個庫,而只須要編寫PDF文件便可:

$class = \PhpOffice\PhpSpreadsheet\Writer\Pdf\Mpdf::class; \PhpOffice\PhpSpreadsheet\IOFactory::registerWriter('Pdf', $class); $writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Pdf'); 

或者,您能夠像這樣直接實例化您選擇的做者:

$writer = \PhpOffice\PhpSpreadsheet\Writer\Pdf\Mpdf($spreadsheet); 

定製實施或配置

若是須要受支持的PDF庫的自定義實現或自定義配置。您能夠擴展PDF庫和PDF編寫器,以下所示:

class My_Custom_TCPDF extends TCPDF { // ... } class My_Custom_TCPDF_Writer extends \PhpOffice\PhpSpreadsheet\Writer\Pdf\Tcpdf { protected function createExternalWriterInstance($orientation, $unit, $paperSize) { $instance = new My_Custom_TCPDF($orientation, $unit, $paperSize); // more configuration of $instance return $instance; } } \PhpOffice\PhpSpreadsheet\IOFactory::registerWriter('Pdf', MY_TCPDF_WRITER::class); 

編寫電子表格

一旦肯定了要用於PDF生成的渲染器,就可使用如下代碼編寫.pdf文件:

$writer = new \PhpOffice\PhpSpreadsheet\Writer\Pdf\Mpdf($spreadsheet); $writer->save("05featuredemo.pdf"); 

請注意,\PhpOffice\PhpSpreadsheet\Writer\Pdf默認狀況下僅輸出第一個工做表。

編寫全部工做表

PDF文件能夠包含一個或多個工做表。若是要將全部工做表都寫到一個PDF文件中,請使用如下代碼:

$writer->writeAllSheets(); 

寫一個特定的工做表

PDF文件能夠包含一個或多個工做表。所以,您能夠指定要寫入PDF的工做表:

$writer->setSheetIndex(0); 

公式預計算

默認狀況下,該編寫器會預先計算電子表格中的全部公式。在大型電子表格上,這可能會很慢,甚至多是沒必要要的。可是,您能夠禁用公式預計算:

$writer = new \PhpOffice\PhpSpreadsheet\Writer\Pdf\Mpdf($spreadsheet); $writer->setPreCalculateFormulas(false); $writer->save("05featuredemo.pdf"); 

十進制和千位分隔符

請參閱「 \PhpOffice\PhpSpreadsheet\Writer\Csv如何控制它們的外觀」部分。

從模板生成Excel文件(讀取,修改,寫入)

讀寫器是使您可以從模板生成Excel文件的工具。與從頭開始生成Excel文件相比,這須要更少的編碼工做,尤爲是在您的模板具備許多樣式,頁面設置屬性,標題等的狀況下。

這是一個如何打開模板文件,填寫幾個字段並再次保存的示例:

$spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load('template.xlsx'); $worksheet = $spreadsheet->getActiveSheet(); $worksheet->getCell('A1')->setValue('John'); $worksheet->getCell('A2')->setValue('Smith'); $writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Xls'); $writer->save('write.xls'); 

請注意,能夠加載一個xlsx文件並生成一個xls文件。

從HTML內容生成Excel文件

若是要從預渲染的HTML內容生成Excel文件,則可使用HTML Reader自動進行。當您從將下載/發送給用戶的Web應用程序內容生成Excel文件時,此功能很是有用。

例如:






$htmlString = '<table> <tr> <td>Hello World</td> </tr> <tr> <td>Hello<br />World</td> </tr> <tr> <td>Hello<br>World</td> </tr> </table>'; $reader = new \PhpOffice\PhpSpreadsheet\Reader\Html(); $spreadsheet = $reader->loadFromString($htmlString); $writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Xls'); $writer->save('write.xls');

讀取文件

安全

在讀取電子表格文件時,基於XML的格式(例如OfficeOpen XML,Excel2003 XML,OASIS和Gnumeric)容易受到XML外部實體處理(XXE)注入攻擊。這可能致使:

  • 披露文件是否存在
  • 服務器端請求僞造
  • 命令執行(取決於已安裝的PHP包裝器)

爲了防止這種狀況,默認狀況下,每一個基於XML的閱讀器都將在DOCTYPE中聲明的XML實體進行查找,若是發現任何實體,則會引起異常。

閱讀有關XXE注射的更多信息

加載電子表格文件

加載工做簿文件的最簡單方法是讓PhpSpreadsheet的IO Factory識別文件類型並加載它,並調用該類的靜態load() 方法\PhpOffice\PhpSpreadsheet\IOFactory

$inputFileName = './sampleData/example1.xls'; /** Load $inputFileName to a Spreadsheet Object **/ $spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($inputFileName); 

有關samples/Reader/01_Simple_file_reader_using_IOFactory.php該代碼的有效示例,請參見

load()方法將嘗試識別文件類型,併爲該文件類型實例化加載程序;使用它來加載文件並在Spreadsheet對象中存儲數據和任何格式

該方法根據文件擴展名對加載器進行初始猜想以實例化;但會在實際執行加載以前測試該文件:所以,例如,若是該文件其實是CSV文件或包含HTML標記,但已賦予.xls擴展名(很常見),它將拒絕Xls一般用於.xls文件的加載程序;並使用其餘加載程序測試文件,直到找到合適的加載程序,而後使用該文件讀取文件。

雖然很容易在代碼中實現,但您沒必要擔憂文件類型;這不是加載文件的最有效方法;並且它缺少在實際將文件讀入Spreadsheet對象以前以任何方式配置加載程序的靈活性

建立閱讀器並加載電子表格文件

若是知道須要加載的電子表格文件的文件類型,則能夠實例化該文件類型的新閱讀器對象,而後使用閱讀器的load()方法將文件讀取爲Spreadsheet對象。能夠經過名稱實例化每種不一樣的受支持文件類型的閱讀器對象。可是,若是文件類型不正確(例如,擴展名爲.xls的CSV文件),則可能會獲得沒法預測的結果,儘管一般應捕獲此類異常。

$inputFileName = './sampleData/example1.xls'; /** Create a new Xls Reader **/ $reader = new \PhpOffice\PhpSpreadsheet\Reader\Xls(); // $reader = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx(); // $reader = new \PhpOffice\PhpSpreadsheet\Reader\Xml(); // $reader = new \PhpOffice\PhpSpreadsheet\Reader\Ods(); // $reader = new \PhpOffice\PhpSpreadsheet\Reader\Slk(); // $reader = new \PhpOffice\PhpSpreadsheet\Reader\Gnumeric(); // $reader = new \PhpOffice\PhpSpreadsheet\Reader\Csv(); /** Load $inputFileName to a Spreadsheet Object **/ $spreadsheet = $reader->load($inputFileName); 

有關samples/Reader/02_Simple_file_reader_using_a_specified_reader.php 該代碼的有效示例,請參見

或者,您可使用IO Factory的createReader()方法爲您實例化閱讀器對象,只需告訴它要實例化的閱讀器的文件類型便可。

$inputFileType = 'Xls'; // $inputFileType = 'Xlsx'; // $inputFileType = 'Xml'; // $inputFileType = 'Ods'; // $inputFileType = 'Slk'; // $inputFileType = 'Gnumeric'; // $inputFileType = 'Csv'; $inputFileName = './sampleData/example1.xls'; /** Create a new Reader of the type defined in $inputFileType **/ $reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader($inputFileType); /** Load $inputFileName to a Spreadsheet Object **/ $spreadsheet = $reader->load($inputFileName); 

有關samples/Reader/03_Simple_file_reader_using_the_IOFactory_to_return_a_reader.php 該代碼的有效示例,請參見

若是不肯定文件類型,則能夠IOFactory::identify() 在使用該createReader()方法實例化Reader對象以前,使用該方法標識所需 的閱讀器。

$inputFileName = './sampleData/example1.xls'; /** Identify the type of $inputFileName **/ $inputFileType = \PhpOffice\PhpSpreadsheet\IOFactory::identify($inputFileName); /** Create a new Reader of the type that has been identified **/ $reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader($inputFileType); /** Load $inputFileName to a Spreadsheet Object **/ $spreadsheet = $reader->load($inputFileName); 

有關samples/Reader/04_Simple_file_reader_using_the_IOFactory_to_identify_a_reader_to_use.php 該代碼的有效示例,請參見

電子表格閱讀器選項

爲要加載的工做簿建立閱讀器對象後,您將有機會在執行該load()方法以前設置其餘選項

從電子表格文件中僅讀取數據

若是您只對工做簿中的單元格值感興趣,而又不須要任何單元格格式信息,則可使用該setReadDataOnly()方法將讀取器設置爲僅讀取每一個單元格中的數據值和任何公式 

$inputFileType = 'Xls'; $inputFileName = './sampleData/example1.xls'; /** Create a new Reader of the type defined in $inputFileType **/ $reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader($inputFileType); /** Advise the Reader that we only want to load cell data **/ $reader->setReadDataOnly(true); /** Load $inputFileName to a Spreadsheet Object **/ $spreadsheet = $reader->load($inputFileName); 

有關samples/Reader/05_Simple_file_reader_using_the_read_data_only_option.php 該代碼的有效示例,請參見

重要的是要注意,工做簿(和PhpSpreadsheet)將日期和時間存儲爲簡單的數字值:它們只能經過應用於該單元格的格式掩碼與其餘數字值區分開。將只讀數據設置爲true時,PhpSpreadsheet不會讀取單元格格式掩碼,所以沒法區分日期/時間和數字。

即便僅將讀取數據設置爲true,Gnumeric加載器也已編寫爲讀取日期值的格式掩碼,所以能夠區分日期/時間和數字。可是其餘讀者還沒有實現此更改。

從電子表格文件中僅讀取數據適用於讀取器:

讀者 是/否 讀者 是/否 讀者 是/否
Xlsx Xls Xml
奧茲 西爾克 沒有 字母數字
CSV 沒有 的HTML 沒有    

從文件中僅讀取命名的工做表

若是您的工做簿包含許多工做表,可是您僅對閱讀其中一些表感興趣,則可使用該 setLoadSheetsOnly()方法來標識您對閱讀感興趣的那些表。

要讀取一張紙,您能夠將該紙名做爲參數傳遞給setLoadSheetsOnly()方法。

$inputFileType = 'Xls'; $inputFileName = './sampleData/example1.xls'; $sheetname = 'Data Sheet #2'; /** Create a new Reader of the type defined in $inputFileType **/ $reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader($inputFileType); /** Advise the Reader of which WorkSheets we want to load **/ $reader->setLoadSheetsOnly($sheetname); /** Load $inputFileName to a Spreadsheet Object **/ $spreadsheet = $reader->load($inputFileName); 

有關samples/Reader/07_Simple_file_reader_loading_a_single_named_worksheet.php 該代碼的有效示例,請參見

若是您要閱讀的不只僅是一張紙,能夠將紙名列表做爲數組參數傳遞給該setLoadSheetsOnly()方法。

$inputFileType = 'Xls'; $inputFileName = './sampleData/example1.xls'; $sheetnames = ['Data Sheet #1','Data Sheet #3']; /** Create a new Reader of the type defined in $inputFileType **/ $reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader($inputFileType); /** Advise the Reader of which WorkSheets we want to load **/ $reader->setLoadSheetsOnly($sheetnames); /** Load $inputFileName to a Spreadsheet Object **/ $spreadsheet = $reader->load($inputFileName); 

有關samples/Reader/08_Simple_file_reader_loading_several_named_worksheets.php 該代碼的有效示例,請參見

要將此選項重置爲默認值,能夠調用該setLoadAllSheets() 方法。

$inputFileType = 'Xls'; $inputFileName = './sampleData/example1.xls'; /** Create a new Reader of the type defined in $inputFileType **/ $reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader($inputFileType); /** Advise the Reader to load all Worksheets **/ $reader->setLoadAllSheets(); /** Load $inputFileName to a Spreadsheet Object **/ $spreadsheet = $reader->load($inputFileName); 

有關samples/Reader/06_Simple_file_reader_loading_all_worksheets.php該代碼的有效示例,請參見

從文件中僅讀取命名的工做表適用於讀者:

讀者 是/否 讀者 是/否 讀者 是/否
Xlsx Xls Xml
奧茲 西爾克 沒有 字母數字
CSV 沒有 的HTML 沒有    

從文件中僅讀取特定的列和行(讀取過濾器)

若是您只對閱讀工做表的一部分感興趣,則能夠編寫一個篩選器類,該類標識裝入程序是否應讀取單個單元格。讀過濾器必須實現的 \PhpOffice\PhpSpreadsheet\Reader\IReadFilter接口,而且包含一個 readCell()接受的參數的方法$column$row以及 $worksheetName,並返回一個布爾值true或false指示由這些參數肯定的工做簿的小區是否應該讀與否。

$inputFileType = 'Xls'; $inputFileName = './sampleData/example1.xls'; $sheetname = 'Data Sheet #3'; /** Define a Read Filter class implementing \PhpOffice\PhpSpreadsheet\Reader\IReadFilter */ class MyReadFilter implements \PhpOffice\PhpSpreadsheet\Reader\IReadFilter { public function readCell($column, $row, $worksheetName = '') { // Read rows 1 to 7 and columns A to E only if ($row >= 1 && $row <= 7) { if (in_array($column,range('A','E'))) { return true; } } return false; } } /** Create an Instance of our Read Filter **/ $filterSubset = new MyReadFilter(); /** Create a new Reader of the type defined in $inputFileType **/ $reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader($inputFileType); /** Tell the Reader that we want to use the Read Filter **/ $reader->setReadFilter($filterSubset); /** Load only the rows and columns that match our filter to Spreadsheet **/ $spreadsheet = $reader->load($inputFileName); 

有關samples/Reader/09_Simple_file_reader_using_a_read_filter.php該代碼的有效示例,請參見

此示例不是特別有用,由於它只能在很是特殊的狀況下使用(當您只但願工做表中的A1:E7範圍內的單元格時。通用的讀取過濾器可能會更有用:

/** Define a Read Filter class implementing \PhpOffice\PhpSpreadsheet\Reader\IReadFilter */ class MyReadFilter implements \PhpOffice\PhpSpreadsheet\Reader\IReadFilter { private $startRow = 0; private $endRow = 0; private $columns = []; /** Get the list of rows and columns to read */ public function __construct($startRow, $endRow, $columns) { $this->startRow = $startRow; $this->endRow = $endRow; $this->columns = $columns; } public function readCell($column, $row, $worksheetName = '') { // Only read the rows and columns that were configured if ($row >= $this->startRow && $row <= $this->endRow) { if (in_array($column,$this->columns)) { return true; } } return false; } } /** Create an Instance of our Read Filter, passing in the cell range **/ $filterSubset = new MyReadFilter(9,15,range('G','K')); 

有關samples/Reader/10_Simple_file_reader_using_a_configurable_read_filter.php 該代碼的有效示例,請參見

經過容許您以「塊」形式讀取和處理大型工做簿,這對於節省內存特別有用:例如,當將數據從Excel工做表傳輸到數據庫時,這種用法的一個例子。

$inputFileType = 'Xls'; $inputFileName = './sampleData/example2.xls'; /** Define a Read Filter class implementing \PhpOffice\PhpSpreadsheet\Reader\IReadFilter */ class ChunkReadFilter implements \PhpOffice\PhpSpreadsheet\Reader\IReadFilter { private $startRow = 0; private $endRow = 0; /** Set the list of rows that we want to read */ public function setRows($startRow, $chunkSize) { $this->startRow = $startRow; $this->endRow = $startRow + $chunkSize; } public function readCell($column, $row, $worksheetName = '') { // Only read the heading row, and the configured rows if (($row == 1) || ($row >= $this->startRow && $row < $this->endRow)) { return true; } return false; } } /** Create a new Reader of the type defined in $inputFileType **/ $reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader($inputFileType); /** Define how many rows we want to read for each "chunk" **/ $chunkSize = 2048; /** Create a new Instance of our Read Filter **/ $chunkFilter = new ChunkReadFilter(); /** Tell the Reader that we want to use the Read Filter **/ $reader->setReadFilter($chunkFilter); /** Loop to read our worksheet in "chunk size" blocks **/ for ($startRow = 2; $startRow <= 65536; $startRow += $chunkSize) { /** Tell the Read Filter which rows we want this iteration **/ $chunkFilter->setRows($startRow,$chunkSize); /** Load only the rows that match our filter **/ $spreadsheet = $reader->load($inputFileName); // Do some processing here } 

有關samples/Reader/12_Reading_a_workbook_in_chunks_using_a_configurable_read_filter_ 該代碼的有效示例,請參見

使用讀取過濾器適用於:

讀者 是/否 讀者 是/否 讀者 是/否
Xlsx Xls Xml
奧茲 西爾克 沒有 字母數字
CSV 的HTML 沒有    

將多個文件合併到一個電子表格對象中

雖然您可使用該setLoadSheetsOnly()方法限制從工做簿文件中讀取的工做表的數量,但某些閱讀器還容許您未來自不一樣文件的多個單獨的「工做表」組合到單個Spreadsheet對象中,其中每一個單獨的文件都是該工做簿中的單個工做表。對於您閱讀的每一個文件,您須要使用的setSheetIndex()方法來指示應將其加載到哪一個工做表索引中$reader,而後使用 loadIntoExisting()方法而不是將該load()方法實際將文件讀入該工做表中。

$inputFileType = 'Csv'; $inputFileNames = [ './sampleData/example1.csv', './sampleData/example2.csv' './sampleData/example3.csv' ]; /** Create a new Reader of the type defined in $inputFileType **/ $reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader($inputFileType); /** Extract the first named file from the array list **/ $inputFileName = array_shift($inputFileNames); /** Load the initial file to the first worksheet in a `Spreadsheet` Object **/ $spreadsheet = $reader->load($inputFileName); /** Set the worksheet title (to the filename that we've loaded) **/ $spreadsheet->getActiveSheet() ->setTitle(pathinfo($inputFileName,PATHINFO_BASENAME)); /** Loop through all the remaining files in the list **/ foreach($inputFileNames as $sheet => $inputFileName) { /** Increment the worksheet index pointer for the Reader **/ $reader->setSheetIndex($sheet+1); /** Load the current file into a new worksheet in Spreadsheet **/ $reader->loadIntoExisting($inputFileName,$spreadsheet); /** Set the worksheet title (to the filename that we've loaded) **/ $spreadsheet->getActiveSheet() ->setTitle(pathinfo($inputFileName,PATHINFO_BASENAME)); } 

有關samples/Reader/13_Simple_file_reader_for_multiple_CSV_files.php該代碼的有效示例,請參見

請注意,對多個工做表使用相同的工做表索引不會將文件追加到同一工做表中,但會覆蓋先前加載的結果。您不能將多個CSV文件加載到同一工做表中。

將多個文件合併爲一個電子表格對象適用於:

讀者 是/否 讀者 是/否 讀者 是/否
Xlsx 沒有 Xls 沒有 Xml 沒有
奧茲 沒有 西爾克 字母數字 沒有
CSV 的HTML 沒有    

將讀取過濾器與將setSheetIndex()大型CSV文件拆分爲多個工做表方法相結合

Xls BIFF .xls文件在工做表中限制爲65536行,而Xlsx Microsoft Office Open XML SpreadsheetML .xlsx文件在工做表中限制爲1,048,576行;可是CSV文件不受可用磁盤空間的限制。這意味着咱們一般沒法從超大型CSV文件中讀取超過這些限制的全部行,並將其另存爲Xls或Xlsx文件。可是,經過使用「讀取過濾器」讀取「塊」中的CSV文件(使用咱們在上一節中定義的ChunkReadFilter類和的setSheetIndex()方法$reader,咱們能夠將CSV文件拆分爲幾個單獨的工做表。

$inputFileType = 'Csv'; $inputFileName = './sampleData/example2.csv'; echo 'Loading file ',pathinfo($inputFileName,PATHINFO_BASENAME),' using IOFactory with a defined reader type of ',$inputFileType,'<br />'; /** Create a new Reader of the type defined in $inputFileType **/ $reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader($inputFileType); /** Define how many rows we want to read for each "chunk" **/ $chunkSize = 65530; /** Create a new Instance of our Read Filter **/ $chunkFilter = new ChunkReadFilter(); /** Tell the Reader that we want to use the Read Filter **/ /** and that we want to store it in contiguous rows/columns **/ $reader->setReadFilter($chunkFilter) ->setContiguous(true); /** Instantiate a new Spreadsheet object manually **/ $spreadsheet = new \PhpOffice\PhpSpreadsheet\Spreadsheet(); /** Set a sheet index **/ $sheet = 0; /** Loop to read our worksheet in "chunk size" blocks **/ /** $startRow is set to 2 initially because we always read the headings in row #1 **/ for ($startRow = 2; $startRow <= 1000000; $startRow += $chunkSize) { /** Tell the Read Filter which rows we want to read this loop **/ $chunkFilter->setRows($startRow,$chunkSize); /** Increment the worksheet index pointer for the Reader **/ $reader->setSheetIndex($sheet); /** Load only the rows that match our filter into a new worksheet **/ $reader->loadIntoExisting($inputFileName,$spreadsheet); /** Set the worksheet title for the sheet that we've justloaded) **/ /** and increment the sheet index as well **/ $spreadsheet->getActiveSheet()->setTitle('Country Data #'.(++$sheet)); } 

有關samples/Reader/14_Reading_a_large_CSV_file_in_chunks_to_split_across_multiple_worksheets.php 該代碼的有效示例,請參見

此代碼將從咱們正在加載的CSV文件中一次讀取65,530行,並將每一個「塊」存儲在新的工做表中。

setContiguous()這裏,閱讀器方法很重要。它僅在使用「讀取過濾器」時適用,並標識是否應按單元在CSV文件中的位置或相對於過濾器的位置存儲單元。

例如,若是過濾器對B2:C3範圍內的單元格返回true,則將setContiguous設置爲false(默認值),這些將做爲B2:C3加載到Spreadsheet對象中。可是將setContiguous設置爲true時,它們將被加載爲A1:B2。

在多個工做表中拆分單個加載的文件適用於:

讀者 是/否 讀者 是/否 讀者 是/否
Xlsx 沒有 Xls 沒有 Xml 沒有
奧茲 沒有 西爾克 沒有 字母數字 沒有
CSV 的HTML 沒有    

管道或製表符分隔值文件

CSV加載程序將嘗試自動檢測文件中使用的分隔符。若是沒法自動檢測,它將默認爲逗號。若是這不適合您的用例,則可使用setDelimiter() 方法手動指定分隔符

$inputFileType = 'Csv'; $inputFileName = './sampleData/example1.tsv'; /** Create a new Reader of the type defined in $inputFileType **/ $reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader($inputFileType); /** Set the delimiter to a TAB character **/ $reader->setDelimiter("\t"); // $reader->setDelimiter('|'); /** Load the file to a Spreadsheet Object **/ $spreadsheet = $reader->load($inputFileName); 

有關samples/Reader/15_Simple_file_reader_for_tab_separated_value_file_using_the_Advanced_Value_Binder.php 該代碼的有效示例,請參見

除了定界符以外,您還可使用如下方法來設置數據加載的其餘屬性:

方法 默認
setEnclosure() "
setInputEncoding() UTF-8

設置CSV分隔符適用於:

讀者 是/否 讀者 是/否 讀者 是/否
Xlsx 沒有 Xls 沒有 Xml 沒有
奧茲 沒有 西爾克 沒有 字母數字 沒有
CSV 的HTML 沒有    

簡要介紹高級價值粘結劑

從不包含格式信息的文件(例如CSV文件)中加載數據時,數據將以字符串或數字(浮點數或整數)的形式讀取。這意味着PhpSpreadsheet不會自動將日期/時間(例如16-Apr-200913:30),布爾值(truefalse),百分比(75%),超連接(https://www.example.com)等識別爲簡單字符串之外的任何內容。可是,能夠在Value Binder的加載過程當中應用針對這些值執行的其餘處理。

值綁定器是實現\PhpOffice\PhpSpreadsheet\Cell\IValueBinder接口的類 它必須包含一個 bindValue()接受a \PhpOffice\PhpSpreadsheet\Cell\Cell和一個值做爲參數的方法,並返回一個布爾值truefalse指示是否已使用該值填充工做簿單元格。Advanced Value Binder實現了這樣一個類:在其餘測試中,它標識包含「 TRUE」或「 FALSE」(基於區域設置)的字符串,並將其設置爲布爾值;或科學格式的數字(例如「 1.234e-5」)並將其轉換爲浮點數;或日期和時間,將它們轉換爲Excel時間戳值–在將值存儲在單元格對象中以前。它還爲標識爲日期,時間或百分比的字符串設置格式。當它遇到超連接或CSV文件中的HTML標記時,能夠輕鬆擴展它以提供其餘處理(包括文本或單元格格式)。

所以,使用Value Binder能夠在讀取未格式化的文本文件時在加載程序邏輯中提供更大的靈活性。

/** Tell PhpSpreadsheet that we want to use the Advanced Value Binder **/ \PhpOffice\PhpSpreadsheet\Cell\Cell::setValueBinder( new \PhpOffice\PhpSpreadsheet\Cell\AdvancedValueBinder() ); $inputFileType = 'Csv'; $inputFileName = './sampleData/example1.tsv'; $reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader($inputFileType); $reader->setDelimiter("\t"); $spreadsheet = $reader->load($inputFileName); 

有關samples/Reader/15_Simple_file_reader_for_tab_separated_value_file_using_the_Advanced_Value_Binder.php 該代碼的有效示例,請參見

使用Value Binder進行加載適用於:

讀者 是/否 讀者 是/否 讀者 是/否
Xlsx 沒有 Xls 沒有 Xml 沒有
奧茲 沒有 西爾克 沒有 字母數字 沒有
CSV 的HTML    

錯誤處理

固然,您也應該始終對腳本執行一些錯誤處理。PhpSpreadsheet會引起異常,所以您能夠將訪問庫方法的全部代碼包裝在Try / Catch塊中,以捕獲遇到的任何問題,並以適當的方式進行處理。

PhpSpreadsheet讀取器將引起一個 \PhpOffice\PhpSpreadsheet\Reader\Exception

$inputFileName = './sampleData/example-1.xls'; try { /** Load $inputFileName to a Spreadsheet Object **/ $spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($inputFileName); } catch(\PhpOffice\PhpSpreadsheet\Reader\Exception $e) { die('Error loading file: '.$e->getMessage()); } 

有關samples/Reader/16_Handling_loader_exceptions_using_TryCatch.php該代碼的有效示例,請參見

輔助方法

您可使用Reader的listWorksheetNames() 方法檢索文件中包含的工做表名稱列表,而無需加載整個文件一樣,一種listWorksheetInfo()方法將檢索文件中工做表的尺寸,而無需加載和解析整個文件。

listWorksheetNames

listWorksheetNames()方法返回一個簡單的數組,列出工做簿中的每一個工做表名稱:

$reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader($inputFileType); $worksheetNames = $reader->listWorksheetNames($inputFileName); echo '<h3>Worksheet Names</h3>'; echo '<ol>'; foreach ($worksheetNames as $worksheetName) { echo '<li>', $worksheetName, '</li>'; } echo '</ol>'; 

有關samples/Reader/18_Reading_list_of_worksheets_without_loading_entire_file.php 該代碼的有效示例,請參見

listWorksheetInfo

listWorksheetInfo()方法返回一個嵌套數組,每一個條目列出工做表的名稱和尺寸:

$reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader($inputFileType); $worksheetData = $reader->listWorksheetInfo($inputFileName); echo '<h3>Worksheet Information</h3>'; echo '<ol>'; foreach ($worksheetData as $worksheet) { echo '<li>', $worksheet['worksheetName'], '<br />'; echo 'Rows: ', $worksheet['totalRows'], ' Columns: ', $worksheet['totalColumns'], '<br />'; echo 'Cell Range: A1:', $worksheet['lastColumnLetter'], $worksheet['totalRows']; echo '</li>'; } echo '</ol>'; 

有關samples/Reader/19_Reading_worksheet_information_without_loading_entire_file.php 該代碼的有效示例,請參見

相關文章
相關標籤/搜索