背景
主要针对不同传感器的监测数据,从数据库实时获取,根据业务相关公式进行实时求解并绘制曲线图;
技术栈
开发语言:java+mdb
视图层:javafx,该语言包再jdk1.8以后已经独立出来,有需求的可自行查阅,jdk11以上javafx的使用方式。
框架:折线图框架用到的是开源框架jfreechart-1.5.0,模板所用框架freemarker-2.3.4
数据源:mdb格式,mysql数据源。
JFreeChart是JAVA平台上的一个开放的图表绘制类库。它完全使用JAVA语言编写,是为applications, applets, servlets 以及JSP等使用所设计。JFreeChart可生成饼图(pie charts)、柱状图(bar charts)、散点图(scatter plots)、时序图(time series)、甘特图(Gantt charts)等等多种图表,并且可以产生PNG和JPEG格式的输出,还可以与PDF和EXCEL关联。
程序部分界面![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/019319e885ba7ea94e26816301c487ff.png)
导出报告
导出报告用到了freemarker,该模板框架上手容易,比较适合报告格式固定的需求,例如本系统所需报告格式固定,只需要将word报告模板定义好,另存为xml格式,修改文件后缀为ftl即可。
package baogao;
import com.aspose.words.Document;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import freemarker.template.TemplateExceptionHandler;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.Node;
import javafx.scene.SnapshotParameters;
import javafx.scene.image.WritableImage;
import javax.imageio.ImageIO;
import java.awt.image.RenderedImage;
import java.io.*;
import java.util.Locale;
/**
* @Auther
* @Data 2021/8/2 22:19
* @TC
*/
public class WriteBaoGao {
/**
* 根据String模板生成HTML,模板中存在List循环
*/
public static ByteArrayInputStream createHtmlFromStringList(WordBean wordbean) {
FileWriter out = null;
StringWriter writer = new StringWriter();
ByteArrayInputStream in = null;
try {
Configuration config=new Configuration();
config.setDefaultEncoding("UTF-8");
//模板文件
String pat=System.getProperty("user.dir")+"\\reource\\";
// File file = new File(pat+"demo.ftl");
config.setDirectoryForTemplateLoading(new File(pat));
config.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER);
//获取模板
Template template = config.getTemplate("demo.ftl");
//构造输出路 最好带时间,防止生成报告打开后再次生成时,文件占用导致生成失败
// SimpleDateFormat s=new SimpleDateFormat("yyyy-MM-dd,HH-mm-ss");
// String format = s.format(new Date());
// out = new FileWriter(path+"\\"+format+".doc");
// out = new FileWriter(path);
//生成HTML
template.process(wordbean, writer);
writer.flush();
in = new ByteArrayInputStream(writer.toString().getBytes());
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (TemplateException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
if(null != out) {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return in;
}
public static String getImageStr(String imgFile) {
InputStream in = null;
byte[] data = null;
try {
in = new FileInputStream(imgFile);
} catch (FileNotFoundException e) {
// log.error("加载图片未找到", e);
e.printStackTrace();
}
try {
data = new byte[in.available()];
//注:FileInputStream.available()方法可以从输入流中阻断由下一个方法调用这个输入流中读取的剩余字节数
in.read(data);
in.close();
} catch (IOException e) {
// log.error("IO操作图片错误", e);
e.printStackTrace();
}
BASE64Encoder encoder = new BASE64Encoder();
return encoder.encode(data);
}
public static void main(String[] args) {
// createHtmlFromStringList(null);
}
public static void CramerCanvesImg(Node node, String path, SnapshotParameters snapshotParameters){
WritableImage image=node.snapshot(snapshotParameters,null);
RenderedImage bufferedImage = SwingFXUtils.fromFXImage(image, null);
try {
ImageIO.write(bufferedImage,"png",new File(path));
} catch (IOException e) {
e.printStackTrace();
}
}
}