2016-11-21 35 views
1

XMLベースのマッピングがあるExcelドキュメントを提供しているビジネス要件があります(基本的にExcelのメニューオプションDeveloper-> Sourceを使用してxmlファイルを選択し、 XML要素をExcelセルにマッピングする)。例:A2セルの値がxml要素 "document_title"にマッピングされ、B2が "document_number"にマッピングされます。Apache POIを使用してExcel、XML MAP要素名を読み取る

要件は、プログラムでExcelドキュメントを読み取り、XML要素のリストを検索し、マップされたセルとセルの内容を見つけることです。例:xml要素 "document_title"を検索し、この要素がマップされているセルを見つけます(上記の例ではA2です)。セルの内容を読み込みます。

私はOPCPパッケージとXSSFReaderクラスのapi POIを使用して試してみましたが、DOMParserを使用して解析しましたが、これを達成できませんでした。

以下は、ソースコードのトリムバージョンです。誰かが正しい方向に私を助けてください。

public static void main(String[] args) throws IOException 
{ 
    System.out.println("reading excel"); 

    try { 
     OPCPackage pkg = OPCPackage.open("D:\\test.xlsx"); 
     XSSFReader r = new XSSFReader(pkg); 
     SharedStringsTable sst = r.getSharedStringsTable(); 

     InputStream inp = r.getSheet("rId1"); 

     InputSource inpSource = new InputSource(inp); 

     DOMParser parser = new DOMParser(); 
     parser.parse(inpSource); 

     Document doc = parser.getDocument(); 
     inp.close(); // dont know yet, how to read each element, and hence trying to write this to a file 

     OutputStream writer = new FileOutputStream("D:\\outtrId11.xml"); 
     TransformerFactory transfac = TransformerFactory.newInstance(); 
     Transformer trans = transfac.newTransformer(); 
           trans.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); 
     trans.setOutputProperty(OutputKeys.INDENT, "yes"); 
     trans.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); 

     //create string from xml tree 

     StreamResult result = new StreamResult(writer); 
     DOMSource source = new DOMSource(doc); 
     trans.transform(source, result);    

    } catch (InvalidFormatException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } catch (OpenXML4JException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (SAXException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (TransformerConfigurationException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (TransformerException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

ご質問やご提案がありましたらお知らせください。どんな助けでも本当に感謝されます

答えて

2

私は、インターネット経由で少しクロールした後、POIクラスのバグを回避するための例を見つけました。私はその例のコードを必要に応じて微調整し、必要なものを正確に得ました。

したがって、次のコードは要約するとxlsxファイルを読み込み、任意のリレーションを取得します(この場合、関心のあるリレーションはxmlマップデータを含むためtableSingleCellsです)。次に、コードはこのドキュメントをすべてのマップされたXML要素と関連するセル参照について解析します。

最後に、XML要素、これらのXML要素に関連付けられたセルのxpathとセル値を表示します。

public static void main(String[] args) throws Exception { 

    System.out.println("reading excel"); 

    File file = new File("D:\\test.xlsx"); 
    // load an XLSX file with mapping informations 

    XSSFWorkbook wb; 
    wb = new XSSFWorkbook(file.getAbsolutePath()); 

     for(XSSFSheet sheet : wb) { 

      for(POIXMLDocumentPart doc : sheet.getRelations()) { 

       final PackagePart part = doc.getPackagePart(); 
       assert null!=part; 

       if(part==null) { 
        System.out.println("part of relation is null. Will be ignored!"); 
        continue; 
       } 

       //System.out.println(String.format("contentType [%s]", part.getContentType())); 

       if(part.getContentType().equalsIgnoreCase("application/vnd.openxmlformats-officedocument.spreadsheetml.tableSingleCells+xml")) 
       { 
        System.out.println(String.format("contentType [%s]", part.getContentType())); 

        SingleXmlCellsDocument singleCellsXml = SingleXmlCellsDocument.Factory.parse(part.getInputStream()); 
        CTSingleXmlCells scs = singleCellsXml.getSingleXmlCells(); 

        for(CTSingleXmlCell sc : scs.getSingleXmlCellArray()) { 

         //get R reference 
         final String ref = sc.getR(); 

         //get cell reference 
         final CellReference cellRef = new CellReference(ref); 
         final CTXmlCellPr cellPr = sc.getXmlCellPr(); 

         //get xml element reference 
         final CTXmlPr pr = cellPr.getXmlPr(); 

         //get xpath reference 
         final String xpath = pr.getXpath(); 

         //navigate to the cell by setting row and column 
         final int rowNum = cellRef.getRow(); 
         XSSFRow row = sheet.getRow(rowNum); 

         final int colNum = cellRef.getCol(); 
         XSSFCell cell = row.getCell(colNum); 


         DataFormatter formatter = new DataFormatter(); 

         String cellStrValue=""; 

         cellStrValue=formatter.formatCellValue(cell); 


         //System.out.println(xpathQuery); 
         final String xpathQuery = String.format("[Cell Reference: " + ref + "] [Element Name: "+ cellPr.getUniqueName() + "] [Cell Value: " + cellStrValue + "] [Full xpath: " + xpath + "]"); 
         System.out.println(xpathQuery); 


        } 

       } 

      } 

     } 

     wb.close(); 

} 

これは誰かを助けることを望みます。質問があればお気軽にお問い合わせください。

ありがとう、

関連する問題