2017-03-01 112 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'实例你的地图 –