0

我在 php 中读取 xls 文件时遇到了一个大问题。

在此页面上,您可以下载包含有关此 etf 的一些信息的 xls 文件: http ://www.ishares.com/de/qualifizierte-investoren/de/produkte/253743/ishares-sp-500-b-ucits-etf- acc-fund?siteEntryPassthrough=true

该文件可以在这里下载: http ://www.ishares.com/de/qualifizierte-investoren/de/253743/fund-download.dl

通过运行此脚本,我得到错误的输出:

<?php

    error_reporting(0);

/*
 * PHP Excel - Read a simple 2007 XLSX Excel file
 */

/** Set default timezone (will throw a notice otherwise) */
date_default_timezone_set('America/Los_Angeles');

include 'Classes/PHPExcel/IOFactory.php';

$inputFileName = 'etf.xls';

//  Read your Excel workbook
try {
    $inputFileType = PHPExcel_IOFactory::identify($inputFileName);
    $objReader = PHPExcel_IOFactory::createReader($inputFileType);
    $objPHPExcel = $objReader->load($inputFileName);
} catch (Exception $e) {
    die('Error loading file "' . pathinfo($inputFileName, PATHINFO_BASENAME) 
    . '": ' . $e->getMessage());
}

//  Get worksheet dimensions
$sheet = $objPHPExcel->getSheet(0);
$highestRow = $sheet->getHighestRow();
$highestColumn = $sheet->getHighestColumn();

//  Loop through each row of the worksheet in turn
for ($row = 1; $row <= $highestRow; $row++) {
    //  Read a row of data into an array
    $rowData = $sheet->rangeToArray('A' . $row . ':' . $highestColumn . $row, 
    NULL, TRUE, FALSE);
    foreach($rowData[0] as $k=>$v)
        echo "Row: ".$row."- Col: ".($k+1)." = ".$v."<br />";
}
?>

输出如下所示:

Row: 1- Col: 1 =  Row: 2- Col: 1 = iShares Asia Pacific Dividend UCITS
ETFDer iShares Asia Pacific Dividend UCITS ETF ist ein
börsengehandelter Indexfonds (Exchange Traded Fund, ETF), der
möglichst genau die Wertentwicklung vom Dow Jones Asia/Pacific Select
Dividend 30™ Index abbildet. Der ETF investiert direkt in die im Index
enthaltenen Wertpapiere. Der Dow Jones Asia/Pacific Select Dividend
30™ Index misst die Wertentwicklung von 30 gemessen an der
Dividendenrendite führenden Aktien aus für den Index qualifizierten
Ländern im asiatisch-pazifischen Raum. Der Index ist unter Einbezug
verschiedener Selektionskriterien entsprechend der Dividendenrendite
gewichtet. iShares ETFs sind Fonds, die von BlackRock verwaltet
werden. Sie sind transparente, kosteneffiziente und liquide
Finanzinstrumente, die wie herkömmliche Aktien über die Börse
gehandelt werden. iShares ETFs bieten einen flexiblen und einfachen
Zugang zu einer breiten Auswahl von Märkten und
Anlageklassen.AnlageklasseAktienBasiswährungUSDAuflagedatum02.Jun.2006Wertpapierleiheertrag0.14VergleichsindexDow
Jones Asia / Pacific Select Dividend
30™fundDownload.key-fund-facts.emeaMgt0.59AusschüttungshäufigkeitVierteljährlichDomizilIrlandMethodikReplikationfundDownload.key-fund-facts.productStructureREPLRebalancing-IntervallJährlichUCITSYIm
Rahmen eines ISA zulässigYAls SIPP verfügbarYUK Distributor/Reporting
StatusNein/JaISINIE00B14X4T88fundDownload.key-fund-facts.primaryListingBBEQTICKIAPD
LNFondsmanagerBlackRock Asset Management Ireland
LimitedEmittentiShares plcAdministratorState Street Fund Services
(Ireland) LimitedDepotbankState Street Custodial Services (Ireland)
LimitedErtragsverwendungAusschüttungfundDownload.key-fund-facts.creationPrice--fundDownload.key-fund-facts.cancellationPrice--Fondsvermögen423689410.83Anzahl
der Positionen30Umlaufende Anteile1.42E+7Stand
Vergleichsindex683.334057Ausschüttungsrendite6.000000000000000Restlaufzeit--Kupon--Modifizierte
Duration--Effektive Duration--Durchschn.
Konvexität--Effektivverzinsung--Umlaufrendite--Optionsbereinigter
Spread-- Row: 3- Col: 1 = 02-Apr-2015ISINNameSektorLandGewichtung
(%)AU000000MND5MONADELPHOUS GROUP
LTD.IndustrieAustralien9.39669AU000000MTS0METCASH LTDNichtzyklische
KonsumgüterAustralien7.41984AU000000MIN4MINERAL RESOURCES
LTD.IndustrieAustralien5.3448BMG6901M1010GIORDANO INTERNATIONAL
LTD.BasiskonsumgüterHongkong4.72819AU000000WOR2WORLEYPARSONS
LTDEnergieAustralien4.55802NZSKTE0001S6SKY NETWORK TELEVISION
LTDBasiskonsumgüterNeuseeland4.32997AU000000SUN6SUNCORP GROUP
LTDFinancialsAustralien3.8642NZTELE0001S4SPARK NEW ZEALAND
LTDTelekommunikationNeuseeland3.75577AU000000NAB4NATIONAL AUSTRALIA
BANK LTDFinancialsAustralien3.74845AU000000ANZ3AUSTRALIA AND NEW
ZEALAND BANKINGFinancialsAustralien3.64795AU000000WBC1WESTPAC BANKING
CORPORATION CORPFinancialsAustralien3.50675AU000000BEN6BENDIGO AND
ADELAIDE BANK LTDFinancialsAustralien3.48292AU000000CBA7COMMONWEALTH
BANK OF AUSTRALIAFinancialsAustralien3.28729AU000000TLS2TELSTRA
CORPORATION LTDTelekommunikationAustralien3.28606NZSKCE0001S2SKY CITY
ENTERTAINMENT GROUP
LTDBasiskonsumgüterNeuseeland3.27232AU000000AST5AUSNET
SERVICESVersorgerAustralien3.22474AU000000ALQ6ALS
LTDIndustrieAustralien2.83422BMG9400S1329VTECH HOLDINGS
LTDITHongkong2.69633SG1V12936232STARHUB
LTDTelekommunikationSingapur2.34475AU000000SYD9SYDNEY AIRPORT UNITS
LTDIndustrieAustralien2.24656HK0008011667PCCW
LTDTelekommunikationHongkong2.13064SG1T75931496SINGAPORE
TELECOMMUNICATIONS LTDTelekommunikationSingapur2.12468HK0083000502SINO
LAND LTDFinancialsHongkong2.06459SG1I52882764SATS
LTDIndustrieSingapur2.01037HK0011000095HANG SENG BANK
LTDFinancialsHongkong1.94685JP3108450002ACCORDIA GOLF CO
LTDBasiskonsumgüterJapan1.64197JP3428600005TONENGENERAL
SEKIYUEnergieJapan1.56266SG1N89910219SINGAPORE POST
LTDIndustrieSingapur1.55254AU000000AMC4AMCOR
LTDMaterialienAustralien1.52794JP3165650007NTT DOCOMO
INCTelekommunikationJapan1.46001--AUD CASHCash und/oder
DerivateAustralien0.58791--NZD CASHCash und/oder
DerivateNeuseeland0.20539--USD CASHCash und/oder DerivateVereinigte
Staaten0.06899--JPY CASHCash und/oder DerivateJapan0.06431--CASH
COLLATERAL AUD BZFUTCash und/oder DerivateAustralien0.0388--HKD
CASHCash und/oder DerivateHongkong0.03475--SGD CASHCash und/oder
DerivateSingapur0.00183--EUR CASHCash und/oder DerivateEuropäische
Union0--SPI 200 JUN 15Cash und/oder Derivate--0

这是不正确的。
在 excel 中打开文件并保存为新文件后,脚本的输出是正确的,如下所示:

Row: 1- Col: 1 = iShares Asia Pacific Dividend UCITS ETF Row: 1- Col:
2 =  Row: 1- Col: 3 =  Row: 1- Col: 4 =  Row: 1- Col: 5 =  Row: 1-
Col: 6 =  Row: 1- Col: 7 =  Row: 1- Col: 8 =  Row: 1- Col: 9 =  Row:
1- Col: 10 =  Row: 1- Col: 11 =  Row: 1- Col: 12 =  Row: 2- Col: 1 = 
Row: 2- Col: 2 =  Row: 2- Col: 3 =  Row: 2- Col: 4 =  Row: 2- Col: 5 =
Row: 2- Col: 6 =  Row: 2- Col: 7 =  Row: 2- Col: 8 =  Row: 2- Col: 9 =
Row: 2- Col: 10 =  Row: 2- Col: 11 =  Row: 2- Col: 12 =  Row: 3- Col:
1 = Der iShares Asia Pacific Dividend UCITS ETF ist ein
börsengehandelter Indexfonds (Exchange Traded Fund, ETF), der
möglichst genau die Wertentwicklung vom Dow Jones Asia/Pacific Select
Dividend 30™ Index abbildet. Der ETF investiert direkt in die im Index
enthaltenen Wertpapiere. Der Dow Jones Asia/Pacific Select Dividend
30™ Index misst die Wertentwicklung von 30 gemessen an der
Dividendenrendite führenden Aktien aus für den Index qualifizierten
Ländern im asiatisch-pazifischen Raum. Der Index ist unter Einbezug
verschiedener Selektionskriterien entsprechend der Dividendenrendite
gewichtet. iShares ETFs sind Fonds, die von BlackRock verwaltet
werden. Sie sind transparente, kosteneffiziente und liquide
Finanzinstrumente, die wie herkömmliche Aktien über die Börse
gehandelt werden. iShares ETFs bieten einen flexiblen und einfachen
Zugang zu einer breiten Auswahl von Märkten und Anlageklassen. Row: 3-
Col: 2 =  Row: 3- Col: 3 =

似乎没有正确识别行和列?!

有人可以帮我吗?

4

1 回答 1

0

首先要注意的是,该文件不是 BIFF 格式的 xls 文件(尽管扩展名声称),而是 Excel2003 XML 文件。PHPExcel 应该正确识别这种差异(回显 $inputFileType 应该已经确认了这一点)并且应该仍然能够正确读取文件。

但是,仍然存在许多差异:

Excel2003 XML 文件的标准签名是:

<?xml version="1.0"?>
<?mso-application progid="Excel.Sheet"?>

但你的文件有签名

<?xml version="1.0"?>
<ss:Workbook xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">

我进行了修改以允许使用此签名正确识别它并尝试再次加载。


我不知道这个文件是如何生成的,但是 - 详细查看内容 - 它包含无效的 XML,例如:

<?xml version="1.0"?>
<ss:Workbook xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">
    ...
    <ss:Style ss:ID="Date">
        <ss:NumberFormat ss:Format="dd\-mmm\-yyyy"/>
    </Style>  // This should be </ss:Style>
</ss:Styles>

并非文件中的所有数据都已正确编码:

<ss:Data ss:Type="String">Der iShares Core S&P ...</ss:Data>

实体S&P应编码为

<ss:Data ss:Type="String">Der iShares Core S&amp;P ...</ss:Data>

在其他地方(奇怪)是正确的

PHP 的 SimpleXML 加载标记了许多其他错误,特别是 与&auml;&ouml;&uuml;

请注意,在 XML 中有效的唯一“命名”实体(默认情况下)是:

  • &quot;( ")
  • &amp;( &)
  • &apos;( ')
  • &lt;( <)
  • &gt;( >)

如果您希望在 XML 中使用其他命名实体,则必须明确定义它们:

<!ENTITY auml   "&#228;" >
<!ENTITY ouml   "&#246;" >
<!ENTITY uuml   "&#252;" >

如果我用结束style标记修复错误,添加<?mso-application progid="Excel.Sheet"?>,修复对 的引用,并分别S&P替换所有&auml;&ouml;&uuml;,和,以确保它是有效的 XML,然后文件正确加载äöü

于 2015-04-05T12:53:59.603 回答