• 締切済み

ApachePOIでエラー

ApachePOI3.9をインストールして、ECLIPSに入れて、サンプルコーディングを試して見ました。 実行したところ、次のエラーが表示されました。 java.lang.NoClassDefFoundError: org/apache/poi/ss/usermodel/WorkbookFactory コーディング(抜粋)は以下の通りです。 import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.WorkbookFactory; public void doNippou(HttpServletRequest request, HttpServletResponse response) { String path = getServlet().getServletContext().getRealPath("document"); FileInputStream fi = new FileInputStream(path + File.separator + "A4nippou.xls"); Workbook wb = WorkbookFactory.create(fi); Sheet sheet1 = wb.getSheetAt(1); response.setContentType("application/msexcel"); String fname = "A4nippouyyyymmdd.xls" ; // ファイル名を設定 response.setHeader("Content-Disposition", "attachment; filename=" + fname); OutputStream out = response.getOutputStream(); wb.write(out); out.close(); } 実行環境は、CentOS5,Tomcat5.0,jdk1.4です。 Javaのバージョンが1.4ではApachePOI3.9が動かないのでしょうか。 よろしくお願いします。

  • Java
  • 回答数2
  • ありがとう数2

みんなの回答

  • LancerVII
  • ベストアンサー率51% (1060/2054)
回答No.2

こんにちは。 tomcat5.0はもう使っていないので違っているかもしれませんが TOMCAT_HOME/shared/lib TOMCAT_HOME/webapps/アプリケーション/WEB-INF/lib このあたりがjarの検索範囲になるディレクトリだと思います。 上のような場所にjarを置いて試してみてください。

Horirin39
質問者

お礼

お礼が遅くなりました。 ありがとうございました。 教えていただきました場所にjarファイルを入れて、Tomcatを再起動し実行してみましたが、 HTTPステータス500のエラーが表示され、 java.lang.UnsupportedClassVersionError: org/apache/poi/ss/usermodel/WorkbookFactory (Unsupported major.minor version 49.0) とメッセージが出ています。 VersionErrorとのことですが、JavaかTomcatのバージョンが古いのではないでしょうか? よろしくお願いします。

  • LancerVII
  • ベストアンサー率51% (1060/2054)
回答No.1

こんにちは。 tomcat内のクラスパスが通ってる部分にjarが配置されていますか?

Horirin39
質問者

補足

ご回答ありがとうございます。 さっそく、/TOMCAT/server/lib フォルダにjarファイルを入れて、TOMCATを再起動させてみましたが、同じメッセージが表示されます。 WorkbookFactoryクラスは、poi-ooxml-3.9-20121203.jarのorg.apache.poi.ss.usermodelの中にあることを確認しています。 何か他の原因が考えられますでしょうか? よろしくお願いします。

関連するQ&A

  • linuxでapache poiが動かない。

    linux(ubuntu12.04)でeclipseでプログラミングをしているのですが、以下のapache poiのサンプルが正常に動作しません。 import java.io.*; import org.apache.poi.hssf.usermodel.HSSFWorkbook; public class sample{ public static void main(String[] args){ HSSFWorkbook workbook = new HSSFWorkbook(); workbook.createSheet("test"); FileOutputStream out = null; try{ out = new FileOutputStream("sample1.xls"); workbook.write(out); }catch(IOException e){ System.out.println(e.toString()); }finally{ try { out.close(); }catch(IOException e){ System.out.println(e.toString()); } } } コンソールには、 Usage: BiffDrawingToXml [options] inputWorkbook Options: -exclude-workbook exclude workbook-level records -sheet-indexes <indexes> output sheets with specified indexes -sheet-namek <names> output sheets with specified name と表示されます。windowsで正常に動作した時には表示されません。 参照ライブラリーにjarファイルは登録してありますし、windows7では同じeclipseとapache poiの環境で正常に動き、xlsファイルができました。 権限の問題を疑い、プログラムのフォルダごと chmod -R 777 としてみたのですが改善されません。 ネットでの情報も少なく、何が悪いのかわかりません。windowsで動いてなぜlinuxで動かないのでしょうか?

    • ベストアンサー
    • Java
  • VBA Excel処理の追加を2点教えてください

    Office2003(SP3) 以下は、昔、教えてもらったExcel VBAスクリプトで、よく使わせて もらってます。「C:\mybooks\」にあるxlsファイル(a001.xls、a002.xls、 a003.xls・・・・)を片っ端から開き、 1つのBookに束ねる動作をします。 これだけでも大変便利なのですが、もう少し改善いたしたく。 (1) 束ねられたBookのSheet名が、Sheet1、Sheet1 (2)、Sheet1 (3)、 Sheet1 (4)・・・ になってしまいます。そこで、ファイル名から拡張子を落 とした文字列をSheet名にセットする記述をご教示下さい。 (2) a001.xls、a002.xls、a003.xls・・・は、それぞれSheet1、Sheet2、 Sheet3を含みます。Sheet1だけが抜き取られてSheet2、Sheet3が残された大量 の残骸Bookが開きっぱなしになります。これら、保存せずに閉じる記述を追加 したいのですが。 よろしくお願い致します。 Sub OpenFiles() Dim i As Integer Dim wb As Workbook Dim fname Dim dirname As String ' i = 1 dirname = "C:\mybooks\" fname = Dir(dirname + "*.htm") If fname <> "" Then Do While fname <> "" If fname <> "." And fname <> ".." Then If i = 1 Then ' 最初のファイルを開く Workbooks.OpenText FileName:=dirname + fname Set wb = ActiveWorkbook ' 最初のファイルを新規ブックに複製して閉じる。 ActiveSheet.Copy wb.Close Set wb = ActiveWorkbook Else ' 2番目以降のファイルは複製した最初のファイルに追加 Workbooks.OpenText FileName:=dirname + fname ActiveSheet.Move After:=wb.Worksheets(wb.Worksheets.Count) End If i = i + 1 End If fname = Dir Loop Else MsgBox "検索条件を満たすファイルはありません。" End If Set wb = Nothing End Sub

  • EXECLの行を削除

    こんにちは 質問があります。 以下のコードのように、 テキストボックスに入力した行数の エクセルの行を削除したいのですが、 何も削除されません。 どなたか解決策を教えていただけないでしょうか よろしくお願いいたします。 import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.io.*; import java.util.*; import org.apache.poi.hssf.usermodel.*; import org.apache.poi.poifs.filesystem.POIFSFileSystem; class testdel { public static void main(String[] args) { testdel2 test=new testdel2(); } } class testdel2 implements ActionListener { JButton button; JTextField text; testdel2() { JFrame frame=new JFrame(); JPanel panel=new JPanel(); button=new JButton("削除"); text=new JTextField(1); button.addActionListener(this); panel.add(text); panel.add(button); Container ct=frame.getContentPane(); ct.add(panel); frame.pack(); frame.setVisible(true); } public void actionPerformed(ActionEvent e) { if(e.getSource()==button) { int del_row=Integer.parseInt(text.getText()); Delete del=new Delete(del_row); } } } class Delete { Delete(int delrow) { try {System.out.println(delrow); FileInputStream fis = new FileInputStream("c:/sample.xls"); POIFSFileSystem fs = new POIFSFileSystem(fis); HSSFWorkbook wb1 = new HSSFWorkbook(fs); HSSFSheet sheet = wb1.getSheetAt(0); HSSFRow row=sheet.getRow(delrow); sheet.removeRow(row); System.exit(0); } catch(Exception e) { System.err.println(e.toString()); } } }

    • ベストアンサー
    • Java
  • POIの出力場所について

    お世話になります。 POI 出力などで検索を行いましたが上手くHITしませんでしたのでご質問させて頂きます。 例えば HSSFWorkbook workbook = null; FileOutputStream out = null; out = new FileOutputStream("質問.xls"); workbook.write(out); など記述し出力すると思うのですが「質問.xls」を C:\testに指定して出力したいなど指定した階層に出力するということは出来るでしょうか。

    • ベストアンサー
    • Java
  • Jakarta POI での、excelのシート保護

    こんにちは。いつも色々と参考にさせていただいております。POIを利用して、excelのシートの操作をやっているのですが、シートの保護がうまくいきません。 まず、sample.xlsを読み込み、 FileInputStream is = new FileInputStream("sample.xls"); HSSFWorkbook book = new HSSFWorkbook(is); HSSFSheet sheet = book.getSheetAt(0); HSSFSheetクラスのsetProtectメソッドを用いて、 sheet.setProtect(false); とすると、NullPointerExceptionが発生してしまいます。 メソッドの使い方が間違っているのでしょうか? どなたかご存知でしたらご教授いただきたいと思います。 よろしくお願い致します。

    • ベストアンサー
    • Java
  • 同じフォルダ内のブックを開きコピーする方法

    いろいろチャレンジしてみたのですが どうにも行き詰っております。 ご教示頂ければ幸いです。 1つのフォルダに3つ(数は固定)のシートがあります。 フォルダ名は毎回変わります。 C:\デスクトップ\作成 ├4328457 神戸 ├作成元データ(名前は固定)←Aとします。  ├1314 電源工事(名前は毎回変わります)←Bとします。 └見積.xls(名前は固定)←今回は使いません 毎回名前の変わるBを先に開き、下記の「FileOpen」マクロで Aを開きます。 Bにあるシート(数は変動)を全て、Aにあるシート(3枚固定)の前に コピーし、Bは閉じてしまい、Aにて作業をしたいと思います。 Sub FileOpen()   Dim Wb As Workbook   Dim Fname As String     Dim PathName As String    Set Wb = ActiveWorkbook   Fname = "作成元データ.xls" PathName = Wb.Path   If Right(PathName,1)="\" then   Workbooks.Open Filename:=PathName & Fname   Else     Workbooks.Open Filename:=PathName & "\" & Fname     ThisWorkbook.Active    End If End Sub 「ThisWorkbook.Active」にてBに戻しているつもりなのですが Aがアクティブのままであり、Bのシートをコピー選択できなくなってしまっています。 Sub BookOpen() Workbooks.Open Filename:=ThisWorkbook.Path & "\作成元データ.xls" End Sub こちらのように簡単な構図も試してみたのですが PESONAL.xlsbのあるフォルダ?を見に行くようでうまく「作成元データ」を開けませんでした。 お詳しい方には基本的な事かもしれませんが どうぞ宜しくお願い致します。   

  • VBAであるBOOKの「sample」というシートを別BOOKに

    VBAであるBOOKの「sample」というシートを別BOOKに 別Bookにコピーしたいのですが、 ネットを参考にして下記のようにするとエラーになります。 実行時エラー'9' 「インデックスが有効範囲にありません」 と表示されます。 どこが間違っているでしょうか? どなたか教えてください。 ---------------------------------------- Dim NewBook As Workbook Dim fName As String Set NewBook = Workbooks.Add fName = ThisWorkbook.Path & "cp.xls" NewBook.SaveAs Filename:=fName Workbooks("moto.xls").Sheets("ピッキング").Cells.Copy Workbooks(fName).Sheets("Sheet1").Paste Destination:=Cells(1, 1) '<---ここでエラー Workbooks(fName).Save ----------------------------------------

  • エクセルVBAでBOOKに読み取りパスワード設定

    エクセル2013です。 以下のコードで指定した任意のフォルダ内のエクセルに読み取りパスワードを設定できました。 しかし、そのフォルダの下にサブフォルダーがあった場合にサブフォルダ内のBOOKは対象になりません。どのように直せばサブフォルダも対象にできるようになるでしょうか?教えてください。 Sub TEST01()   Dim myfdr As String, fname As String   Dim mb As Workbook, wb As Workbook   Dim n As Long   With Application.FileDialog(msoFileDialogFolderPicker) '対象とするフォルダの指定      If .Show = True Then       myfdr = .SelectedItems(1)     Else       MsgBox "キャンセルします。"       Exit Sub     End If   End With   Set mb = ThisWorkbook 'このコピー先ブックをmbとする。   fname = Dir(myfdr & "\*.xls*") 'フォルダ内のExcelブックを検索   n = 2   Do Until fname = Empty '全て検索     Set wb = Workbooks.Open(myfdr & "\" & fname) 'そのブックを開きwbとする。     With mb.Sheets("Sheet1") '転記       .Cells(n, "B").Value = wb.FullName       .Cells(n, "C").Value = wb.Sheets(1).Range("B1").Value     End With     n = n + 1 'カウント     Application.DisplayAlerts = False     wb.SaveAs Filename:=wb.FullName, Password:="emaxemax"     wb.Close     Application.DisplayAlerts = True     fname = Dir 'フォルダ内の次のExcelブックを検索   Loop '繰り返す   MsgBox n - 2 & "件処理しましました。" End Sub

  • エクセルマクロでファイル名のみ(拡張子無し)格納

    下記の様なマクロが有りますが、ここでファイル名のみ(拡張子無し)を fairumeiに格納したいのですがどの様なコードを書いた方が良いのでしょうか。? (ファイル名の長さは全部違います、エクセル2000) どうか、宜しくお願いします。 Sub シート検索版() Dim myPName As String myPName = Application.GetOpenFilename("測定データ(*.xls;*.csv),*.xls;*.csv") If myPName = "False" Then Exit Sub Dim wb_New As Workbook Set wb_New = Workbooks.Add Dim myKAKUCHOSI As String Dim myPATHNAME As String Dim myLName As String Dim fairumei As String Dim wb As Workbook On Error GoTo mfinish fairumei = ここが分からない myPATHNAME = CurDir myLName = Dir(myPATHNAME & "\" & "*" & myKAKUCHOSI) 'パス及びファイル名拡張子付き

  • 実行時エラー’438 の解消

    QNo.3040449 と同じ内容の質問です。本を見ながらコードを書いてみましたが、 実行時エラー’438 オブジェクトはこのプロパティまたは メソッドをサポートしていません。となってしまいました。 どこを変更すれば、よいのでしょうか? また、元データをそれぞれ、<条件>シートの内容で抽出し、 可視セルのみ<集約>にコピーしたのち、他の2つの ファイルのデーターも先に貼り付けたデータの最後行の 下へコピーしたいのですが、コードがよくわかりません。 教えて頂ければ幸いです。 集約するシート:テスト用.xls sheet1.(集約) sheet2.(条件) 元のデータ: 金額一覧表(01~03).xls Sheet1.(01~03)   金額一覧表(04~06).xls Sheet1.(04~06)  金額一覧表(07~10).xls Sheet1.(07~10) <各データは1.5万~3万件> Sub 抽出後コピー() Dim myTbl As Range, myQry As Range, sakiRang As Range Dim Nx As Long Dim WBK As Workbook, WB1 As Workbook Dim SH1 As Worksheet, SH2 As Worksheet Set WBK = Workbooks("テスト用.xls") Set WB1 = Workbooks("金額一覧表(01~3).xls") Set SH1 = WB1.Sheets("(01-03)") WBK.Activate WB1.Activate Nx = SH1.Range("R65536").End(xlUp).Row Set myTbl = WB1.SH1.Range("A1:Nx") ←ここでデバック Set myQry = WBK.Sheets("条件").Range("A1:F27") Set sakiRang = WBK.Sheets("集約").Range("A1") myTbl.AdvancedFilter xlFilterCopy, myQry, sakiRng End Sub

専門家に質問してみよう