如何从php中的excel文件中读取数据

时间:2014-06-07 12:54:14

标签: php phpexcel

我从一个网站下载一个excel文件,并希望用PHP导入它的html文件中的数据,我使用PHPEXCEL库,但我的代码无法正常工作,除非我打开我的excel文件并手动保存,之后php代码可以从中读取数据并导入html文件中的数据。 我该如何自动完成这个过程?

我的代码:

<?PHP
    require_once ('Classes/PHPExcel.php');
    $file="sample.xlsx";
    $inputFileName = $file;
    $objPHPExcel = PHPExcel_IOFactory::load($inputFileName);

    $sheet = $objPHPExcel->getActiveSheet();
    $row = $objPHPExcel->getActiveSheet()->getHighestRow();
    for($i=1;$i<=$row;$i++){
        $cell = $sheet->getCell('A'.$i);
        if($cell=='test'){
            $find=1;
            break;
        }
    }
    if($find==1){
        $rownumber=$i;
        $row = $objPHPExcel->getActiveSheet()->getRowIterator($rownumber)->current();
        $cellIterator = $row->getCellIterator();
        $cellIterator->setIterateOnlyExistingCells(false);
        foreach ($cellIterator as $key => $cell) {
            $data[$j]=round($cell->getCalculatedValue(),2);
            $j++;
        }   
        $output="<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
                    <table width='95%' class='bourse'>
                    <tr><td colspan='2' bgcolor='#F2F2F2'>$header</td></tr>";
        for($i=2;$i< $j-1 ;$i++){
            $output.="<tr><td>".$data[$i]."</font></td></tr>";
        }
        $output.="</table></div>";
        //echo  $output;
        file_put_contents('sample.html',$output);
    }

    ?>

3 个答案:

答案 0 :(得分:2)

问题是您下载的文件在标准MS Excel文件没有使用时会使用命名空间。

例如(标准MS Excel文件)

<?xml version="1.0" encoding="UTF-8" standalone="true"?>
<workbook xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xml:space="preserve">
    <fileVersion rupBuild="4505" lowestEdited="4" lastEdited="4" appName="xl"/>
    <workbookPr codeName="ThisWorkbook"/>
    <bookViews>
        <workbookView visibility="visible" tabRatio="600" showVerticalScroll="1" showSheetTabs="1" showHorizontalScroll="1" minimized="0" firstSheet="0" autoFilterDateGrouping="1" activeTab="0"/>
    </bookViews>
    <sheets>
        <sheet r:id="rId4" sheetId="1" name="Simple"/>
    </sheets>
    <definedNames/>
    <calcPr fullCalcOnLoad="0" calcMode="auto" calcId="124519"/>
</workbook>

您的档案:

<?xml version="1.0" encoding="UTF-8"?>
<x:workbook xmlns:x="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
    <x:bookViews>
        <x:workbookView/>
    </x:bookViews>
    <x:sheets>
        <x:sheet xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" r:id="R87019d29e03f45b0" sheetId="1" name="دیده بان بازار"/>
    </x:sheets>
</x:workbook>

注意每个元素的x:前缀;行xmlns:x="http://schemas.openxmlformats.org/spreadsheetml/2006/main"x定义http://schemas.openxmlformats.org/spreadsheetml/2006/main的命名空间,而在标准MS Excel文件中,这只是xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"http://schemas.openxmlformats.org/spreadsheetml/2006/main设置为$xmlStyles = simplexml_load_string($this->_getFromZipArchive($zip, "$dir/$xpath[Target]"), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions()); //~ http://schemas.openxmlformats.org/spreadsheetml/2006/main"); 的默认命名空间文件

这个

没有简洁明了的解决方案

一个肮脏的解决方案是修改Excel2007 Reader。假设您正在使用PHPExcel 1.8.0

更改第505行
$xmlStyles = simplexml_load_string(preg_replace('/\bx:/','',$this->_getFromZipArchive($zip, "$dir/$xpath[Target]")), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions()); //~ http://schemas.openxmlformats.org/spreadsheetml/2006/main");

$xmlWorkbook = simplexml_load_string($this->_getFromZipArchive($zip, "{$rel['Target']}"), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions());  //~ http://schemas.openxmlformats.org/spreadsheetml/2006/main");

更改第609行
$xmlWorkbook = simplexml_load_string(preg_replace('/\bx:/','',$this->_getFromZipArchive($zip, "{$rel['Target']}")), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions());  //~ http://schemas.openxmlformats.org/spreadsheetml/2006/main");

$xmlSheet = simplexml_load_string($this->_getFromZipArchive($zip, "$dir/$fileWorksheet"), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions());  //~ http://schemas.openxmlformats.org/spreadsheetml/2006/main");

更改第652行
$xmlSheet = simplexml_load_string(preg_replace('/\bx:/','',$this->_getFromZipArchive($zip, "$dir/$fileWorksheet")), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions());  //~ http://schemas.openxmlformats.org/spreadsheetml/2006/main");

{{1}}

请注意,这是一个黑客,而不是一个修复......它可能会对其他工作簿产生负面影响(虽然我希望它赢了)

答案 1 :(得分:0)

尝试加载这样的文件:

    $inputFileType = PHPExcel_IOFactory::identify($path);
    $objReader = PHPExcel_IOFactory::createReader($inputFileType); //Excel5

    /** @var PHPExcel $objPHPExcel */
    $objPHPExcel = $objReader->load($path);

.....

答案 2 :(得分:0)

我不是PHP程序员的专家。但是我已经将PHPexcel用于了很多工具。

主要问题似乎是文件的第一行,其中所有单元格都已合并。我删除了合并,我的脚本能够毫无问题地读取值。

链接到OP的原始文件(由于原始帖子被删除,此处重新发布): - http://members.tsetmc.com/tsev2/excel/MarketWatchPlus.aspx?d=0

脚本的最低要求: -

  1. 将Excel,PHPExcel.php和此脚本保存在同一目录中

  2. 将PHPExcel库保留在同一目录中。

  3. 请在下面找到我的脚本,该脚本从第4行开始读取第3列中的所有值。

    <?php
    require "PHPExcel.php";
    require "PHPExcel/IOFactory.php";
    
    mb_internal_encoding('UTF-8');
    mb_http_output('UTF-8');
    
    set_time_limit ( 0 );
    
    $fileName = "MarketWatchPlus-1393-3-17.xlsx";
    
    $inputFileType = PHPExcel_IOFactory::identify ( $fileName );
    
    $readerObj = PHPExcel_IOFactory::createReader ( $inputFileType );
    
    $excelFile = $readerObj->load ( $fileName );
    
    // Set active sheet to 0(First Sheet)
    $excelFile->setActiveSheetIndex ( 0 );
    
    $activeSheet = $excelFile->getActiveSheet();
    
    // Get the highest row in the file( for looping purposes )
    $highestRow = $activeSheet->getHighestRow();
    
    $currentRow = 4;
    
    echo "<html><body>";
    
    while ( $currentRow <= 100 ) {
    
        // Column numbers start with 0. A => 0, B => 1 .. and so on.
    
        $value = $activeSheet->getCellByColumnAndRow ( 2, $currentRow );
    
                // Convert to string
        $value = $value."";
    
        echo "<p>".$value."</p>";
    
        $currentRow++;
    
    }
    
    echo "</body></html>";
    
    exit();
    
    ?>