2017-03-01 37 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異常:該工作簿已經包含在 org.apache.poi.hssf.usermodel.HSSFWorkbook.createSheet(HSSFWorkbook.java:877)命名爲 '保險' 一 板在BasicExcel.createACell (BasicExcel.java:22)在 EmailTestWithScanner.readEmails(EmailTestWithScanner.java:115)在 EmailTestWithScanner.main(EmailTestWithScanner.java:137) java.lang.IllegalArgumentException異常:工作簿中已經包含命名爲 'MMS' 在 片 org.apache.poi.hssf.usermodel.HSSFWorkbook.createSheet(HSSFWorkbook.java:877) at BasicExcel.crea teACell(BasicExcel.java:22)在 EmailTestWithScanner.readEmails(EmailTestWithScanner.java:115)在 EmailTestWithScanner.main(EmailTestWithScanner.java:137)

請讓我知道我要去哪裏錯了,怎麼能我修復它。

感謝

+0

只有在你的循環 – Gagravarr

+0

@Gagravarr年底創建的表,你的意思是'while'或'for'? – user3872094

+0

表單上的for循環 – Gagravarr

回答

1

你應該首先檢查是否具有相同名稱的表已經存在使用getSheetIndex(String name)

如果返回-1,那就意味着它不存在,但這樣你就能夠調用createSheet(String sheetname)安全,否則你將能夠使用getSheetAt(int index)來獲取相應的HSSFSheet實例。

下面是給出了這個概念的僞代碼:

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作爲值並從中獲取你的'HSSFSheet'實例你的地圖 –