0

シナリオ: JExcel を使用して Excel ファイルを読み取り、そのデータを Oracle データベースにダンプしようとしています。ユーザーに、システムから読み取るファイルを参照して選択するように依頼し、同じファイルを読み取って、(物理ファイルを保存せずに) データを Oracle データベースにダンプします。

<form id='uploadform'>
    <table class='detailTable'>
    <tr>
        <td class='detailTableTD'>Select File to Upload:</td>
        <td class='detailTableTD'>
            <input type='file' id='fileUpload'>
        </td>
    </tr>
    <tr>
        <td class='detailTableTD'></td>
        <td class='detailTableTD'>
            <button id='uploadBtn' onclick="upload();">Upload</button>
            <button id='backBtn'>Back</button>                                  
        </td>
    </tr>
    </table>
</form>

ジャワ:

public int[][] readFromExcel(final String excelFilePath) throws ApplicationException {
    String excelPath = excelFilePath.trim();
    File inputWorkbook = new File(excelPath);
    Workbook workbook;
    MyObj drawBk;
    List drBkLst = new ArrayList();
    String tmpStr = "";
    try {
        workbook = Workbook.getWorkbook(inputWorkbook);
        Sheet sheet = workbook.getSheet(0);
        for (int j = 1; j < sheet.getRows(); j++) {
            drawBk = new MyObj();
            for (int i = 0; i < sheet.getColumns(); i++) {
                Cell cell = sheet.getCell(i, j);
                switch (i) {
                case 0:
                    drawBk.setSerialNumber(cell.getContents());
                    break;
                case 1:
                    drawBk.setMediaNumber(cell.getContents());
                    break;
                case 2:
                    tmpStr = cell.getContents();
                    if (!(tmpStr.trim().equalsIgnoreCase("Y") || tmpStr.trim().equalsIgnoreCase("N")))
                        continue;
                    else
                        drawBk.setMnProcessInd(tmpStr);
                    drawBk.setSnProcessInd(tmpStr);
                    break;
                }
            }
            drawBk.setLastChangedUser(userId);
            drBkLst.add(drawBk);
        }
    } catch (Exception readExcelEx) {}
return insertExcelDataToDatabase(drBkLst);
}

ここではパスを取得し、セルを処理する Java メソッドにパラメーターとして渡し、DB に挿入するオブジェクトの ArrayList を作成します。すべての簡単なコードがここにあります。ローカル展開から実行するとすべて正常に動作しますが、EAR をサーバーに展開すると、ファイルを参照してファイルを選択すると FileNotFound Exception が発生し始めます。相対/絶対パスの問題が原因だと感じていますが、デバッグできない可能性があり、すぐに必要です。正確なヘルプヘルプをいただければ幸いです。

ありがとう。

4

2 に答える 2

1

ローカルで実行すると、そのファイルはローカルシステムに存在するため、例外は発生しません。しかし、サーバーに展開すると、ユーザーによるファイル参照はまだ彼のマシン上にあり、サーバーまで到達しません。一時ファイルを作成するか、ファイルのリクエストパラメータのバイナリデータからJavaオブジェクトのデータを読み込む必要があります。

于 2012-10-31T10:47:52.717 に答える
1

サーバーの一時ディレクトリにファイルを書き込む必要があります。サーバー (ear) からのシステム ファイル パスは使用できません。

フォームをマルチパートに変更して、リクエストを処理する必要があります。このリンク (http://www.servletworld.com/servlet-tutorials/servlet-file-upload-example.html) を確認してください。

ファイルを temp に書き込むことも避けることができます (とにかく Java によって tmp に書き込まれますが、パスを指定する必要はありません)。使用する

FileInputStream fis = new FileInputStream(new File()); //after reading it using file io.
Workbook workbook = WorkbookFactory.create(fis);  
于 2012-10-31T10:57:16.090 に答える