問題は、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 でさらに進めるための各手順について説明します。
- エクセルシートを開く
- Office ボタンに移動 -> Excel のオプション -> [開発者タブを表示] オプションにチェックを入れる
- [開発] タブを開き、Visual Basic アイコンをクリックします。
- コード ウィンドウが開き、プロジェクト エクスプローラーから新しいモジュールが作成されます。
- 上記のコードをすべてのシート内に貼り付けます。
- ここで、マクロのセキュリティ設定を低に変更する必要があります。
- [開発] タブに移動し、[マクロ セキュリティ] をクリックします。
- [すべてのマクロを有効にする] ラジオ ボタンを選択し、[VBA プロジェクト オブジェクト モデルへのアクセスを信頼する] オプションをオンにします。
- Excel を保存して閉じます。
ただし、セルが変更されるたびに保存プロセスが実行されるため、これはパフォーマンスの問題につながります。