使用EasyExcel(FastExcel) 的模板填充报Create workbook failure

场景

使用 EasyExcel (FastExcel) 做数据导出时,用了通过模板导出数据的形式。
在读取模板文件的时候出现错误导致创建Workbook 失败,
错误日志:

Create workbook failure...
No valid entries or contents found, this is not a valid OOXML (Office Open XML) file

错误原因

//templatePath 模板路径 resources 目录下的路径包括模板文件名(如 template/xxx.xlsx)
ClassPathResource templateResource = new ClassPathResource(templatePath);

这里读取到的文件路径其实不是我们原始文件的路径而是JAVA编译之后的target/classes下的路径,我们通过String absolutePath = templateResource.getAbsolutePath();就能得到路径地址。
这就是 Create workbook failure的原因之一。

如何解决
pom.xml里面添加 plugin

	<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-resources-plugin</artifactId>
				<configuration>
					<nonFilteredFileExtensions>
						<nonFilteredFileExtension>xls</nonFilteredFileExtension>
						<nonFilteredFileExtension>xlsx</nonFilteredFileExtension>
					</nonFilteredFileExtensions>
				</configuration>
			</plugin>

希望对你有帮助。
这个解决办法其实在github - easyExcel的Issues 有一位仁兄提出。本人亲测后确实可行。遂记录一下。

### 使用 EasyExcel 进行动态模板填充 为了实现动态模板填充,可以利用 `EasyExcel` 提供的功能来处理复杂的 Excel 文件生成需求。下面是一个具体的例子,展示了如何创建一个带有下拉框和其他动态内容的 Excel 文件。 #### 创建实体类 首先定义用于存储数据的对象模型,在此案例中为用户信息: ```java @Data @AllArgsConstructor @NoArgsConstructor public class User { private String name; private String workCode; private Integer age; private String select; // 对应于下拉框选项 } ``` #### 动态模板设置 接着配置模板中的特定样式和格式化规则,比如表头、背景色以及单元格内的验证条件(即下拉菜单)。这部分通常是在 Excel 模板文件里预先设定好,但也可以通过编程方式调整某些属性。 对于下拉列表的支持,可以通过自定义处理器完成。这里展示了一个简单的场景——向指定列添加预设值作为下拉项的选择范围[^3]。 #### 编写 Java 方法执行导出操作 最后编写一段程序逻辑读取输入的数据集并将其映射到相应的 Excel 单元格位置上。这一步骤涉及到了 EasyExcel 的 API 调用来构建 writer 实例,并调用 write() 函数将对象序列化成电子表格记录。 ```java import com.alibaba.excel.EasyExcel; import java.util.ArrayList; import java.util.List; // ... 导入其他必要的包 ... public void exportDynamicTemplate(String fileName, List<User> userList){ // 构建 Writer 并关联至目标路径下的新文件 try (ExcelWriter excelWriter = EasyExcel.write(fileName).withTemplate("template.xlsx").build()) { WriteSheet sheet = EasyExcel.writerSheet().build(); FillConfig fillConfig = FillConfig.builder() .forceNewRow(Boolean.TRUE) // 如果当前行已满,则强制换行 .build(); // 将 list 中的内容逐条填入工作簿内 for(User user : userList){ FillWrapper wrapper = new FillWrapper("name", user.getName()) .addFillWrapper(new FillWrapper("workCode", user.getWorkCode())) .addFillWrapper(new FillWrapper("age", user.getAge())) .addFillWrapper(new FillWrapper("select", user.getSelect())); excelWriter.fill(wrapper, fillConfig, sheet); } } catch (Exception e) { System.out.println(e.getMessage()); } } List<User> users = new ArrayList<>(); users.add(new User("张三","001",28,"A")); users.add(new User("李四","002",30,"B")); exportDynamicTemplate("/path/to/output/excel/file.xlsx", users); ``` 上述代码片段实现了基于给定模板文件 `"template.xlsx"` 来批量导入一组用户的资料,并且针对每一行都指定了要更新的具体字段名称及其对应的值。此外还设置了当遇到空白行时自动跳过的机制以确保最终输出的结果整洁有序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值