bon moyen de représenter une valeur de feuille Excel en Java
-
21-08-2019 - |
Question
Considérez que j'ai une feuille Excel au format ci-dessous :
personne âgeFoo 29
BAR 27
Maintenant, je veux lire ces valeurs (en utilisant POI HSSF) et dois les traiter.Quelle est la meilleure façon de procéder ?
Notez que je n'ai pas de personne objet dans mon application, car les valeurs qui peuvent apparaître dans la feuille Excel sont arbitraires (c'est-à-direce n'est peut-être pas le nom et l'âge de la personne).Donc, je dois utiliser une sorte de HashMap pour stocker ces valeurs.En cas de plusieurs lignes, est-il bon d'avoir une liste !?
La solution
public class Grid {
private Row headerColumns;
private List<Row> dataRows;
public Grid() {
dataRows = new LinkedList<Row>();
}
public Grid(int rowCount) {
dataRows = new ArrayList<Row>(rowCount);
}
public void addHeaderRow(List<String> headers) {
this.headerColumns = new Row(headers);
}
public void addDataRow(List<String> data) {
this.dataRows.add( new Row(data) );
}
public List<Row> getAllData() {
List<Row> data = new ArrayList<Row>(1+dataRows.size());
data.add(this.headerColumns);
data.addAll(dataRows);
return data;
}
public Row getHeaderColumns() {
return headerColumns;
}
public List<Row> getDataRows() {
return dataRows;
}
}
class Row {
private List<String> data;
public Row(List<String> data) {
this.data = data;
}
public void addColumn(String columnData) {
data.add(columnData);
}
public List<String> getData() {
return data;
}
}
Autres conseils
Si le format est défini, créez une classe qui accueille tous ces champs.
Si le format n'est pas défini, transmettez les lignes, les listes ou même le DOM de la transformation Excel en Dom.Tu n'as pas le choix.Je recommanderais simplement de s'en tenir aux objets Row et Cell natifs de POI.
Oui, vous ne pouvez pas utiliser map si vous avez plusieurs valeurs clés.Et je n'ai pas trouvé de classe intégrée pour ce problème.Vous pouvez essayer d'écrire une sorte de wrapper.Si vous ne vous souciez pas de la vitesse, utilisez un simple tableau 2D comme celui-ci :
String[][] filter = new String[initial width][initial height];
il peut s'agir d'un objet au lieu d'une chaîne ;