打印工具类增加自动判断编译新模板
This commit is contained in:
parent
cc306258c7
commit
2ae4249d84
@ -36,8 +36,9 @@ import javax.print.attribute.standard.OrientationRequested;
|
|||||||
@Component
|
@Component
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class JasperReportUtil {
|
public class JasperReportUtil {
|
||||||
private static String template="template";
|
private static final String template="template";
|
||||||
private static String templatep="template/";
|
private static final String templatep="template/";
|
||||||
|
private static final String TEMPLATE_PATH = JasperReportUtil.getTemplatePath();
|
||||||
/**
|
/**
|
||||||
* 核心打印/导出方法
|
* 核心打印/导出方法
|
||||||
* @param printerName 打印机名称(可为null,null时使用默认打印机)
|
* @param printerName 打印机名称(可为null,null时使用默认打印机)
|
||||||
@ -100,6 +101,7 @@ public class JasperReportUtil {
|
|||||||
private static JasperReport loadTemplate(String templateName) throws Exception {
|
private static JasperReport loadTemplate(String templateName) throws Exception {
|
||||||
// 模板路径:resources/templates/
|
// 模板路径:resources/templates/
|
||||||
String templatePath = templatep + templateName;
|
String templatePath = templatep + templateName;
|
||||||
|
compileAndSave(templateName);
|
||||||
InputStream jasperStream = JasperReportUtil.class.getClassLoader().getResourceAsStream(templatePath + ".jasper");
|
InputStream jasperStream = JasperReportUtil.class.getClassLoader().getResourceAsStream(templatePath + ".jasper");
|
||||||
|
|
||||||
if (jasperStream != null) {
|
if (jasperStream != null) {
|
||||||
@ -107,7 +109,6 @@ public class JasperReportUtil {
|
|||||||
return (JasperReport) JRLoader.loadObject(jasperStream);
|
return (JasperReport) JRLoader.loadObject(jasperStream);
|
||||||
} else {
|
} else {
|
||||||
// 不存在jasper,编译jrxml
|
// 不存在jasper,编译jrxml
|
||||||
compileAndSave(templateName);
|
|
||||||
InputStream jrxmlStream = JasperReportUtil.class.getClassLoader().getResourceAsStream(templatePath + ".jrxml");
|
InputStream jrxmlStream = JasperReportUtil.class.getClassLoader().getResourceAsStream(templatePath + ".jrxml");
|
||||||
if (jrxmlStream == null) {
|
if (jrxmlStream == null) {
|
||||||
throw new JRException("模板不存在:" + templatePath + ".jrxml/.jasper");
|
throw new JRException("模板不存在:" + templatePath + ".jrxml/.jasper");
|
||||||
@ -289,29 +290,28 @@ public class JasperReportUtil {
|
|||||||
String jrxmlName = jrxmlFileName + ".jrxml"; // jrxml文件名
|
String jrxmlName = jrxmlFileName + ".jrxml"; // jrxml文件名
|
||||||
String jasperName = jrxmlFileName + ".jasper"; // 编译后文件名
|
String jasperName = jrxmlFileName + ".jasper"; // 编译后文件名
|
||||||
|
|
||||||
// 2. 获取resources/templates下的jrxml输入流
|
if(needCompile(TEMPLATE_PATH+jrxmlName, TEMPLATE_PATH+jasperName)) {
|
||||||
InputStream jrxmlStream = JasperReportUtil.class
|
// 2. 获取resources/templates下的jrxml输入流
|
||||||
.getClassLoader()
|
InputStream jrxmlStream = JasperReportUtil.class
|
||||||
.getResourceAsStream(templatep + jrxmlName);
|
.getClassLoader()
|
||||||
|
.getResourceAsStream(templatep + jrxmlName);
|
||||||
|
if (jrxmlStream == null) {
|
||||||
|
throw new Exception("未找到jrxml模板:" + templatep + jrxmlName);
|
||||||
|
}
|
||||||
|
// 3. 编译jrxml为JasperReport对象
|
||||||
|
JasperReport jasperReport = JasperCompileManager.compileReport(jrxmlStream);
|
||||||
|
|
||||||
if (jrxmlStream == null) {
|
// 4. 确定输出目录(resources/templates的同级目录,即classes/templates)
|
||||||
throw new Exception("未找到jrxml模板:"+templatep + jrxmlName);
|
File outputDir = getTemplateOutputDir();
|
||||||
|
if (!outputDir.exists()) {
|
||||||
|
outputDir.mkdirs(); // 目录不存在则创建
|
||||||
|
}
|
||||||
|
// 5. 输出jasper文件到目标目录
|
||||||
|
File jasperFile = new File(outputDir, jasperName);
|
||||||
|
JRSaver.saveObject(jasperReport, jasperFile); // 保存编译结果
|
||||||
|
|
||||||
|
System.out.println("编译成功:" + jasperFile.getAbsolutePath());
|
||||||
}
|
}
|
||||||
|
|
||||||
// 3. 编译jrxml为JasperReport对象
|
|
||||||
JasperReport jasperReport = JasperCompileManager.compileReport(jrxmlStream);
|
|
||||||
|
|
||||||
// 4. 确定输出目录(resources/templates的同级目录,即classes/templates)
|
|
||||||
File outputDir = getTemplateOutputDir();
|
|
||||||
if (!outputDir.exists()) {
|
|
||||||
outputDir.mkdirs(); // 目录不存在则创建
|
|
||||||
}
|
|
||||||
|
|
||||||
// 5. 输出jasper文件到目标目录
|
|
||||||
File jasperFile = new File(outputDir, jasperName);
|
|
||||||
JRSaver.saveObject(jasperReport, jasperFile); // 保存编译结果
|
|
||||||
|
|
||||||
System.out.println("编译成功:" + jasperFile.getAbsolutePath());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -330,5 +330,57 @@ public class JasperReportUtil {
|
|||||||
// 返回templates目录的File对象
|
// 返回templates目录的File对象
|
||||||
return new File(templateUrl.toURI());
|
return new File(templateUrl.toURI());
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* 检查是否需要编译jrxml(jrxml修改时间晚于jasper时需要编译)
|
||||||
|
* @param jrxmlPath jrxml文件路径(如"src/main/resources/templates/barcode.jrxml")
|
||||||
|
* @param jasperPath jasper文件路径(如"src/main/resources/templates/barcode.jasper")
|
||||||
|
* @return true:需要编译;false:无需编译
|
||||||
|
*/
|
||||||
|
public static boolean needCompile(String jrxmlPath, String jasperPath) {
|
||||||
|
// 1. 判断jasper文件是否存在:不存在则需要编译
|
||||||
|
File jasperFile = new File(jasperPath);
|
||||||
|
if (!jasperFile.exists()) {
|
||||||
|
log.info("jasper文件不存在,需要编译{}",jasperPath);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. 判断jrxml文件是否存在
|
||||||
|
File jrxmlFile = new File(jrxmlPath);
|
||||||
|
if (!jrxmlFile.exists()) {
|
||||||
|
throw new IllegalArgumentException("jrxml文件不存在:" + jrxmlPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3. 比较修改时间:jrxml比jasper新 → 需要编译
|
||||||
|
long jrxmlTime = jrxmlFile.lastModified();
|
||||||
|
long jasperTime = jasperFile.lastModified();
|
||||||
|
boolean needCompile = jrxmlTime > jasperTime;
|
||||||
|
|
||||||
|
if (needCompile) {
|
||||||
|
log.info("jrxml已修改(" + jrxmlTime + "),晚于jasper(" + jasperTime + "),需要编译");
|
||||||
|
} else {
|
||||||
|
// log.info("jasper文件最新,无需编译");
|
||||||
|
}
|
||||||
|
return needCompile;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 获取 resources/templates/ 目录的绝对路径
|
||||||
|
* @return 目录路径(如 "D:/project/target/classes/templates/")
|
||||||
|
*/
|
||||||
|
public static String getTemplatePath() {
|
||||||
|
try {
|
||||||
|
// 通过类加载器获取 templates 目录的URL
|
||||||
|
URL templateUrl = JasperReportUtil.class.getClassLoader().getResource(template);
|
||||||
|
|
||||||
|
// 如果URL为空,说明目录不存在,但仍返回理论路径
|
||||||
|
if (templateUrl == null) {
|
||||||
|
URL resourcesUrl = JasperReportUtil.class.getClassLoader().getResource("");
|
||||||
|
return resourcesUrl.toURI().getPath() + templatep;
|
||||||
|
}
|
||||||
|
// 返回实际路径
|
||||||
|
return templateUrl.toURI().getPath()+"/";
|
||||||
|
|
||||||
|
} catch (URISyntaxException e) {
|
||||||
|
throw new RuntimeException("获取路径失败", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user