0

サードパーティのサイトから Excel ファイルをダウンロードし、それに応じてデータベースを更新するスケジュールされたタスクを作成しています。

URL(つまり)を介してファイルを正常にダウンロードできますhttp://www.example.com/myExcel.xls。しかし、Ben Nadel の POIUtility.cfc を使用して後で読み込もうとすると、あらゆる種類のエラーが発生します。ファイルをダウンロードするとCFHTTP、読み取り専用形式で保存されることが原因のようです。

この動作は誰にでもなじみがあるように聞こえますか、それともファイルを保存して読み取り専用にしない方法を知っている人はいますか?

前もって感謝します。

コードの一部:

<cfhttp method="get" 
     url="http://www.example.com/myExcel.xls" 
     path="#expandpath('xls')#" file="stocks.xls" />
<cfset objPOI = CreateObject("component", "POIUtility").Init()/>
<cfset arrSheets = objPOI.ReadExcel( FilePath = ExpandPath("xls/stocks.xls")
                                     , HasHeaderRow = true) />

6 月 22 日更新: 表示されるエラーは次のとおりです。

Object instantiation exception.
An exception occurred while instantiating a Java object. The class must not be an interface or an abstract class. Error: ''.
The error occurred in /Volumes/RAID/DATA/ColdFusion9/wwwroot/website/POIUtility.cfc: line 883
Called from /Volumes/RAID/DATA/ColdFusion9/wwwroot/website/autoUpdateStock.cfm: line 36
Called from /Volumes/RAID/DATA/ColdFusion9/wwwroot/website/POIUtility.cfc: line 883
Called from /Volumes/RAID/DATA/ColdFusion9/wwwroot/website/autoUpdateStock.cfm: line 36
881 :               "org.apache.poi.hssf.usermodel.HSSFWorkbook"
882 :               ).Init(
883 :                   LOCAL.ExcelFileSystem
884 :                   );
885 :                   

ダウンロードしたファイルを OS 内から直接開くと、Excel のステータス バーにも「(読み取り専用)」と表示されます。ファイルを別のファイル名で保存し、その新しいファイル名を POI コードで使用すると、問題なく動作します。

少し前に同様のエラーが発生しました。問題はExcelファイルでサポートされていないExcelのものであり、POIで同じエラーが発生しました。ただし、この Excel ファイルには、グラフなどの特別なものは含まれておらず、データフィルターのない単純なデータのみです。

ソース ファイルが POI ユーティリティでサポートされていない Excel 形式で保存されているのではないかと考えていますが、ファイルの情報ウィンドウを表示すると、他のファイルと同じように「種類: Microsoft Excel 97-2004 ワークブック」と表示されます。 (その作品)でやってみました。

4

1 に答える 1

2

エラーは「読み取り専用」を参照している可能性がありますが、それが問題であるかどうかは真剣に疑問です。結局、CF は実際にファイルをディスクに書き込むので、同じファイルを読み取ることができます。

問題はおそらく構文です。ExpandPath('./xls') を試しましたか? cfhttp 呼び出しにセミコロンも表示されます。これはタイプミスだと思います。

ファイルハンドルがOSによって解放される前に、POIでファイルをヒットすることもできます。その可能性を排除するために、10 秒程度の短いスリープ時間を追加してみてください。

于 2012-06-20T13:50:49.350 に答える