java.lang.IllegalArgumentException: 工作簿已经包含同名的工作表

4

插入超过120万条记录时,我遇到了异常。在一个工作表中成功插入了1,047,000条记录,当创建新的工作表来插入其余记录时,我遇到了以下错误:

java.lang.IllegalArgumentException: The workbook already contains a sheet of this name

我使用以下条件来创建新的工作表:

if(rowCount>1047000){
    wsSheet = createSheet(sheetName, xssfWorkbook);
    createHeader(wsSheet, columsnList, xssfWorkbook, null,listResult.isNameFieldRequired());
    rowCount = 1;
}

厌烦了不断更改代码中的 sheetName 吗?

wsSheet = createSheet(sheetName, xssfWorkbook) as sheetName+"1"

但仍然是相同的异常。


你的 sheetName 有多长?我认为它会在特定长度处被截断。另外,尝试一些随机的工作表名称,比如 sheetName = sheetName + System.currentTimeMillis(),而不是 sheetName+"1" - Master Po
在创建新表之前,请使用workBook.getSheetIndex(sheetName)检查现有表。如果返回的索引不等于-1,请检查您的表名称逻辑。 - Bor Laze
3个回答

3

org.apache.poi.ss.usermodel.Sheet 检查字符串是否已用作工作表名称的方式存在一些奇怪之处:候选名称使用 name.substring(0, 31) 进行截断,并与以同样方式截断的现有名称进行比较,因此您必须使这个范围内的字符串至少相差一个字符。


1
XSSFSheet newSheetName = workbook.createSheet("sheetName"+1);

这应该很简单。然后根据你的代码,你可能需要增加newSheetName变量的范围。


0

不要插入1,而是插入日期时间,因为它正在尝试一次添加所有记录,所以使用相同的工作表名称。

请使用以下代码获取日期时间,并在代码中调用它,以替换1。

请参考此代码以获取日期时间;

============================================================

String dateTime=new Date().toString().replaceAll(":", "_");

wsSheet = createSheet(sheetName, xssfWorkbook) as sheetName+dateTime;

字符串 dateTime=new Date().toString().replaceAll(":", "_");

wsSheet = 作为 sheetName+dateTime 创建工作表(createSheet(sheetName, xssfWorkbook));

=====================================================================

应该可以工作。

如果不行,使用带有毫秒的日期时间。

希望能帮到你。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接