2010-02-16 9 views
2

J'utilise Apache POI pour créer une grande feuille de calcul Excel extrêmement lourde pour un client qui peut modifier le code de mon programme avec de nouvelles formules. Le gros problème que je rencontre concerne le fait que les classeurs de POI sont indexés sur 0 pour leurs lignes et colonnes, tandis que les formules Excel traitent le document comme s'il était indexé sur 1. J'utilise une classe aidé à faire les conversions en ce moment:Apache POI Excel Indexation de lignes et de colonnes

class RowHelper { 
    public static int getCell(int col) { 
     return col - 1; 
    } 

    public static String getCellAddress(int row, int col) { 
     return CellReference.convertNumToColString(col) + row; 
    } 
} 

Et quand je modifier des lignes dans le document que je l'écrire comme ceci:

posRow.getCell(RowHelper.getCell(189)).setCellFormula(String.format("COUNT(%1$s:%2$s)", RowHelper.getCellAddress(2, 177), RowHelper.getCellAddress(ActiveSheet.getPhysicalNumberOfRows(), 177))); 
//=COUNT(FU2:FU477) 

Mais ce n'est pas le code très propre et ne sera pas très facile à utiliser par le client plus tard. Existe-t-il une meilleure façon de le faire?

Répondre

1

Bien que n'étant pas directement lié à votre problème, je me suis retrouvé envelopper certaines des classes Excel avec le mien pour faire un traitement personnalisé. Par exemple, je ne travaille pas directement avec les manuels HSSF, je travaille avec ma classe ExcelWorkbook qui contient un HSSFWorkbook. La raison pour laquelle je l'ai fait était d'ajouter des méthodes d'aide pertinentes à la classe, et pour d'autres méthodes que je ne modifie pas, je viens de passer à l'instance HSSFWorkbook. Vous pouvez également étendre les classes pertinentes avec lesquelles vous travaillez pour remplacer le comportement, mais vous souhaiterez peut-être consulter le code source pour s'assurer que vous ne cassez rien.

+0

Merci pour la suggestion! J'ai fini par créer de nouvelles classes pour chaque type (JWorkbook, JSheet, etc.) comme vous l'avez fait et j'ai implémenté la même interface que les originaux pour pouvoir les transmettre comme les mêmes objets. – taiidani

Questions connexes