Importer des données Excel à partir de cellules Excel spécifiquesJ'ai une situation où les données que j'ai besoin d'analyser dans JMP sont stockées un peu au hasard dans un fichier Excel.Heureusement, je peux facilement obtenir une liste des cellules Excel dans lesquelles se trouvent les données, et j'aimerais automatiser avec JSL l'importation de ces valeurs.Je cherche des idées sur la façon de le faire de manière efficace et efficiente.
Par exemple, disons que les données dont j'ai besoin dans une seule colonne dans JMP sont stockées dans ces cellules Excel
E284, E400, E507, D615, E727, D852, E1003, E1114, D1220, D1339, E1493
J'ai essayé d'utiliser Open() et de spécifier la feuille de calcul, en commençant la ligne, la ligne de fin, la colonne de début, la colonne de fin pour obtenir chaque valeur dans un fichier JMP avec une seule ligne/colonne, par exemple
Open(
"C:\temp\worksheet.xlsx",
Worksheets( "sheet1" ),
Use for all sheets( 0 ),
Concatenate Worksheets( 0 ),
Create Concatenation Column( 0 ),
Worksheet Settings(
1,
Has Column Headers( 0 ),
Number of Rows in Headers( 1 ),
Headers Start on Row( 1 ),
Data Starts on Row( 284 ), // get data on row 284
Data Starts on Column( 5 ), // get data on column "E" (the fifth column)
Data Ends on Row( 284 ), // get data on row 284
Data Ends on Column( 5 ), // get data on column "E" (the fifth column)
Replicated Spanned Rows( 1 ),
Replicated Spanned Headers( 0 ),
Suppress Hidden Rows( 1 ),
Suppress Hidden Columns( 1 ),
Suppress Empty Columns( 1 ),
Treat as Hierarchy( 0 ),
Multiple Series Stack( 0 ),
Import Cell Colors( 0 ),
Limit Column Detect( 0 ),
Column Separator String( "-" )
)
)
J'obtiendrais alors un fichier de données séparé pour chaque valeur que je souhaite récupérer à partir d'une cellule spécifique, puis je rassemblerais les valeurs dans les fichiers JMP séparés dans une seule table de données dans une colonne.
Un problème auquel je suis confronté est qu'il semble que lorsque vous ouvrez un fichier Excel, toutes les lignes vides en haut de la feuille de calcul Excel sont ignorées ?Ainsi, la ligne 1 n'est pas vraiment la ligne 1 à moins qu'il y ait des données dans la ligne 1. Est-ce vrai ?
Toute autre idée serait utile.
ScriptRe : Importer des données Excel à partir de cellules Excel spécifiquesJ'ai trouvé une solution de contournement plus facile dans Excel.Il existe une fonction INDIRECT(cellref) dans Excel que vous utilisez pour obtenir un résultat à partir d'une cellule spécifique.J'ai donc pu créer une nouvelle feuille Excel et créer des colonnes qui indiquent la feuille et la cellule dans lesquelles se trouvent les données et utiliser la fonction INDIRECT pour obtenir un tableau des résultats dont j'avais besoin pour l'analyse.
Je pense cependant que ce problème met en évidence certaines améliorations nécessaires pour l'importation Excel dans JMP.
Re : Importer des données Excel à partir de cellules Excel spécifiquesVoici un exemple (probablement de meilleures façons d'analyser XML mais les fonctions de correspondance de modèles font le travail pour moi :
/*----------------------------------------------------------------------
Method: getWorksheets
----------------------------------------------------------------------*/
getWorksheets = method({username=1},
// this technique (including the overhead of creating the class,
// is >300 x faster than getExcelWorksheets on Mac
// and >100 x faster on Windows
workbook = "xl/workbook.xml";
za = open(_excelFilePath,zip);
contents = za<<READ>>sheet + "\!""
+ " sheetId=\!"" + PatRepeat(PatNotAny("\!"")) + "\!""
+ (" r:id=\!"" + PatRepeat(PatNotAny("\!"")) + "\!"" | " state=\!"hidden\!"" + " r:id=\!"" + PatRepeat(PatNotAny("\!"")) + "\!"")>>x;
ismatch = 1;
lstWorksheets = {};
while(ismatch,
ismatch = patmatch(contents,pat,"");
if (!contains(x,"hidden"),
substituteinto(sheet,"&","&");
if (!contains(lstWorksheets,sheet),
insertinto(lstWorksheets,sheet)
)
)
);
return(lstWorksheets);
),</READ>Re : Importer des données Excel à partir de cellules Excel spécifiquesC'est une idée intéressante.Je n'avais aucune idée de ce qu'il y avait "sous le capot" d'un fichier XLSX.
Re : Importer des données Excel à partir de cellules Excel spécifiquesC'est un hack un peu extrême, bien que j'utilise des techniques similaires pour créer des fichiers PPTX et DOC...
XLSX est juste un fichier zip contenant des fichiers XML.Vous pouvez utiliser le XML pour référencer les coordonnées des cellules :

Vous pouvez utiliser ZipArchive pour accéder aux fichiers XML.
Re : Importer des données Excel à partir de cellules Excel spécifiquesJe viens de me rappeler que, oui, pour une feuille de calcul Excel avec des cellules vides en haut de la feuille, ces lignes sont ignorées.Voir https://www.jmp.com/support/notes/60/026.html
et Amélioration de l'importation Excel : Afficher les numéros de ligne et les étiquettes de colonne dans l'aperçu de l'importation
Re : Importer des données Excel à partir de cellules Excel spécifiquesLa réponse simple est "non".Si s'il y avait un autre moyen de référencer l'emplacement des données, j'essaierais votre approche, mais dans ce cas, la référence de cellule Excel est le principal moyen de trouver les données.
Re : Importer des données Excel à partir de cellules Excel spécifiquesAvez-vous des informations que vous pouvez utiliser pour identifier les cellules autres que la référence de cellule Excel.Par exemple, peut-être une étiquette de champ ?Je charge généralement les données d'Excel dans JMP avec un traitement minimal, puis je parcours simplement les lignes et les colonnes à la recherche d'informations clés.Généralement, la première analyse identifiera la colonne qui contient les étiquettes de champ qui m'intéressent, et la seconde analyse chargera ensuite les valeurs de champ.De cette façon, je peux créer soit des listes de données à partir desquelles je peux construire une table, soit des informations d'en-tête que je peux définir comme variables de table.
Par exemple - analyse pour trouver une colonne contenant une étiquette de champ spécifique
identifier = "Description";
cols = dt<<GETCOLUMNNAMES> </GETCOLUMNNAMES>
Et puis la recherche de champs
fields = [=>];
fields["Description"] = 0;
fields["USL"] = 0;
fields["LSL"] = 0;
fields["Nominal"] = 0;
keys = fields << getKeys;
for (i=1,i<=nitems(keys),i++,
field = keys[i];
success = 0;
for (r=1,r<=nrow(dt),r++,
cell = column(dt,lblCol)[r];
if (contains(cell,field),
success = 1;
fields[field] = r;
break()
)
)
);