![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
java勉強中のものです。
エラーが出て困っています。
プログラム内容としては、
エクセルファイルを読み込み、それを配列に入れるというプログラムです。
class ReadFileArray2{
public static class DataTable{
Object getCellValue2;
DataTable(Object getCellValue){
this.getCellValue2 = getCellValue;
}
}
static final String ID = "/Users/home/java/20160501.xlsx";
public static void main(final String[] args) throws Exception{
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
System.out.println("読み込むデータの日付を入力してください*(例5.1)");
String Date = br.readLine();
System.out.println(Date + "のデータの読み込みを開始します");
try {
FileInputStream fis = new FileInputStream(ID);
Workbook wb = WorkbookFactory.create(fis);
Sheet sheet = wb.getSheet(Date);
DataTable[][] table = new DataTable[86][20000];
for(int i = 0; i <= sheet.getLastRowNum(); i++){
Row row = sheet.getRow(i);
for(int j = 0; j <= row.getLastCellNum(); j++){
Cell cell = row.getCell(j);
// System.out.print(getCellValue(cell)+" ");
table[i][j] = getCellValue(cell);
}
}
for(int x = 0; x <= table.length; x++){
for(int t = 0; t <= table.length; t++ ){
System.out.print(table[x][t]);
}
}
System.out.println("");
}catch(Exception e){
e.printStackTrace();
}
}
@SuppressWarnings(value={"deprecation"})
private static Object getCellValue(Cell cell){
if(cell == null){
return "";
}
switch (cell.getCellTypeEnum()) {
case STRING:
return cell.getRichStringCellValue().getString();
case NUMERIC:
if(org.apache.poi.ss.usermodel.DateUtil.isCellDateFormatted(cell)) {
java.util.Date date = cell.getDateCellValue();
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("h:mm");
LocalDateTime localDateTime = LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());
String formatted = dateTimeFormatter.format(localDateTime);
return formatted;
}else{
return cell.getNumericCellValue();
}
case FORMULA:
return cell.getCellFormula();
default:
return "" ;
}
}
}
コメントアウトしているものは読み込めているかの確認用です。
コンパイルすると
ReadFileArray2.java:47: エラー: 不適合な型: ObjectをDataTableに変換できません:
table[i][j] = getCellValue(cell);
とエラーが出ます。
Switch文でObject型を用いているせいなのだと思われるのですが、
解決策が分かりません。
何かいい方法ありませんか?
No.3ベストアンサー
- 回答日時:
>ここでの作業は、DataTable型に変換している感じでしょうか?
Fooはあなたの DataTable型にあたるものです。
>Q1の作業ですでに文字列を返していると思うのですが、
>ここでのreturnはどういうことなのでしょうか?
まず、修正
retrun new Foo(Foo.DataType.Numeric, "文字列");
は
retrun new Foo(Foo.DataType.String, "文字列");
ですね。
Foo[][] table = new Foo[86][20000];
で受け取るのですから、getCellValue が返すのは Foo 型が
よいだろうということです。Fooに文字列は代入できません。
==========
DataType getDataType() {
return this.dataType;
}
String getDataAsString() {
return (String)this.data;
}
==========
こいつらは、Foo型を使ってなにか処理する時に使います。
おかげさまでなんとなく分かってきました^^
ありがとうございます。
最後、配列に格納する際は
table[i][j] = new Foo();
でよろしいのでしょうか?
No.4
- 回答日時:
>table[i][j] = new Foo();
これは出来ないです。コンパイルエラーになる筈。
>table[i][j] = getCellValue(cell);
を想定してます。
getCellValueですと、同じように不適合な型:object型をDataTable型に変換できませんとエラーが出ます。
個人的にはObject dataが原因なのではないかと思います。
public static class DataTable{
public enum DataType{
Double,String}
private DataType dataType;
private Object data;
public DataTable(DataType dataType, Object data){ ←
this.dataType = dataType;
this.data = data;
}
DataType getDataType(){
return this.dataType;
}
String getDataAsString(){
return (String)this.data;
}
double getDataAsDouble(){
return (double)this.data;
}
}
何度も質問して申し訳ないです。
No.2
- 回答日時:
文字列型や数値型を一つの型で持ちたいなら、Cell型のような実装
が普通でしょう。
例えば
public class Foo {
public enum DataType {
Numeric,
String
}
private DataType dataType;
private Object data;
public Foo(DataType dataType, Object Data) {
this.dataType = dataType;
this.data = data;
}
DataType getDataType() {
return this.dataType;
}
String getDataAsString() {
return (String)this.data;
}
int getDataAsInt() {
return (int)this.data;
}
}
のような感じの型を作って
Foo[][] table = new Foo[86][20000];
とし、getCellValue は Foo を返すことにして、
getCellValueの中で文字列を返す場合は
retrun new Foo(Foo.DataType.Numeric, "文字列");
とすればよいでしょう。
Fooを使う側は getDataType() の戻りが Foo.DataType.String だったら
getDataAsString()メソッドで文字列を取り出せばよいでしょう。
回答ありがとうございます。
いくつか分からない点を質問しともよろしいでようか?
<Q1>
DataType getDataType() {
return this.dataType;
}
String getDataAsString() {
return (String)this.data;
}
int getDataAsInt() {
return (int)this.data;
}
}
ここでの作業は、DataTable型に変換している感じでしょうか?
<Q2>
>getCellValueの中で文字列を返す場合は
>retrun new Foo(Foo.DataType.Numeric, "文字列");
>とすればよいでしょう。
>Fooを使う側は getDataType() の戻りが Foo.DataType.String だったら
>getDataAsString()メソッドで文字列を取り出せばよいでしょう。
Q1の作業ですでに文字列を返していると思うのですが、ここでのreturnはどういうことなのでしょうか?
No.1
- 回答日時:
getCellValue の戻りは全然 DataTable型でないのに
それをDataTble型の変数に格納できるわけがありません。
これなら Object型に格納した方がましですが、
getCellValueの中味も突っ込みどころが多すぎです。
もう少しゆっくり、基礎を学んだ方がよいのでは?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
- その他(プログラミング・Web制作) pythonでクラスで複数のメソッドを利用する方法 2 2022/04/15 04:17
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- その他(プログラミング・Web制作) python 気象データの取得 2 2023/06/20 23:54
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- Excel(エクセル) Excel 、この式はどのように解釈すればいいのでしょうか 4 2023/02/03 08:53
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- Excel(エクセル) B列に文字がはいったらA列に数字が入るマクロードを完成させたい 4 2023/04/21 01:58
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ループ処理の際、最後だけ","を...
-
論理演算子”||”またはの入力方法
-
*で正三角形を出力
-
16進数数字を結合して、10進数...
-
countに実行した回数をいれたい...
-
Java 入力した整数値の合計を、...
-
テキストボックスに入力された...
-
Ctrl+Zが入力されると終了する...
-
階乗の式
-
Java キーボードから負の数が入...
-
Java、2の0乗~10乗の表示
-
キーボードから10人分の点数を...
-
JAVAのfor文で困っています。
-
C言語のポインターに関する警告
-
EXCEL VBA で、0から?1から?
-
JSPやサーブレットでSystem.out...
-
ActionForm form にnullが入っ...
-
Java配列でNullPointerExceptio...
-
オブジェクトの中のプロパティ...
-
パソコンキーボードで時分秒を...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ループ処理の際、最後だけ","を...
-
続・ZZZ,ZZZ,ZZ9形式の金額形式...
-
java キーボード入力された値の...
-
テキストボックスに入力された...
-
論理演算子”||”またはの入力方法
-
総称型ArrayList<E>への参照...
-
7つ数字を表示したら改行すると...
-
Ctrl+Zが入力されると終了する...
-
countに実行した回数をいれたい...
-
キーボードから10人分の点数を...
-
Java、2の0乗~10乗の表示
-
Randomメソッドの確率設定
-
数値⇒漢数字変換 java
-
コマンドライン引数の例外処理...
-
Java 入力した整数値の合計を、...
-
javaのエラーが回収できない
-
2つのスクロールバーを連動させ...
-
階乗の式
-
C#の質問
-
Java キーボードから負の数が入...
おすすめ情報