2016-01-29 3 views
6

मैं जावा और अपाचे पीओआई का उपयोग कर अपने ".xlsx" फ़ाइल में सरल VLookup फॉर्मूला डालने की कोशिश कर रहा हूं।
इस सूत्र में बाहरी संदर्भ है और यह मेरे लिए काम नहीं कर रहा है।जावा पीओआई एक्सएसएसएफ वीएलुकअप फॉर्मूला

cell.setCellType(Cell.CELL_TYPE_FORMULA); 
cell.setCellFormula("StringContainingFormula"); 

:

तो आपको और अधिक जानकारी मैं poi और poi-OOXML संस्करण 3.13 उपयोग कर रहा हूँ देने के लिए और उत्कृष्टता 2007
मैं सेल में सूत्र इस तरह से रखने कर रहा हूँ (जहां सेल एक सेल है) और उसके बाद फॉर्मूला का मूल्यांकन करें, मैंने तीन अलग-अलग तरीकों की कोशिश की है लेकिन कोई भाग्य नहीं है। (डब्ल्यूबी एक्सएसएसएफ वर्कबुक है)।

FormulaEvaluator mainWorkbookEvaluator = wb.getCreationHelper().createFormulaEvaluator(); 
Map<String,FormulaEvaluator> workbooks = new HashMap<String, FormulaEvaluator>(); 
workbooks.put("SpreadsheetName.xlsx", mainWorkbookEvaluator); 
mainWorkbookEvaluator.setupReferencedWorkbooks(workbooks); 
mainWorkbookEvaluator.evaluateAll(); 
XSSFEvaluationWorkbook.create(wb); 
Workbook nwb = wb; 
FormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator(); 
for (Sheet sheet : nwb) { 
    for (Row r : sheet) { 
     for (Cell c : r) { 
      if (c.getCellType() == Cell.CELL_TYPE_FORMULA) { 
       try { 
        //evaluator.evaluateFormulaCell(c); 
        evaluator.evaluate(c); 
       } catch (Exception e) { 
        System.out.println("Error occured in 'EvaluateFormulas' : " + e); 
       } 
      } 
     } 
    } 
} 
XSSFFormulaEvaluator.evaluateAllFormulaCells(wb); 

समस्या है, यह Excel फ़ाइल को लिखते हैं और फिर यह त्रुटि फेंकता है, जबकि का मूल्यांकन:

java.lang.IllegalArgumentException: Invalid sheetIndex: -1

अब अगर मैं Excel फ़ाइल खोलते हैं, तो यह मुझे चेतावनी देता है:

Automatic update of links has been disabled

मैं सामग्री सक्षम करते हैं, सूत्र ठीक से परिणाम से पता चलता है और मैं सूत्र #N/A में जिसके परिणामस्वरूप से कुछ भी नहीं करते हैं।
अब अगर मैं इसमें सूत्र के साथ सेल का चयन करता हूं और फॉर्मूला बार पर क्लिक करता हूं और फॉर्मूला से एंटर दबाता हूं तो परिणाम दिखाता है।

अद्यतन:

तो, मैं चेतावनी संदेश एक्सेल विकल्पों में जाने रूप से अक्षम और यह मेरे सेल के अंदर सूत्र देने शुरू कर दिया।
लेकिन, जब मैं

if (cell.getCachedFormulaResultType == Cell.CELL_TYPE_STRING) { 
    System.out.println("Last evaluated as \"" + cell.getRichStringCellValue() + "\""); 
} 

का उपयोग कर इसे से परिणाम मूल्य पाने की कोशिश की यह कभी नहीं CELL_TYPE_STRING के रूप में मेरे getCachedFormulaResultType दिया, यह हमेशा CELL_TYPE_NUMERIC लौट आते हैं। यह स्ट्रिंग मान वापस करना चाहिए। मैं यूआरएल और कुछ अन्य मूल्य का विस्तार कर रहा हूं ("|" - "बिल्ली | कुत्ता | पक्षी") से अलग शब्द।

मैं किसी भी मदद/सुझाव की सराहना करता हूं।

+0

शायद सबसे अच्छा [फॉर्मूला मूल्यांकन] जाँच करने के लिए (https: // poi। apache.org/spreadsheet/eval.html) दस्तावेज़ सावधानीपूर्वक। शायद कुछ 'wb.setForceFormulaRecalculation (सत्य) की तरह;' आपकी मदद करेगा? –

+0

इसके अलावा, दस्तावेज़ आपके द्वारा संदर्भित कार्यपत्रकों के लिए 'createFormulaEvaluator' बनाने के लिए कहता है। उदाहरण के लिए, 'workbooks.put ("input.xls", WorkbookFactory.create ("c: \ temp \ input22.xls")। GetCreationHelper()। CreateFormulaEvaluator()); ' –

+0

@ निकोलस, आपकी युक्तियों के लिए बहुत बहुत धन्यवाद , लेकिन मुझे 'wb.setForceFormulaRecalculation (true) के समान कुछ भी नहीं मिला; और मैंने पहले से ही' createFormulaEvaluator 'संदर्भ का प्रयास किया है, लेकिन कोई भाग्य नहीं है। – ManishChristian

उत्तर

0

तो जैसा कि मैं किसी अन्य विकल्प नहीं है, मैं हा करते हैं, डी को काम करने के लिए संदर्भित डेटा को मुख्य कार्यपुस्तिका में कॉपी करने के लिए (मुझे पता है कि यह अच्छा विचार नहीं है, अगर डेटा बड़ा है)।
तो मैं क्या किया है:

  1. कॉपी बाहरी कार्यपुस्तिका से संदर्भित डेटा।
  2. मुख्य कार्यपुस्तिका पर नई वर्कशीट बनाएं (जिसमें आपको अपना फॉर्मूला लिखना होगा) और संदर्भित डेटा पेस्ट करें।
  3. अब फॉर्मूला लिखें और इस बार बाहरी वर्कबुक के बजाय नव निर्मित वर्कशीट (चिपका हुआ डेटा के साथ) का उपयोग करें।
    नोट *: सूत्रों का मूल्यांकन करने के लिए आपको पहले सभी डेटा (फॉर्मूला समेत) लिखने की आवश्यकता है। (पश्चिम बंगाल XSSFWorkbook है) पढ़ने अगर आप पहले से ही बंद कर दिया और इस तरह सभी सूत्रों का मूल्यांकन है
  4. फिर खुला कार्यपुस्तिका:

XSSFFormulaEvaluator.evaluateAllFormulaCells(wb);

1

अच्छा, ऐसा लगता है कि यह काम कर रहा है। आपको धीरे-धीरे एक्सेल का इलाज करना होगा; यदि आप बाहरी कार्यपुस्तिका को पहले खोलते हैं, तो प्राथमिक कार्यपुस्तिका यह बहुत खुश है। यदि आप नहीं करते हैं, तो यह असुरक्षित लिंक के बारे में एक संदेश देता है, लेकिन इसके अलावा, सबकुछ ठीक लगता है। मूल्यांकनकर्ता केवल एकल कोशिकाओं पर काम करता है, इसलिए यदि आप संपूर्ण स्प्रेडशीट को फिर से समझना चाहते हैं तो आपको लूप करना होगा। इसके अलावा, बाहरी संदर्भ पहले से ही एक्सेल द्वारा जोड़ा गया है, POI ने अभी तक उस सुविधा को लागू नहीं किया है। यहां मैंने गीथब में रखा है:

// Open workbooks 
    Path pathBook1 = Paths.get("c:/users/karl/scsb/Vlookup/Book1.xlsx"); 
    InputStream is = Files.newInputStream(pathBook1); 
    XSSFWorkbook book1 = new XSSFWorkbook(is); 
    // Add Linked Cell 
    // The workbook must already have been linked to Book2.xlsx by Excel 
    // The linkExternalWorkbook has not yet been implemented: SEE BUG #57184 
    Cell cell = book1.getSheetAt(0).createRow(2).createCell(0); 
    cell.setCellFormula("A2+[Book2.xlsx]Sheet1!A1"); 
    // Create evaluator after the new cell has been added. 
    FormulaEvaluator mainEvaluator = book1.getCreationHelper().createFormulaEvaluator(); 
    XSSFWorkbook book2 = new XSSFWorkbook("c:/users/karl/scsb/Vlookup/Book2.xlsx"); 
    Map<String, FormulaEvaluator> workbooks = new HashMap<String, FormulaEvaluator>(); 
    workbooks.put("Book1.xlsx", mainEvaluator); 
    workbooks.put("Book2.xlsx", book2.getCreationHelper().createFormulaEvaluator()); 
    mainEvaluator.setupReferencedWorkbooks(workbooks); 
// mainEvaluator.evaluateAll();       // doesn't work. 
// XSSFFormulaEvaluator.evaluateAllFormulaCells(book1); // doesn't work. 
    mainEvaluator.evaluateFormulaCell(cell); 
    System.out.println(cell.getNumericCellValue()); 
    book2.close(); 
    // Close and write workbook 1 
    is.close(); 
    OutputStream os = Files.newOutputStream(pathBook1); 
    book1.write(os); 
    os.close(); 
    book1.close(); 
+0

यह मेरे लिए काम नहीं कर रहा है। यदि मैं "संदर्भित" कार्यपुस्तिका खोलने से पहले 'setCellFormula' (पूर्ण पथ के बिना) (जैसे आपने किया था) का उपयोग करता हूं, तो यह मुझे त्रुटि देता है' java.lang.RuntimeException: फ़ाइल नाम के लिए पुस्तक लिंक नहीं है "संदर्भित FileName.xlsx" '। और अगर मैं पूरा पथ का उपयोग करता हूं, तो यह मुझे फिर से 'अवैध शीट इंडेक्स: -1' त्रुटि देता है। – ManishChristian

+0

जैसा कि मैंने उल्लेख किया है, इस कोड को चलाने से पहले बाहरी स्प्रेडशीट को एक्सेल द्वारा जोड़ा जाना चाहिए। पीओआई ('linkExternalWorkbook') में स्प्रेडशीट को जोड़ने के लिए एक विधि कॉल है, लेकिन यह लागू नहीं किया गया है। इसके बारे में मैं कुछ भी नहीं कर सकता। –

+0

सबसे पहले, आपकी मदद के लिए @ निकोलस बहुत बहुत धन्यवाद। तो, सबसे कम तरीके से, क्या हम कह सकते हैं कि इस समय यह संभव नहीं है?क्योंकि अगर हम कार्यपुस्तिका को लिंक नहीं कर सकते हैं, तो बाह्य कार्यपुस्तिका का संदर्भ देने के लिए कोई बिंदु नहीं है। – ManishChristian

0

मुझे हाल ही में एक ही समस्या है।समस्या यह थी कि वर्तमान पीओआई के साथ, कोई दस्तावेज़ नहीं लिख सकता है, विशिष्ट फ़ील्ड में सूत्र जोड़ सकता है और इस समय फॉर्मूला मूल्यांकन निष्पादित कर सकता है, अभी भी मौजूदा दस्तावेज़ नहीं है। चाल मैं प्रयोग किया जाता हल करने के लिए यह किया गया था:

  1. लिखें सभी डेटा और सूत्रों किसी कार्यपुस्तिका
  2. में इस दस्तावेज़
  3. लिखें बंद करने से पहले workbook.setForceFormulaRecalculation(true); जोड़ सकते हैं और बंद दस्तावेज़
  4. खुला ही दस्तावेज़ फिर से और केवल FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator(); evaluator.evaluateAll();
  5. लिखें और फिर करीब
संबंधित मुद्दे