关于创建工作表的困惑
我正在使用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)
请让我知道我要去哪里错了,怎么能我修复它。
感谢
你应该首先检查是否具有相同名称的表已经存在使用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);
}
感谢您的解决方案。但是这似乎需要花费很多时间来处理:( – user3872094
你必须多次执行它?如果是这样的话,把HSSFSheet放在一个以表名为键的映射中,并将相关的HSSFSheet作为值并从中获取你的'HSSFSheet'实例你的地图 –
只有在你的循环 – Gagravarr
@Gagravarr年底创建的表,你的意思是'while'或'for'? – user3872094
表单上的for循环 – Gagravarr