user451555
user451555

Reputation: 308

PHPExcel different behavior on different systems

I have PHPExcel on localhost and on server. When I try to read xlsx file on localhost - all ok, but when I try to read same file on server - all cells with cyrillic words are empty.

All systems have same PHPExcel and PHP versions.

What could be the problem? Thanks!

Upvotes: 0

Views: 160

Answers (1)

Mark Baker
Mark Baker

Reputation: 212522

The problem with this file is that it was created by an application that doesn't recognise case-sensitivity in filenames.

The rels table indicates that the Shared Strings table (where all the text string values for the workbook are stored) is called sharedStrings.xml, but the actual file in the zip is called SharedStrings.xml. A file generated by MS Excel itself uses the correct case in the filename, so I'm guessing that this file was created using some third-party tool or library. MS Excel is clearly more forgiving about case-sensitivity in filenames, allowing it to read the zip regardless.

I can probably fix this by using

$zip->getFromIndex(
    $zip->locateName('sharedStrings.xml', ZIPARCHIVE::FL_NOCASE);
);

rather than

$zip->getFromName('sharedStrings.xml');

but it will take me a couple of days to implement the fix

EDIT

Somewhere around line 310 of the /PHPExcel/Reader/Excel2007.php file is the getFromZipArchive() method that can be changed to read:

private function getFromZipArchive($archive, $fileName = '')
{
    // Root-relative paths
    if (strpos($fileName, '//') !== false) {
        $fileName = substr($fileName, strpos($fileName, '//') + 1);
    }
    $fileName = PHPExcel_Shared_File::realpath($fileName);

    // Apache POI fixes
    $contents = $archive->getFromIndex(
        $archive->locateName($fileName, ZIPARCHIVE::FL_NOCASE)
    );
    if ($contents === false) {
        $contents = $archive->getFromIndex(
            $archive->locateName(substr($fileName, 1), ZIPARCHIVE::FL_NOCASE)
        );
    }

    return $contents;
}

and will then be able to access the Shared String file case-insensitively

Upvotes: 1

Related Questions