1

絶えず変化している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());
} 
4

1 に答える 1

1

問題は、Excel データが保存されていないためです。私も同じ問題に対処していましたが、私にとってはうまくいった別の解決策を考え出しました。セルの値が変更されるたびにExcelワークブックを保存するために、Excelでマクロを作成しました。これで、Java コードを介して読み取ることができ、他の目的に使用できる最新の保存データを含む Excel ファイルを取得しました。

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. エクセルシートを開く
  2. Office ボタンに移動 -> Excel のオプション -> [開発者タブを表示] オプションにチェックを入れる
  3. [開発] タブを開き、Visual Basic アイコンをクリックします。
  4. コード ウィンドウが開き、プロジェクト エクスプローラーから新しいモジュールが作成されます。
  5. 上記のコードをすべてのシート内に貼り付けます。
  6. ここで、マクロのセキュリティ設定を低に変更する必要があります。
  7. [開発] タブに移動し、[マクロ セキュリティ] をクリックします。
  8. [すべてのマクロを有効にする] ラジオ ボタンを選択し、[VBA プロジェクト オブジェクト モデルへのアクセスを信頼する] オプションをオンにします。
  9. Excel を保存して閉じます。

ただし、セルが変更されるたびに保存プロセスが実行されるため、これはパフォーマンスの問題につながります。

于 2013-09-20T11:49:36.980 に答える