在写一个适用poi编辑excel程序时,有一段代码是复制原有sheet页并清除格式以外的填入信息,然后对新sheet页重命名并放置在第一页,代码块如下:
XSSFWorkbook wb = null;
FileInputStream fis = new FileInputStream(targetFile);//使用文件路径读入文件流
wb = new XSSFWorkbook(fis);
XSSFSheet fromsheet = wb.getSheet(fromsheetname);//获取原有sheet页
if (fromsheet != null && wb.getSheet(newsheetname) == null) {
wb.cloneSheet(0);//克隆原有sheet页作为基础
int sheetNum = wb.getNumberOfSheets();//获取sheet页数量
wb.setSheetName(sheetNum-1, newsheetname);//修改新生成的sheet页名称
wb.setSheetOrder(newsheetname, 0);//将最新的sheet页挪到第一页
clearNewSheet(wb.getSheet(newsheetname));//清除新sheet页中数据
}
在测试过程中程序执行到wb.setSheetName(sheetNum-1, newsheetname);
时就报错,错误信息大概是org.apache.poi.ss.formula.FormulaParseException: Specified named range 'LOCAL_YEAR_FORMAT' does not exist in the current workbook
在网上根本就搜不到这个错误信息,从字面意思理解就是“当前工作簿中不存在指定的命名范围“LOCAL_YEAR_FORMAT”这个格式”,问题在于我根本就没有使用过这个格式,并且我重命名sheet页名称使用最简单的123或者abc都一样还是这个错,显然不是名称的问题;在查询API时发现有一个updateSheetName的方法API中的参数和我项目中反编译出来updateSheetName方法的参数不一样。我猜想是不是和poi的版本有关,毕竟目前最高版本4.0都有各种坑。项目中使用的poi版本是3.9,我从网上查看说3.15是稳定版,找这个版本也费了一番功夫。在查找3.15版本呢的时候偶然间发现3.15版本的API中在wb.cloneSheet这个方法有两个,一个是只有一个index参数,另一个有两个参数index和newsheetname;踏破铁鞋无觅处得来全不费工夫啊,这样一来就不用再用setSheetName这个方法了,跳过这个方法不失为一种解决方案,马上动手替换poi的jar包测试,完美解决,sheet页拷贝并且重命名了,找了两天的问题终于解决了。poi的坑还是有很多啊
**注:**我觉得没有人遇到我这种问题在于我是在特殊情况下对excel进行操作的,那就是操作的excel是从svn上检出的,我对本地新建的excel进行过测试setSheetName方法完全没有问题,所以我在想poi与svn之间是不是有什么不可告人的秘密(手动滑稽)