2010-03-25 16 views
4

Je tente de définir une formule de cellule qui référence les cellules d'autres classeurs. Toutefois, lorsque j'ouvre le classeur généré par programme, les cellules de formule s'affichent comme # REF! J'imprime les formules qui ont été générées dans un journal. Si je couper et coller ceux dans les cellules, les numéros des classeurs externes est tiré dans.Java apache poi définition de la formule de la cellule

 String formula = "'C:\\tmp\\ForecastAggregate\\Total Products\\[ForecastWorksheet.xls]2010 Budget'!C10"; 
     HSSFCell cell = row.createCell(0); //row was created above 
     cell.setCellFormula(formula); 

Peut-anybode aide?

Répondre

0

Essayé regardant autour, mais la seule information que je pourrais trouver pour cette question est ce rapport de bogue apache, ce qui montre qu'il est un long bug debout:

https://issues.apache.org/bugzilla/show_bug.cgi?id=46670

Bien que référence à d'autres feuilles dans le même classeur semble fonctionner sans problème

1

J'ai donné un test rapide à lire une formule à partir d'une feuille de calcul, et il est sorti sans les guillemets simples, comme:

[test.xls] testsheet A1

En essayant d'une formule que, cependant, je suis une erreur:

Exception dans le thread « principal » java.lang.RuntimeException: Aucun classeur externe avec les liens nom 'TEST.XLS de semblaient suggérer Lorsque vous lisez une formule qui utilise une référence externe, vous devez charger le classeur dans un évaluateur de formule et configurer l'environnement. Cependant, j'ai essayé, mais il ne fonctionne toujours pas ... mais il peut être quelque chose à regarder:

// Set up the workbook environment for evaluation 
HSSFFormulaEvaluator ev = new HSSFFormulaEvaluator(testwb); 
String[] workbookNames = { "test.xls", }; 
HSSFFormulaEvaluator[] evaluators = { ev, }; 
HSSFFormulaEvaluator.setupEnvironment(workbookNames, evaluators); 

http://poi.apache.org/apidocs/org/apache/poi/hssf/usermodel/HSSFFormulaEvaluator.html

1

Vous pouvez contourner ce problème en utilisant l'évaluation dynamique ot la référence , via la fonction INDIRECT.

La fonction INDIRECT évalue la valeur d'une cellule, où la cellule à évaluer est extraite de la valeur d'une autre cellule.

Par exemple,

  1. dans la cellule A1, mettez votre référence de cellule en texte brut (non de formule), par exemple "C: \ tmp \ ForecastAggregate \ Total des produits \ [ForecastWorksheet.xls] Budget 2010 '! C10"
  2. Dans A2, la cellule où vous voulez la valeur de cette cellule référencée à apparaître, mettre la formule

    = INDIRECT (A1)

Ceci cherchera la cellule cible à partir de A1 et montrera sa valeur dans A2.

En Java, vous pouvez configurer un modèle dans lequel vous créez une feuille de calcul distincte (par exemple «indirectRef») pour gérer les indirects. Chaque fois que vous écrivez une référence externe à une cellule, vous écrivez à la place INDIRECT (xx) et placez la référence dans la cellule xx dans la feuille de calcul "indirectRef". Étant donné que Poi est principalement des interfaces, vous pouvez le faire de manière transparente sans modifier le code de votre tableur java. Excel possède également une macro EVALUATE qui évalue dynamiquement les formules, ce qui serait encore plus facile à obtenir, mais cela est officiellement non documenté (mais largement documenté ailleurs!).) et il peut ne pas être pris en charge sur toutes les versions d'Office.

Espérons que cela aide!