2017-03-01 9 views
0

POIを使用してJavaコードを作成していますが、ここではシートを作成してデータを追加します。基準は以下の通りである。シートの作成について混乱しています

私は以下のようなキーワードのセットを持つテキストファイルを持っています。

MainOne 
MainTwo 

私は使用可能なシートをループし、このキーワードに基づいてシートを作成しています。

キーワードが一致しない場合は、no keywordという名前のシートをブックに追加します。各繰り返しで、キーワードを含むシートが使用可能であるかどうかをチェックし、シートを作成しない場合は使用します。

メインクラス

public static void main(String[] args) throws Exception { 
     FileInputStream fileInputStream = new FileInputStream(new File("KeyWords.txt")); 
     Scanner sc = new Scanner(fileInputStream); 
     while (sc.hasNextLine()) { 
      String line = sc.nextLine(); 
      BasicExcel.createACell(line); 
     } 
     sc.close(); 
    } 

BasicExcelクラス

public static void createACell(String keyWord) throws IOException { 
     FileInputStream input_document = new FileInputStream(new File("C:\\Test\\new.xls")); 
     HSSFWorkbook workbook = new HSSFWorkbook(input_document); 
     int noOfSheets = workbook.getNumberOfSheets(); 
     HSSFSheet sheet = null; 
     for (int j = 0; j < noOfSheets; j++) { 
      if (!workbook.getSheetName(j).equalsIgnoreCase("No KeyWords")) { 
       sheet = workbook.createSheet("No KeyWords"); 
      } else if (!workbook.getSheetName(j).equalsIgnoreCase(keyWord)) { 
       sheet = workbook.createSheet(keyWord); 
      } else { 
       sheet = workbook.getSheet(keyWord); 
      } 
     } 
     input_document.close(); 
     FileOutputStream out = new FileOutputStream(new File("C:\\Test\\new.xls")); 
     try { 
      workbook.write(out); 
     } catch (FileNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     try { 
      out.close(); 
      workbook.close(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

私はこのプログラムを実行すると、私は以下の例外を取得しています。

java.lang.IllegalArgumentExceptionが:ワークブックがすでにBasicExcel.createACellで org.apache.poi.hssf.usermodel.HSSFWorkbook.createSheet(HSSFWorkbook.java:877) で '保険' という名前 シートが含まれています(BasicExcel.java:22) EmailTestWithScanner.main(EmailTestWithScanner.java:137) java.lang.IllegalArgumentExceptionがで EmailTestWithScanner.readEmails(EmailTestWithScanner.java:115)で:ワークブックがすでにで 'MMS' という名前 シートが含まれています org.apache.poi.hssf.usermodel.HSSFWorkbook.createSheet(HSSFWorkbook.java:877)at BasicExcel.crea teACell EmailTestWithScanner.main(EmailTestWithScanner.java:137)で EmailTestWithScanner.readEmailsで(BasicExcel.java:22)(EmailTestWithScanner.java:115)

ができ、私はどこが間違っているつもりです知っているとどのようにしてください私が直します。

おかげ

+0

あなただけが 'while'または' for'を意味し、あなたのループ – Gagravarr

+0

@Gagravarrの最後にシートを作成しますか? – user3872094

+0

シート上のforループ – Gagravarr

答えて

1

同じ名前のシートがすでにgetSheetIndex(String name)を使用して存在している場合は、最初に確認する必要があります。

それは-1を返した場合、それはあなたが安全にそうでなければ、対応するHSSFSheetインスタンスを取得するためにgetSheetAt(int index)を使用することができるだろうcreateSheet(String sheetname)を呼び出すことができるようになるので、それはまだ存在していないことを意味します。ここで

のアイデアを示した擬似コードです:

int index = workbook.getSheetIndex("No KeyWords"); 
HSSFSheet sheet; 
if (index == -1) { 
    // It doesn't exist yet so let's create it 
    sheet = workbook.createSheet("No KeyWords"); 
} else { 
    // It already exists so let's get it 
    sheet = workbook.getSheetAt(index); 
} 
+0

ありがとうございました。しかし、これは処理に多くの時間がかかるようです:( – user3872094

+0

何度もやらなければならないのでしょうか?シート名をキーにしてHSSFSheetを値としてマップに入れ、 'HSSFSheet'インスタンスをあなたの地図 –

関連する問題