QA@IT

POI import時のエラー

15672 PV

Agaと申します。初歩的な質問かもしれませんが、ご回答いただけたら
大変助かります。

現在、Teeda + S2Dao + POI3.9 + Tomcat6.0.36 + JDK7u-45-x64 + Eclipse4.2
でシステムを作成しています。ですが下記のようなエラーがでてしまい
立ち往生しております。

エラー内容 java.lang.ClassNotFoundException: org.apache.poi.ss.usermodel.Font
エラー内容からみて、import部分で発生していると思い確認したところ
このクラスは使用していませんでした。

import部分のコード
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.ClientAnchor;
import org.apache.poi.ss.usermodel.Drawing;
import org.apache.poi.ss.usermodel.Picture;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFDataFormat;
import org.apache.poi.xssf.usermodel.XSSFFont;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

POI jarファイル9個のクラスパスも通っていました。
HSSF(.xls)の時はこのようなエラーは出ませんでした。

flied_onionさん、ご回答ありがとうございました。

早速ですが、調べた内容は下記内容となりました。

【POI 9個のファイル】

poi-3.9-20121203.jar
poi-examples-3.9-20121203.jar
poi-excelant-3.9-20121203.jar
poi-ooxml-3.9-20121203.jar
poi-ooxml-schemas-3.9-20121203.jar
poi-scratchpad-3.9-20121203.jar
dom4j-1.6.1.jar
stax-api-1.0.1.jar
xmlbeans-2.3.0.jar
のことです。

Font.Classは、存在しました。(jarを解凍したファイルにも)
Eclipseの参照ライブラリーにも参照されていました。
ただ、ファイルコピー参照設定した覚えはないんですが
POI-3.0-FINAL.jarが含まれていました。

【HSSFセルフォント設定のコード】

申し訳ありません。
HSSFの時にも、Fontを使用せずHSSFFontを使っていました。

HSSFCellStyle styleCalendar = wb.createCellStyle();
HSSFFont fnt = wb.createFont();
fnt.setFontName("MS 明朝");
styleCalendar.setFont(fnt);

styleCalendar.setAlignment(HSSFCellStyle.ALIGN_CENTER);         
HSSFDataFormat formatCalendar = wb.createDataFormat(); 
styleCalendar.setDataFormat(formatCalendar.getFormat("yyyy/mm/dd"));         

HSSFRow row1 = sheet.getRow(SAKUSEIBI_ROW);
HSSFCell cell1 = row1.getCell(SAKUSEIBI_COL);
cell1.setCellValue(Calendar.getInstance());
cell1.setCellStyle(styleCalendar);

【Office環境】

HSSF Office2003 XSSF Office2013です。

現在、プログラムをXSSFをHSSFに書き換えたのですが、
java.lang.ClassNotFoundException: org.apache.poi.ss.usermodel.Font
はでません。Excelファイル(.xls)は生成できました。

【インターフェースに定義されている定数】

short val = Font.BOLDWEIGHT_NORMAL;は400でした。
勝手な想像で申し訳ありませんが、値が設定できれば
Fontクラスは正常に動いているということになるのでしょうか?

ご質問事項に全てお答えできているか不安ですが、再度ご教示の程
よろしくお願いいたします。

flied_onionさん、ご回答ありがとうございました。
早速サンプルコードを実行したところ、xlsxのファイルが
できていました。だけど、今混乱しています。
teedaが関係しているとは考えにくいし、一体何が悪いのか
見えなくなってしまいました。
POI-3.0-FINAL.jar削除しても、java.lang.ClassNotFoundException:
org.apache.poi.ss.usermodel.Fontは出ています。

質問内容が変わってしまうんですが、今POIで行おうとしていることは
Excelファイルを読み込み、値を書き込み、画像ファイル(デイト印)を
挿入するのですが、画像ファイルがセルに合わせて拡大されてしまいます。
XSSFであれば、resizeメソッド使用して拡大しないようにできると
思いますが、HSSFでこれに代わるメソッド又は別の方法をご存じないでしょうか?

何度も申し訳ありません。ご教示の程よろしくお願いいたします。

flied_onionさん、ご回答ありがとうございました。(点を入れずにチェックしてしまい
申し訳ありません)resizeありました。本当に助かりました。ですが、今度は
Workbookが読み込めない状況です。フォントと同じエラー内容と考えています。
Fontは出なくなり、HSSFWorkbookに変わった??です。

【エラー内容】

java.lang.NoClassDefFoundError: org/apache/poi/hssf/usermodel/HSSFWorkbook
    at equipment.system.web.emtbl.EmtblStampPage.doOnceCreateDatemark(EmtblStampPage.java:80)
Caused by: java.lang.ClassNotFoundException: org.apache.poi.hssf.usermodel.HSSFWorkbook

【import 80行目付近 EmtblStampPage.java】

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFClientAnchor;
import org.apache.poi.hssf.usermodel.HSSFDataFormat;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFPatriarch;
import org.apache.poi.hssf.usermodel.HSSFPicture;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.IndexedColors;
try {
//Excelのワークブックを読み込みます。
HSSFWorkbook wb = new HSSFWorkbook(new FileInputStream(EXCEL_FOLDER + EXCEL_FILE));
//シートを読み込みます。
HSSFSheet sheet = wb.getSheet(EXCEL_SHEET);
wb.getSheet(EXCEL_SHEET).setSelected(true);

コード上の不備などなんでも構いません。何かあるようであれば
ご教示の程よろしくお願いいたします。

  • resizeメソッドについて追記しました。 -

回答

ただ、ファイルコピー参照設定した覚えはないんですが
POI-3.0-FINAL.jarが含まれていました。

これは削除した方がいいかもしれませんね。

HSSFの時にも、Fontを使用せずHSSFFontを使っていました。

これは実行できていればそれで問題ありません(というより実コードはそうなると思います)。

short val = Font.BOLDWEIGHT_NORMAL;は400でした。
勝手な想像で申し訳ありませんが、値が設定できれば
Fontクラスは正常に動いているということになるのでしょうか?

Fontクラスにアクセスできていますので、すくなくともなんらかのFontクラスは見つけられているという事になります。ただし、POI3.9のFontクラスかどうかはわかりません(たとえばですが、なぜかいたというPOI-3.0にもFontクラスがいて同じ定数が定義されていればそちらの可能性もありますよね?)。ですから「正常に」かどうかは言い切れません。
エラーがFontクラスに対するClassNotFoundExceptionだったので、確認しておきたかったまでです。


Windows 8.1 pro / Office 2013 / eclipse JUNO ( pleiades 4.2 ultimate ) の環境で、
新規 javaプロジェクトから、コンパイラは java 7 SE指定で簡単なコードを作成してみましたが正常に動作しました。

ライブラリはプロジェクトを作成後に、プロジェクトのプロパティから外部jarの追加で以下を追加しています。

poi-3.9-20121203.jar
poi-ooxml-3.9-20121203.jar
poi-ooxml-schemas-3.9-20121203.jar
dom4j-1.6.1.jar
stax-api-1.0.1.jar
xmlbeans-2.3.0.jar

この 6個で動作しました。
(提示してくれた 9個のjarを追加した状態でも動作しました。)

package qait_poi;

import java.io.FileOutputStream;
import java.io.IOException;

import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFFont;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class POIInspect {

  public static void main(String[] args) {
    new POIOperator().CreateXSSF();
  }
}

class POIOperator{

  public void CreateXSSF(){

    XSSFWorkbook wb = new XSSFWorkbook();
    XSSFCellStyle style = wb.createCellStyle();

    XSSFFont font = wb.createFont();
    font.setFontHeightInPoints((short) 11);
    font.setFontName("Courier New");
    font.setBold(true);
    font.setColor(IndexedColors.BLUE.getIndex());
    style.setFont(font);

    XSSFSheet sheet = wb.createSheet("SheetXSSF");

    XSSFCell cell = sheet.createRow(0).createCell(0);
    cell.setCellValue("XSSF");
    cell.setCellStyle(style);

    try(FileOutputStream fileout = new FileOutputStream("poi_xssf.xlsx")) {
      wb.write(fileout);
    }catch(IOException ex){
      ex.printStackTrace();
    }
  }
}

ご参考までに。


追記

XSSFであれば、resizeメソッド使用して拡大しないようにできると
思いますが、HSSFでこれに代わるメソッド又は別の方法をご存じないでしょうか?

動作確認はしてませんが、ドキュメント的にはresize メソッドはあるみたいですよ?

http://poi.apache.org/apidocs/org/apache/poi/hssf/usermodel/HSSFPicture.html#resize()

このmailing listの頃に実装されたみたいですね

http://mail-archives.apache.org/mod_mbox/poi-user/200710.mbox/%3C312536a90710150628s761c0f9aob90ef14e22e112b5@mail.gmail.com%3E

編集 履歴 (2)

POI jarファイル9個のクラスパスも通っていました。

9個ってなんでしょうか?

http://poi.apache.org/download.html#POI-3.9
からダウンロードできるバイナリを解凍してもPOIのjarは6個のようですが。
(ooxml-lib も含めれば9個になりますがそれですか?)

見つからないといわれている org.apache.poi.ss.usermodel.Fontは、
以下のjarに含まれているようです(バージョンによっては日付は違うかもしれません)。

poi-3.9-20121203.jar

このjarが正しく参照できているか、壊れていないか、解凍して
org/apache/poi/ss/usermodel/Font.class が存在するか等確認されるといいかもしれません。


あとは、HSSFのプロジェクトの方で、org.apache.poi.ss.usermodel.Font を使ってみて動くようであればプロジェクトの設定不備があやしくなります。
試してませんが、以下のようなコードでインターフェースに定義されている定数を取り出してみれば検証できるんじゃないかと思います。

import org.apache.poi.ss.usermodel.Font;
~略~
short val = Font.BOLDWEIGHT_NORMAL;

http://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/Font.html#BOLDWEIGHT_NORMAL

編集 履歴 (1)
ウォッチ

この質問への回答やコメントをメールでお知らせします。