2017-10-12 159 views
0

我想讀取一個html表格並將數據寫入Excel。 什麼是最好的,最快的方法來實現呢? 我有一個包含13529行,37列的HTML表格。讀取數據〜1Hr +的時間太長,我無法想象將這些數據寫入excel需要多長時間。 不知道我在這裏做錯了什麼。 任何建議表示讚賞。提前致謝。閱讀HTML表格並寫入Excel - 使用POI的Selenium WebDriver

讀取數據從HTML表代碼:

private List<WebElement> getData(String object){ 
    System.out.println("Object = ="+OR.getProperty(object)); 
    List<WebElement> tr_collection = driver.findElements(By.xpath(OR.getProperty(object))); 
    System.out.println("NUMBER OF ROWS IN THIS TABLE = " + tr_collection.size()); 
    int row_num, col_num; 
    row_num = 1; 
    for (WebElement trElement : tr_collection) { 
     List<WebElement> td_collection = trElement.findElements(By.xpath("td")).size() == 0?trElement.findElements(By.xpath("th")):trElement.findElements(By.xpath("td")); 
     System.out.println("NUMBER OF COLUMNS=" + td_collection.size()); 
     col_num = 1; 
     for (WebElement tdElement : td_collection) { 
      System.out.println("row # " + row_num + ", col # " + col_num + ", text | " + tdElement.getText()); 
      col_num++; 
     } 
     row_num++; 
     System.out.println("================================================================================"); 
    } 
    return tr_collection; 
} 

將數據寫入Excel工作表:

private void writeExcel(List<WebElement> tr_collection,XSSFWorkbook workbook,XSSFSheet spreadsheet,String fileName){ 

    //HSSFRow row; 

    for (int i=0; i<tr_collection.size(); i++) 
    { 
     WebElement webRow = tr_collection.get(i); 
     //Get all cell values in each row 
     List<WebElement> allCells = new ArrayList<>(); 
     if(webRow.findElements(By.tagName("th")).size() > 0){ 

      allCells = webRow.findElements(By.tagName("th")); 
     }else{ 
      allCells = webRow.findElements(By.tagName("td")); 
     } 
     //System.out.println(allCells.size()); 

     if(allCells.size() > 1) 
     { 
      XSSFRow excelRow = spreadsheet.createRow(i); 

      for (int j=0; j<allCells.size(); j++) 
      { 
       WebElement webCell = allCells.get(j); 
       String text = webCell.getText(); 
       XSSFCell cell = excelRow.createCell(j); 
       cell.setCellValue(text); 
      } 
     } 
    } 
    try { 
    FileOutputStream fileOut = new FileOutputStream(fileName); 
    //write this workbook to an Outputstream. 
     workbook.write(fileOut); 

     fileOut.flush(); 
     fileOut.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
+0

讓我知道是否需要任何進一步的細節。 – Nag

+0

你能分享一個鏈接到包含表格或一些例子表格的頁面嗎?提高輸出速度的一個建議是寫入CSV(文本文件)。然後,您可以輕鬆地將CSV導入到Excel中,這可能會爲您節省很多時間。使用寫緩衝區也可以幫助事情更快。 – JeffC

+0

如果您能夠確切知道這樣做的目的,那麼有很多選擇。如果它像一個實用工具,以減少您的一般工作,你甚至可以使用動作類和機器人API複製和粘貼。 –

回答

0

這只是一個建議,但是如果我不得不解析HTML表將其下載到Excel中我會下載原始HTML,使用字符串操作或正則表達式讀出表格元素,然後將其寫入CSV文件(如上所述)。這比用Selenium獲取表格元素快得多。我們在這裏談論了大約50萬個元素。這不是Selenium所優化的。 :-)

+0

通過經歷一些論壇,我遇到了JSOUP API for HTML解析。任何想法如何將Jsoup整合到我的代碼中? 我想使用Jsoup解析HTML表格,並使用Selenium來完成其餘部分。 – Nag

+0

我認爲這將是值得一個新的問題。我還沒有和JSOUP一起工作,但根據我的理解,你可以解析HTML的「離線」,這確實比使用Selenium更快,但我不知道JSOUP的性能如何,我仍然期望在正則表達式和XPath表達式在HTML代碼當然有利於正則表達式。如果您需要JSOUP的進一步幫助,我會建議開一個新的問題,因爲這是一個完全不同的主題。但先做一個搜索。 :-) – AlvaHenrik

+0

只是爲了更新。昨天,我已經將我的代碼與JSOUP集成在一起來解析並試圖將相同的巨大html表導出爲ex​​cel,並且它的照明速度很快。 我仍然需要優化我的代碼bcuz Jsoup對我來說是非常新的。感謝您花時間回覆。 – Nag