从Excel中获取数据

我必须从连续更改的Excel文件中获取数据。 我在java中做了一个代码,它从execl中读取数据,但是没有改变它。 当我点击Excel中的保存button,然后运行我的代码,它会得到不断变化的数据。

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

问题是因为excel数据没有保存。 我也在处理同样的问题,并采取了一个不同的解决scheme,为我工作。 我只是在Excel中创build了一个macros来保存Excel工作簿,只要它的单元格值发生了变化。 现在我得到了最新的保存数据的Excel文件,可以通过Java代码读取,可用于其他目的。

我将发布我用来从Excel中检索数据的macros代码和Java代码,

macros代码

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

下一步你需要知道的是如何创build一个macros并保存它,以便在下一次重新启动Excel应用程序时,你的macros将工作正常,无需任何用户干预。

你的excel文件已经存在于上述位置。 现在我将解释每个步骤在MS Excel 2007中继续进行。

  1. 打开Excel表格
  2. 转到Officebutton – > Excel选项 – >选中“显示开发人员选项卡”选项
  3. 打开开发人员选项卡并单击Visual Basic图标。
  4. 你的代码窗口现在将被打开,从项目浏览器中创build一个新的模块。
  5. 将上面的代码粘贴到所有表单中。
  6. 现在,您必须将macros安全设置更改为低。
  7. Goto Developer选项卡并单击macros安全性。
  8. select“启用所有macros”单选button,并选中“信任访问VBA项目对象模型”选项。
  9. 现在保存并closuresExcel,就是这样。

但这会导致性能问题,因为保存过程将在每个单元更改时执行。