プロが教えるわが家の防犯対策術!

こんにちは。

現在JavaでExcelのセルから情報を取り込んで、それらを加工し、データベースに登録するプログラムを考えております。

まずはExcelから情報を取得することを目指しているのですが、文字列や数字は正常にセルからString型の変数に取り込めましたが、日付情報だけ5ケタの数字に変化してString型に取り込まれてしまいます。
双方の型が違うため取得が上手くいかないのでは!?と考えているのですが、解決方法が見つかりません><

データは途中で加工するため、日付型(!?)でセルに入っているものを、Stringに取り込んで、Stringで加工をして、またStringから日付型に戻してデータベースに登録したいというものです。

自身でも色々と調べてみましたが、解決策は見つからず、こちらに泣きついた次第です。
ご教授いただければ幸いです、どうぞ宜しくお願い致します。

<Excel>
2003

<Excelの表>
    A    B     C
1|食料品|個数|賞味期限|
2|バナナ|2|H23.6.30|
3|りんご|3|H23.7.1|

<参考プログラムのURL>
http://vapour.s22.xrea.com/javadojo/index.php?Jx …

<プログラム>
import java.io.File;
import jxl.Cell;
import jxl.Workbook;
import jxl.Sheet;

public class Sample{

public static void main(String[] args){

String inputFileName = "output.xls";

Workbook workbook = null;

try {

System.out.println(inputFileName + "ブックをオープンします");

workbook = Workbook.getWorkbook(new File(inputFileName));

if (workbook == null) {

System.err.println(inputFileName + "ブックオープンに失敗しました");

return;

}

} catch (Exception ex) {

System.err.println(ex.toString());

return;

}

System.out.println("1番目のシートにアクセスします");

Sheet sheet = workbook.getSheet(0);

if (sheet == null) {

System.err.println(inputFileName + "シート作成に失敗しました");

return;

}

Cell cell = null;

String cellStr = "";

try {

for(int i=0;i<3;i++) {

for(int j=0;j<3;j++) {

cell = sheet.getCell(i,j);

cellStr = cell.getContents();

System.out.println("セル("+i+","+j+") は「"+cellStr+"」です");

}

}

} catch (RuntimeException ex) {

System.err.println("A3セルの読込に失敗しました:" + ex.toString());

}

try {

if (workbook != null) {

workbook.close();

}

} catch (Exception ex) {

System.err.println(inputFileName + "ブックのクローズに失敗しました:"

+ ex.toString());

}
}
}

A 回答 (3件)

>H23.6.30


と入力しているということは、セルの分類は「日付」にはなっていませんよね。
すみませんでした。

bin-chanさんのおっしゃるようにシリアル値は特定の日付からの経過日数を表しますので、

//windowsでのデフォルトでは1900/1/1 12:00:00AMから
//上記時刻を表すCalendarクラスのインスタンス
Calendar cal = Calendar.getInstance();
cal.set(1900, 0, 1, 12, 0, 0);

//1900/1/1のシリアルが1なので、加算する値は取得した値 - 1になる
int serial = Integer.parseInt(cellStr) - 1;
//1900/2/29は存在しないがエクセル内では存在しているらしいので
//その日付以降であればさらに -1
serial -= (serial > 60 ? 1 : 0);
//基準日に加算
cal.add(Calendar.DATE, serial);
//確認のために表示
System.out.println(String.format("%1$tD",cal));

という感じで計算はできると思います。
ただ、日付が入力されているセルが特定できていないとダメですが。
また、
>WindowsとMacで異なります。オプションで補正が可能。
というのは
http://support.microsoft.com/kb/214094/ja
などを参考に。
    • good
    • 0
この回答へのお礼

2度もご回答いただきありがとうございます。
お教えいただいた「基準日に加算する方法」で上手くいきました!!
長い時間悩んでいたので、本当に助かりました。
本当にありがとうございましたm(_ _)m

お礼日時:2011/06/20 20:06

ava Excel APIは使ったことがないのですが、チュートリアルに日付セルの読み込み方があります。


http://www.andykhan.com/jexcelapi/tutorial.html# …
>if (c2.getType() == CellType.DATE)
>{
> DateCell dc = (DateCell) c2;
> datec2 = dc.getDate();
>}
日付セルであればDateCellにキャストしてDateオブジェクトを取得できるようです。
そのDateオブジェクトを文字列に変換すればいいのではないでしょうか。

この回答への補足

ご回答いただきありがとうございます。
ご紹介いただいたURLを参考にプログラムを修正し、getType()で説明文にあるExcelの各セルを取得したところ、バナナはLABEL、2はNUMBER、H23.6.30はNUMBERと判定されました。
やはりH23.6.3に関しては、セルの中身がNo1の方にご指摘いただいた通り、シリアル値として取得されており、NUMBERの判定となったみたいです^^;
自身の知識不足で未だ解決できていませんが、今一歩のような気もしますので、もう一度他の手法はないか、一から検討してみます。
再度ですが、ありがとうございました。

補足日時:2011/06/16 19:33
    • good
    • 0

EXCELは日付を「シリアル値」として持ってます。

「ある基準日」からの通算日数です。
「ある基準日」のデフォルトはWindowsとMacで異なります。オプションで補正が可能。
そこらへんも調べておく必要がありますよ。

この回答への補足

ご回答ありがとうございます。
シリアル値も検索ワードに入れて、再度色々と調べていますが、未だ解決には至っていません。
しかし、5ケタの数字の謎が解けただけでも、かなり前進した気がします。
ありがとうございました。

補足日時:2011/06/16 19:40
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!