从Excel获取数据

时间:2013-08-17 06:44:48

标签: java excel

我必须从Excel文件中获取连续更改的数据。我在java中创建了一个代码,它从execl读取数据但没有更改它。当我单击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());
 } 

1 个答案:

答案 0 :(得分:1)

问题是因为未保存Excel数据。我也在处理同样的问题,并找到了一个适合我的不同解决方案。我刚刚在excel中创建了一个宏来保存excel工作簿,只要它的单元格值发生了变化。现在我得到了excel文件,其中包含最新的保存数据,可以通过java代码读取,并可用于其他目的。

我将发布我用于从excel中检索数据的宏代码和java代码,

宏代码

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;
}

您需要知道的下一步是如何创建宏并保存它,以便在下次重启excel应用程序时,您的宏将在没有任何用户干预的情况下正常工作。

您的excel文件已经存在于上述位置。现在,我将解释每一步,以便在MS Excel 2007中继续进行。

  1. 打开Excel工作表
  2. 转到Office按钮 - &gt; Excel选项 - &gt;选中“显示开发人员选项卡”选项
  3. 打开“开发人员”选项卡,然后单击“Visual Basic图标”。
  4. 您的代码窗口现在将打开,从项目资源管理器中创建一个新模块。
  5. 将上面的代码粘贴到所有工作表内。
  6. 现在您必须将宏安全设置更改为低。
  7. 转到开发人员标签,然后点击宏安全。
  8. 选择“启用所有宏”单选按钮,然后选中“信任对VBA项目对象模型的访问权限”选项。
  9. 现在保存并关闭excel,就是这样。
  10. 但这会导致性能问题,因为保存过程将在每次更改单元格时执行。