Les groupes de colonnes peuvent-ils être modifiés dans un Excel existant avec POI?

J'ai travaillé avec Apache POI depuis quelques mois pour créer une fonctionnalité «Exporter vers / Importer depuis Excel» pour notre application.

Remarque: J'ai utilisé 3.9 mais je n'ai pas commuté à 3.10-FINAL.

Le cas d'utilisation typique est qu'un user télécharge le model vide ou exporte des données existantes vers un file Excel. Il apporte ensuite des modifications aux données et télécharge son file à nouveau.

Pour fournir une rétroaction détaillée pour l'user, nous utilisons son file Excel téléchargé et créez un file de rapport à partir de celui-ci. Ce file de rapport est une copy du file téléchargé avec deux colonnes supplémentaires contenant des informations sur datatables qu'il a imscopes. Un message d'erreur qui lui explique pourquoi ses données n'ont pas été acceptées, par exemple.

Cela nécessite de déplacer toutes les colonnes vers la droite et d'append deux nouvelles colonnes à gauche. J'ai implémenté cela et j'ai même réussi à déplacer les commentaires des cellules avec les colonnes. Maintenant, je suis coincé, car je ne peux pas déplacer les groupes de colonnes.

Le model comporte quelques colonnes regroupées et effondrées par défaut. Parce que nous avons plus de 100 colonnes, cela est censé rendre plus facile pour l'user en cachant certaines colonnes rarement utilisées.

Pendant la création du model, j'utilise le code suivant pour créer les groupements.

SimpleEntry<Integer, Integer> group; sheet.setRowSumsRight(false); for (Ssortingng groupId : groupMap.keySet()) { group = groupMap.get(groupId); sheet.groupColumn((group.getKey() + 1) + offset, group.getValue() + offset); sheet.setColumnGroupCollapsed(group.getValue() + offset, true); } 

group.getKey() renvoie la colonne la plus à gauche et group.getValue() la colonne la plus à droite du groupe. Le offset est toujours 0.
Mon idée était d'utiliser le même code avec un offset de 2 pour déplacer les groupements dans le file de rapport. En pensant que l'écrasement simple ne fonctionnerait pas, j'ai essayé de dégrouper les colonnes d'abord avec ceci:

 sheet.ungroupColumn(0, 130); 

C'est juste un exemple. J'ai essayé plusieurs approches différentes, comme dégrouper tous les groupes à la fois en utilisant la gamme maximale ou en désaccordant tous les groupes sur ma carte.

Rien ne fonctionnait comme prévu. Si j'essaie de dégrouper les groupements de colonnes, il éclate les groupements à la place et produit des effets indésirables. Les groupes de colonnes se divisent en petits groupes au lieu d'être supprimés du document Excel. Certains sont effectivement enlevés, mais j'ai trouvé maintenant le moyen de le faire fonctionner en toute security.

Remarque: j'utilise XSSF uniquement.

Je ne sais pas d'idées et il me semble qu'il est impossible, pour une raison quelconque, de réécrire les groupes de colonnes en utilisant l' API POI standard. En fait, il semble que la fonctionnalité de regroupement des colonnes fonctionne correctement avec des documents vides avant qu'ils ne soient remplis de données.
J'ai passé beaucoup de time à gober le problème, mais je n'ai trouvé aucune solution et franchement à peine des résultats qui correspondaient à mon problème. Soit mon google-fu m'a quitté, soit je suis le seul à avoir une telle fonctionnalité.

J'espère que quelqu'un ici pourrait avoir une idée ou une solution à mon problème, car je pense que cela devrait être possible. Quel est le but de la fonction ungroupColumn sinon?

Remarque: j'ai pensé à utiliser deux templates différents et à copyr simplement datatables, car il semble qu'il n'y ait pas de problème pour créer correctement les groupements lors de la génération du model.
Cela nécessiterait plusieurs changements majeurs au code cependant (et je suis fondamentalement hors timeout) et poserait des problèmes avec une ou deux autres exigences que je dois respecter. C'est donc plus comme un Plan C pour moi, qui serait ma dernière solution au problème.


Modifier:
Pour ceux qui sont intéressés, je suis allé avec la solution proposée par Florian Rodler car elle s'est révélée être une solution de travail / solution de contournement pour mon problème. J'ai modifié légèrement son code pour cela.

 if (sheet.getPhysicalNumberOfRows() > 0) { Row row = sheet.rowIterator().next(); for (int i = row.getFirstCellNum(); i < row.getLastCellNum(); i++) { sheet.ungroupColumn(i, i); } } 

Cela supprime avec succès tous les groupes de colonnes / contours de mon document Excel. J'utilise ensuite le code de création de model montré dans ma question avec un offset supérieur à 2 pour déplacer (ou plutôt recréer) les groupes vers la droite.

Il semble que la façon dont les POI d'Apache traitent les groupes de colonnes est cassée et produit des effets secondaires, mais je pense qu'il existe un moyen de supprimer tous les groupes de colonnes dans la feuille comme ceci:

 for (int i=first_column; i<=last_column; i++) { sheet.ungroupColumn(i,i); } 

S'il n'y a que le niveau de contour, cela éliminera tous les groupes. S'il n'y a pas de n niveaux, vous devrez peut-être le répéter n fois pour vous assurer que tous les groupes sont supprimés.