Java后端实现按照模板自动导出excel功能
按照模板进行自动导出excel功能
本文主要是通过使用XLSTransformer与Apache POI库实现按照模板进行excel文件的导出功能。XLSTransformer是一种模板引擎(是JXLS库的一部分),它能够根据预定义的Excel模板文件以及传入的数据进行动态填充。这意味着它可以查找并替换模板中的特定标记(例如${list.xxx}),用实际数据填充这些位置。Apache POI库的Workbook对象是一个用于处理Microsoft Office格式文件的Java API,尤其是这里用来操作Excel工作簿。
本文主要是对数据库中简单表(无主子表、动态表头等复杂结构)进行查询后进行导出,过程为:首先从数据库按照特定条件对要输出数据进行查询并存储到List<Map<String,Object>>结构中,然后在service层进行导出路径拼接及导出方法调用。
dao层:
@Mapper
public interface YbCjjysMapper {
List<Map<String,Object>> searchYbCjjys(@Param("dwxh")String dwxh, @Param("nf")String nf, @Param("yf")String yf);
}
在dao层中主要是对数据库中数据按照特定条件查询并保存。
service层
接口如下:
public interface ExportYbService {
void searchYbCjjys(String templatePath, String outputPath, String dwxh, String nf, String yf);
}
实现类如下:
@Service
public class ExportYbServiceImpl implements ExportYbService {
@Autowired
YbCjjysMapper ybCjjysMapper;
@Override
public void searchYbCjjys(String templatePath, String outputPath, String dwxh, String nf, String yf){
List<Map<String, Object>> CjjysData = ybCjjysMapper.searchYbCjjys(dwxh, nf, yf);
String fileName = "123.xlsx";
String filePath = templatePath+"/"+fileName;
ExcelUtil.exportExcelByTemplate(filePath,outputPath,fileName,CjjysData);
}
在service层主要是拼接模板路径并调用utils层的导出方法进行excel导出。其中templatePath是模板存储路径;outputPath为输出路径。
controller层
@RestController
@Api(value = "导出")
@RequestMapping("/yb/export")
public class YbExportController {
@Autowired
ExportYbService exportYbService;
@GetMapping("/exportYb")
@ApiOperation(value = "按照模板导出")
void exportYb(String dwxh,String nf,String yf, HttpServletResponse httpServletResponse) throws Exception{
exportYbService.searchYbCjjys(ybTemplatePath, ybOutPath, dwxh, nf, yf);
}
在controller层直接调用service层即可进行导出。
utils层(核心)
其中在service层调用的ExcelUtil.exportExcelByTemplate
方法具体代码如下:
public static void exportExcelByTemplate(String templatePath, String outputPath, String fileName, List<Map<String, Object>> exportData) {
File file = new File(outputPath);
if (!file.exists()) {
file.mkdir();
}
String filePath = outputPath + System.getProperty("file.separator") + fileName;
exportFileByTemplate(templatePath, filePath, exportData);
LOGGER.info("Excel按模板生成成功,文件落地:{}", file.getAbsolutePath());
},
public static
: 这意味着该方法是公开的,并且是静态的,因此可以直接通过类名调用,而不需要创建类的实例。void
: 方法没有返回值。- 首先,创建一个
File
对象,表示outputPath
指定的目录。 - 接下来,检查这个目录是否存在。如果不存在,则使用
mkdir()
方法创建它。 - 然后,使用
outputPath
、fileName
和系统属性file.separator
(在Windows上通常是\
,在Unix/Linux上通常是/
)来构建完整的文件路径filePath
。 - 调用
exportFileByTemplate
方法,该方法是用来根据模板生成Excel文件的。它接收三个参数:模板路径、目标文件路径和要导出的数据。 - 最后,使用
LOGGER
记录一条信息,表示Excel文件已成功生成并存储在指定的路径。 - 参数列表:
String templatePath
: 模板文件的路径。String outputPath
: 输出文件的目录路径。String fileName
: 输出文件的名称。List<Map<String, Object>> exportData
: 要导出到Excel的数据。这是一个列表,其中每个元素都是一个映射,该映射的键是字符串类型(可能是列名),值是对象类型(可能是要填充到相应单元格的数据)。-
LOGGER
的定义如下:
private static final Logger LOGGER = LoggerFactory.getLogger(ExcelUtil.class);
//主要用于初始化一个日志记录器(Logger)对象,通常用于记录日志信息。这里,它使用了SLF4J(Simple Logging Facade for Java)和Logback(或其他SLF4J实现)这样的日志框架。且这个LOGGER变量只能在当前类(在这里是ExcelUtil类)中被访问。可以使用它来记录不同级别的日志信息,如DEBUG、INFO、WARN、ERROR等。
其中exportFileByTemplate
方法具体代码如下:
public static void exportFileByTemplate(String templatePath, String outputPath, List<Map<String, Object>> data) {
Map<String, Object> param = new HashMap<>();
param.put("list", data);
Workbook workbook = getWorkBookByTemplate(templatePath, param);
try (FileOutputStream fileOut = new FileOutputStream(outputPath)) {
workbook.write(fileOut);
} catch (IOException e) {
e.printStackTrace();
}
}
首先,创建一个新的 HashMap 对象 param,并向其中添加一个键为 “list” 的条目,该条目的值是传入的 data 列表。这一步是为了将数据包装在一个单一的对象中,以便在后续处理中能够方便地访问它。接下来,调用 getWorkBookByTemplate
方法,并传入模板路径 templatePath 和包含数据的 param 映射。这个方法负责根据模板和数据创建一个 Workbook 对象(这是一个Excel工作簿的实例)。使用 try-catch 语句创建一个 FileOutputStream 对象 fileOut,它负责将 Workbook 对象写入到指定的输出路径 outputPath。try-catch 语句确保在写入完成后或发生异常时,FileOutputStream 会被正确关闭。在 try 块内,调用 workbook.write(fileOut)
方法将工作簿的内容写入到文件输出流中,从而生成Excel文件。如果在写入过程中发生 IOException,则捕获该异常并打印其堆栈跟踪信息。
其中getWorkBookByTemplate
方法具体代码如下:
public static Workbook getWorkBookByTemplate(String templatePath, Map<String, Object> beanParams) {
try {
//读取模板
InputStream is = new FileInputStream(templatePath);
XLSTransformer transformer = new XLSTransformer();
//向模板中写入内容
return transformer.transformXLS(is, beanParams);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
负责根据提供的模板路径 templatePath 和参数映射 beanParams 来生成一个 Workbook 对象。这个 Workbook 对象代表了一个Excel工作簿,它包含了根据模板填充了数据的内容。具体分析如下:
使用 try-catch 块来捕获可能在读取模板或转换过程中发生的异常。在 try 块内,首先通过 new FileInputStream(templatePath) 创建一个 InputStream 对象 is,用于读取位于 templatePath 路径的Excel模板文件。接下来,创建一个 XLSTransformer 对象,主要用于处理Excel模板的转换工作。调用 transformer.transformXLS(is, beanParams) 方法,并传入之前创建的输入流 is 和参数映射 beanParams。这个方法会读取Excel模板,然后根据提供的参数替换模板中的占位符或变量,并生成一个新的 Workbook 对象。如果在读取模板或转换过程中发生任何异常,catch 块会捕获这些异常,并打印其堆栈跟踪信息。
导入的第三方库
<dependency>
<groupId>net.sf.jxls</groupId>
<artifactId>jxls-core</artifactId>
<version>1.0.6</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.15</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.15</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-scratchpad</artifactId>
<version>3.15</version>
</dependency>
合并多个页签点击此处