2013-08-17 95 views
1

我必須從持續更改的Excel文件中獲取數據。我在java中做了一個代碼,它從execl中讀取數據,但沒有改變它。當我點擊Excel中的保存按鈕,然後運行我的代碼時,它會得到不斷變化的數據。從Excel獲取數據

private static void fuctionCall() throws BiffException, IOException { 
// TODO Auto-generated method stub 
Workbook workbook = Workbook.getWorkbook(new java.io.File("C:/ODIN/DIET/Arbitrage.xls")); 
Sheet sheet = workbook.getSheet(0); 
/*Cell a1 = sheet.getCell(0,0); String s1=a1.getContents(); System.out.println("My name is "+s1); */ 
for(int i=0;i<sheet.getColumns();i++) { 
for(int j=1;j<sheet.getRows();j++) { 
Cell cell=sheet.getCell(i, j); 
System.out.println(" "+cell.getContents()); 
} 
+0

excel文件中的數據是連續變化的股票市場 – Prashant

+0

您的問題是什麼?你的代碼與你的評論矛盾:該文件不是來自谷歌,而是來自c:/ ODING/...)。 –

回答

1

問題是因爲excel數據沒有保存。我也在處理同樣的問題,並採用了適合我的另一種解決方案。我只是在excel中創建了一個宏來保存excel工作簿,只要它的單元格值發生了變化。現在我得到了帶有最新保存數據的excel文件,這些數據可以通過java代碼讀取,並可用於其他目的。

我會後我的宏代碼和Java代碼,我用來檢索從Excel中的數據,

宏代碼

Sub Worksheet_Change(ByVal Target As Range) 
Dim KeyCells As Range 

' The variable KeyCells contains the cells that will 
' cause an alert when they are changed. 
Set KeyCells = Range("A6:A12,B6:B12,L6:L12,O6:O12,P6:P12,Y6:Y12") 

If Not Application.Intersect(KeyCells, Range(Target.Address)) _ 
     Is Nothing Then 

    Do Until Not IsFileLocked(ThisWorkbook.Name) 
     If IsFileLocked(ThisWorkbook.Name) Then 
      Application.Wait Now + TimeSerial(0, 0, 0.5) 
     End If 
    Loop 

    ActiveWorkbook.Save 

End If 

Set KeyCells = Nothing 

End Sub 

Function IsFileLocked(filePath As String) As Boolean 
On Error Resume Next 
Open filePath For Binary Access Read Write Lock Read Write As #1 
Close #1 
If Err.Number <> 0 Then 
    IsFileLocked = True 
    ' Application.StatusBar = "Waiting for file to close" 
    Err.Clear 
Else 
    IsFileLocked = False 
    ' Application.StatusBar = "" 
End If 
End Function 

Java代碼的

fileName="C:\\ODIN\\Diet\\Arbitrage.xls"; 
public boolean readExcel(String fileName) 
{   
    ArrayList newList=null; 
    FileInputStream fis=null;  
    POIFSFileSystem poifs=null; 
    HSSFWorkbook hssfwb=null; 
    HSSFSheet hssfs=null; 
    Iterator rowIterate=null; 

    try 
    {    
     newList=new ArrayList(); 
     fis=new FileInputStream(fileName); 
     poifs=new POIFSFileSystem(fis); 
     hssfwb=new HSSFWorkbook(poifs); 
     hssfs=hssfwb.getSheetAt(0); 
     rowIterate=hssfs.rowIterator(); 

     while(rowIterate.hasNext()) 
     { 
      HSSFRow row=(HSSFRow) rowIterate.next(); 
      Iterator cellIterate=row.cellIterator(); 
      ArrayList<HSSFCell> cellList=new ArrayList<>(); 

      while(cellIterate.hasNext()) 
      { 
       HSSFCell cell=(HSSFCell) cellIterate.next(); 
       cellList.add(cell);      
      } 
      newList.add(cellList); 
     } 

     for(int i=0;i<newList.size();i++) 
     { 
      ArrayList<HSSFCell> cellList=(ArrayList<HSSFCell>) newList.get(i); 

      for(int j=0;j<cellList.size();j++) 
      { 
       HSSFCell cell=cellList.get(j); 
       System.out.println("Cell Values: "+cell); 
      } 

      System.out.println("----------------------"); 

     }    

    } 
    catch(Exception e) 
    { 
     log.error(e.getMessage()); 
    } 

    return true; 
} 

下一步你需要知道的是如何創建一個宏並保存它,以便在下一次重新啓動時el應用程序您的宏將無需任何用戶干預即可正常工作。

您的excel文件已經存在於上述位置。現在,我將解釋每一個步驟,以在MS Excel中繼續進行2007年

  1. 打開excel表
  2. 轉到辦公室按鈕 - > Excel的選項 - >勾選「顯示開發者選項卡」選項
  3. 開放開發選項卡並單擊Visual Basic圖標。
  4. 您的代碼窗口現在將打開,從項目瀏覽器中創建一個新的模塊。
  5. 將上面的代碼粘貼到所有表單中。
  6. 現在您必須將宏安全設置更改爲低。
  7. Goto Developer選項卡並單擊宏安全性。
  8. 選擇「啓用所有宏」單選按鈕並選中「信任訪問VBA項目對象模型」選項。
  9. 現在保存並關閉excel,就是這樣。

但是這會導致性能問題,因爲保存過程將在每個單元更改時執行。

+0

嗨@Ajeesh是上面的代碼它會讀甚至是空行還是EOF? – gks

+0

單元格被跳過其普通的單元格,但是當我們只有10行數據時,它會一直運行,直到N個行數似乎陷入這種情況。 – gks

+0

@不尋常的我們有一個**迭代器**類,它包含一個方法** hasNext()**來檢查你是否有下一行。但是儘量避免中間有空行,如果你有空行,你需要分析如何管理。 – Ajeesh