POI修改sheetname时报错的坑--XSSFWorkbook

在写一个适用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之间是不是有什么不可告人的秘密(手动滑稽)

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
可以使用 Apache POI 库中的 `cloneSheet()` 方法实现将一个 sheet 复制到另一个 Excel 文件的 sheet 中。 具体实现步骤如下: 1. 创建一个新的工作簿对象,例如 `Workbook wb2 = new XSSFWorkbook();`。 2. 使用 `wb2.createSheet()` 方法创建一个新的 sheet 对象,并指定要将要复制的 sheet 的名称。 3. 使用 `wb1.getSheet(sheetName)` 方法获取要复制的 sheet 对象。 4. 使用 `wb2.cloneSheet()` 方法将要复制的 sheet 复制到新的工作簿对象中。该方法返回一个新的 sheet 对象,保存在变量中。 5. 使用 `wb2.write()` 方法将新的工作簿对象保存到磁盘上的 Excel 文件中。 示例代码如下: ```java import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook; public class CopySheetToAnotherExcel { public static void main(String[] args) throws Exception { // 打开旧的 Excel 文件 FileInputStream fis = new FileInputStream(new File("old.xlsx")); Workbook wb1 = new XSSFWorkbook(fis); fis.close(); // 创建新的工作簿对象 Workbook wb2 = new XSSFWorkbook(); // 创建新的 sheet,名称为 "newSheet" Sheet newSheet = wb2.createSheet("newSheet"); // 获取要复制的 sheet Sheet oldSheet = wb1.getSheet("oldSheet"); // 将旧的 sheet 复制到新的工作簿对象中,并返回新的 sheet 对象 Sheet clonedSheet = wb2.cloneSheet(wb1.getSheetIndex(oldSheet)); // 将新的 sheet 对象复制到新的工作簿对象中 wb2.setSheetName(wb2.getSheetIndex(clonedSheet), newSheet.getSheetName()); // 将新的工作簿对象保存到磁盘上的 Excel 文件中 FileOutputStream fos = new FileOutputStream(new File("new.xlsx")); wb2.write(fos); fos.close(); } } ``` 上述代码将旧的 Excel 文件中名为 "oldSheet" 的 sheet 复制到一个新的 Excel 文件中,并将其命名为 "newSheet"。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值