2013-01-25 12 views
15

के साथ एमएस एक्सेल फ़ाइल प्रकार का निर्धारण करें क्या अपाचे पीओआई में एमएस ऑफिस एक्सेल फ़ाइल प्रकार निर्धारित करने का कोई तरीका है? मुझे पता होना चाहिए कि Excel फ़ाइल किस प्रारूप में है: Excel '97 (-2007) (.xls) या Excel 2007 OOXML (.xlsx) में।अपाचे पीओआई

मुझे लगता है मैं कुछ इस तरह कर सकता है:

int type = PoiTypeHelper.getType(file); 
switch (type) { 
case PoiType.EXCEL_1997_2007: 
    ... 
    break; 
case PoiType.EXCEL_2007: 
    ... 
    break; 
default: 
    ... 
} 

धन्यवाद।

+1

आपको आगे जानने की आवश्यकता क्यों है? क्या आप केवल वर्कबुक फैक्टरी का उपयोग नहीं कर सकते हैं और क्या यह आपके लिए उपयुक्त प्रकार बना सकता है? – Gagravarr

+0

यह भी एक अच्छा संस्करण है, धन्यवाद। –

उत्तर

35

एक जवाब के लिए एक टिप्पणी को बढ़ावा देना ...

आप फाइलों के साथ कुछ खास कर रहा करने के लिए जा रहे हैं, तो rjokelai's answer तरह से यह करने के लिए है।

हालांकि, अगर आप एचएसएसएफ/एक्सएसएसएफ/कॉमन एसएस usermodel का उपयोग करने जा रहे हैं, तो पीओआई आपके लिए यह करना बहुत आसान है, और WorkbookFactory का उपयोग करने के लिए टाइप किया गया है और आपके लिए खोला गया है।

Workbook wb = WorkbookFactory.create(new File("something.xls")); 

या

Workbook wb = WorkbookFactory.create(request.getInputStream()); 

तो अगर आप कुछ खास, परीक्षण करना करने की जरूरत है अगर यह एक HSSFWorkbook या XSSFWorkbook है: आप की तरह कुछ करना चाहते हैं। चीजों को गति देने और स्मृति को सहेजने के लिए फ़ाइल खोलते समय use a File rather than an InputStream if possible

यदि आपको नहीं पता कि आपकी फ़ाइल क्या है, तो पता लगाने के लिए Apache Tika का उपयोग करें - यह आपके लिए विभिन्न फ़ाइल स्वरूपों की एक बड़ी संख्या का पता लगा सकता है।

+0

धन्यवाद Gagravarr के भीतर उपयोग करें ! –

21

आप उपयोग कर सकते हैं:

// For .xlsx 
POIXMLDocument.hasOOXMLHeader(new BufferedInputStream(new FileInputStream(file))); 

// For .xls 
POIFSFileSystem.hasPOIFSHeader(new BufferedInputStream(new FileInputStream(file))); 

ये मूलतः तरीकों कि WorkbookFactory#create(InputStream) प्रकार

कृपया ध्यान दें निर्धारण करने के लिए उपयोग करता है, कि दोनों विधि केवल समर्थन स्ट्रीम "निशान" सुविधा का समर्थन करता है (या PushBackInputStream) , इतना आसान FileInputStream समर्थित नहीं है। एक wrapper के रूप में BufferedInputStream का प्रयोग करें। इस कारण से पता लगाने के बाद आप बस स्ट्रीम का पुन: उपयोग कर सकते हैं, क्योंकि इसे शुरुआती बिंदु पर रीसेट कर दिया जाएगा।

+1

धन्यवाद। फ़ाइल स्तर का पता लगाने का यही एकमात्र तरीका है जब आप निम्न स्तर की इवेंट आधारित पठन का उपयोग कर रहे हैं, केवल बड़ी एक्सेल फ़ाइलों को संसाधित करने के लिए उपयोग करें। – SWilk

+1

वह जानकारी जो केवल "मार्क" सहायक धाराओं का उपयोग किया जा सकता है जोड़ा गया। अद्यतन कोड नमूना। –

+0

विधि 'हैयूएक्सएमएलएचडर' वर्ग 'POIXMLDocument' के अंतर्गत चित्रित है, इसे कक्षा [दस्तावेज़ फैक्टरीहेल्पर] (https://poi.apache.org/apidocs/org/apache/poi/poifs/filesystem/DocumentFactoryHelper.html) – KAD

1

org.apache.poi.ss.usermodel.WorkbookFactory#create(java.io.InputStream)

की lib कार्यान्वयन हम WorkbookFactory के तर्क की नकल कर सकते हैं, अप्रासंगिक बिट्स को हटाने और फ़ाइल प्रकार लौटने के बजाय के आधार पर।

public static TYPE fileType(File file) { 
    try (
      InputStream inp = new FileInputStream(file) 
    ) { 
     if (!(inp).markSupported()) { 
      return getNotMarkSupportFileType(file); 
     } 
     return getType(inp); 
    } catch (IOException e) { 
     LOGGER.error("Analyse FileType Problem.", e); 
     return TYPE.INVALID; 
    } 
} 

private static TYPE getNotMarkSupportFileType(File file) throws IOException { 
    try (
      InputStream inp = new PushbackInputStream(new FileInputStream(file), 8) 
    ) { 
     return getType(inp); 
    } 
} 

private static TYPE getType(InputStream inp) throws IOException { 
    byte[] header8 = IOUtils.peekFirst8Bytes(inp); 
    if (NPOIFSFileSystem.hasPOIFSHeader(header8)) { 
     NPOIFSFileSystem fs = new NPOIFSFileSystem(inp); 
     return fileType(fs); 
    } else if (DocumentFactoryHelper.hasOOXMLHeader(inp)) { 
     return TYPE.XSSF_WORKBOOK; 
    } 
    return TYPE.INVALID; 
} 

private static TYPE fileType(NPOIFSFileSystem fs) { 
    DirectoryNode root = fs.getRoot(); 
    if (root.hasEntry("EncryptedPackage")) { 
     return TYPE.XSSF_WORKBOOK; 
    } 
    return TYPE.HSSF_WORKBOOK; 

} 

public enum TYPE { 
    HSSF_WORKBOOK, XSSF_WORKBOOK, INVALID 
} 
संबंधित मुद्दे