Est-il possible d'obtenir les noms de feuille de calcul à partir de 20 MO+ fichiers Excel avec PHPExcel?
Je suis en utilisant PHPExcel de lire des données de fichiers Excel.
Avec le code suivant, je suis capable de lire l'un particulier de la feuille de calcul d'un 3MO fichier Excel en seulement quelques secondes. Fonctionne très bien.
Cependant, j'ai maintenant 27 MO et 88MB Excel fichiers dont j'ai besoin pour obtenir des données. Ils sont tellement gros que même OpenOffice ne peut pas les ouvrir.
J'ai trouvé que je peux utiliser un numéro d'index au lieu d'un nom, lorsque je charge une feuille, mais cela semble incohérent, par exemple, dans un fichier Excel setLoadSheetsOnly(0)
m'a donné l' troisième feuille de setLoadSheetsOnly(1)
m'a donné un erreur même si il y avait quatre feuilles de calcul dans le fichier. De sorte que semble peu fiables pour une raison quelconque.
Est-il une manière que je peux lire les noms des feuilles de calcul à partir d'un fichier de grande taille afin que je puisse accéder à un seul de ses feuilles de calcul en même temps?
$objReader = PHPExcel_IOFactory::createReaderForFile("data/" . $file_name);
$objReader->setLoadSheetsOnly(array($sheet_name));
$objReader->setReadDataOnly(true);
$objPHPExcel = $objReader->load("data/" . $file_name);
echo '<table border="1">';
for ($row = 1; $row < $number_of_rows; $row++) {
echo '<tr>';
for ($column = 0; $column < $number_of_columns; $column++) {
$value = $objPHPExcel->setActiveSheetIndex(0)->getCellByColumnAndRow($column, $row)->getValue();
echo '<td>';
echo $value . ' ';
echo '</td>';
}
echo '</tr>';
}
echo '</table>';
die;
ADDENDUM:
J'ai trouvé un code qui se rapproche, mais il ne semble pas toujours être exactes, par exemple, ici, il a raté la deuxième feuille de calcul dans un 27 MO fichier:
et ici, il a obtenu seulement la troisième feuille de calcul et raté 3 autres:
$objReader = PHPExcel_IOFactory::createReaderForFile("data/" . $file_name);
$objReader->setLoadSheetsOnly(0);
$objReader->setReadDataOnly(true);
$objPHPExcel = $objReader->load("data/" . $file_name);
echo $objPHPExcel->getSheetCount(), ' worksheets<hr/>';
$loadedSheetNames = $objPHPExcel->getSheetNames();
foreach ($loadedSheetNames as $sheetIndex => $loadedSheetName) {
echo $sheetIndex, ' -> ', $loadedSheetName, '<br />';
}
die;
OriginalL'auteur Edward Tanguay | 2010-12-28
Vous devez vous connecter pour publier un commentaire.
Malheureusement, il n'est pas possible de lire les noms des feuilles de calcul sans avoir à charger le fichier en entier.
À l'aide d'un numéro d'index plutôt qu'un nom lors de l'appel de setLoadSheetsOnly() ne donne pas un résultat prévisible: la logique de code qui effectue cette vérification utilise in_array() pour tester si la sheetname qu'il est sur le point de lire est dans le tableau de sheetnames à lire. par exemple,
Je soupçonne que la comparaison d'une chaîne à l'encontre d'une valeur numérique sera de donner un résultat vrai pour 0 == "mySheetName" lors de l'exécution de ce test (basé sur PHP de la dactylographie et de comparaison des règles de conversion).
Je pourrais probablement fournir un Lecteur de méthode qui retourne une liste de noms de feuille de calcul sans réellement le charger tout le fichier, même s'il y aurait un gain de performance en cause.
MODIFIER
Si vous ajoutez la méthode suivante Classes/PHPExcel/Reader/Excel2007.php
Vous pouvez l'appeler en utilisant:
le retour de l' $worksheetNames doit contenir un tableau de tous les noms de feuille de calcul comme des chaînes UTF-8. Parce que c'est seulement la lecture du minimum absolu de la .xlsx pour récupérer ces noms, il devrait être assez rapide. Je vais faire des tests un peu plus avant de vérifier dans le PHPExcel SVN, mais (pour l'instant), il semble faire ce dont vous avez besoin.
EDIT2
Méthode équivalente pour la Excel5 Lecteur
Pas aussi efficace que la Excel2007 Reader version, mais doit encore être plus rapide que l'analyse de l'ensemble .fichier xls juste pour la feuille de noms parce que je ne suis qu'à l'analyse de la mondiale flux de.
J'ai posté une seconde capture d'écran, il manque trois feuilles de calcul dans un fichier de 3 mo. Est-il un moyen pour moi de faire le nom de la feuille de lecture plus précise?
Basé sur le PHP règles de casting... vous êtes paramètre $objReader->setLoadSheetsOnly(0); avant de charger le fichier. Avec dactylographie, 'CODE' == 0 et " DAUER!' == 0, mais 4C ISO' != 0 ('4C ISO' == 4). Si vous n'avez pas défini $objReader->setLoadSheetsOnly(0); puis PHPExcel de ne pas faire ce test, et toutes les feuilles étaient chargés, et $objPHPExcel->getSheetNames() retourne la liste complète.
Je vais être plus rapide de l'écriture d'une méthode pour la Excel2007, devrait être en mesure de frapper quelque chose cet après-midi, Excel5 prendra plus de temps, et je voudrais pour fournir la même fonction, dans les Excel2003XML, OOCalc et Gnumeric Lecteurs (pour la cohérence), mais imaginez que vous n'en avez pas besoin, donc, pas besoin de vitesse avec les écrit ces. Vais voir ce que je peut faire pour vous.
Code de la listWorksheetNames() méthode pour tous les Lecteurs qui prennent en charge plusieurs feuille de calcul classeurs (Excel2007, Excel5, Excel2003XML, OOCalc et Gnumeric) sont tous maintenant dans la PHPExcel dépôt SVN
OriginalL'auteur Mark Baker
Je ne voulais pas modifier phpexcel je suis donc allé avec ceci:
Il ne fonctionne que sur excel 2007 ou plus tard, mais fait ce que j'avais
OriginalL'auteur Mark