POI操作Excel(xls、xlsx)
阿帕奇官网:http://poi.apache.org/
POI3.17下载:http://poi.apache.org/download.html#POI-3.17
POI操作Excel教程(易百教程):https://www.yiibai.com/apache_poi/
1.数据库连接:https://www.cnblogs.com/feipengting/p/7606042.html
package com.gdin.util; import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties; public class DBUtil { private static Connection con;
private static String url;
private static String user;
private static String pwd; public DBUtil() { }
static {
try {
Class.forName("oracle.jdbc.driver.OracleDriver");/*如果是MySQL就改为Class.forName("com.mysql.jdbc.Driver");*/
InputStream is = DBUtil.class.getResourceAsStream("/db.properties");//db.properties 是一个用户配置文件传用户名密码
Properties prop=new Properties();
prop.load(is);
url=prop.getProperty("url");
user=prop.getProperty("user");
pwd=prop.getProperty("password");
con = DriverManager.getConnection(url, user, pwd);
}catch (Exception e){
System.out.println("数据库连接失败!");
}
}
public static ResultSet find(String sql){
con=getCon();
try {
Statement smt=con.createStatement();
ResultSet rs=smt.executeQuery(sql);
return rs;
} catch (SQLException e) {
e.printStackTrace();
return null;
}
}
public static ResultSet find(String sql,Object ...pram){//...pram数组
con=getCon();
try {
PreparedStatement smt=con.prepareStatement(sql);
for (int i=0;i<pram.length;i++){
smt.setObject(i+1,pram[i]);
}
ResultSet rs=smt.executeQuery();
return rs;
} catch (SQLException e) {
e.printStackTrace();
return null;
}
}
public static void insert(String sql,Object ...pram){//...pram数组
con=getCon();
try {
PreparedStatement smt=con.prepareStatement(sql);
for (int i=0;i<pram.length;i++){
smt.setObject(i+1,pram[i]);
}
smt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
public static Connection getCon(){
try {
if(con==null||con.isClosed())
con = DriverManager.getConnection(url, user, pwd);
} catch (SQLException e) {
e.printStackTrace();
}
return con;
}
}
重要的类以及接口:Workbook、Sheet、Row、Cell(对应HSSF和XSSF具体的类)
2.读取本地两种格式的Excel文件:
public static void main(String[] args) throws Exception, IOException {
File file=new File("C:\\Users\\Administrator\\Desktop\\rjl.xlsx");
// File file=new File("C:\\Users\\Administrator\\Desktop\\123.xls"); Workbook workBook=null;
System.out.println(file.getName());
if(file.getName().endsWith("xlsx")){
workBook = new XSSFWorkbook(file);
}else if(file.getName().endsWith("xls")){
workBook=new HSSFWorkbook(new FileInputStream(file));
} Sheet sheet = workBook.getSheetAt(0);
int lastRowNum = sheet.getLastRowNum();
System.out.println(lastRowNum);
for(int i=0;i<=lastRowNum;i++){
Row row = sheet.getRow(i);
short lastCellNum = row.getLastCellNum();
for(int j=0;j<lastCellNum;j++){
if(row.getCell(j).getCellTypeEnum().equals(CellType.NUMERIC)){
System.out.print(row.getCell(j).getNumericCellValue()+"###");
}else if(row.getCell(j).getCellTypeEnum().equals(CellType.STRING)){
System.out.print(row.getCell(j).getStringCellValue()+"###");
}
}
System.out.println();
} }
3.poi操作Excel
poi执行Excel中的公式:https://blog.csdn.net/l362696422/article/details/41700057
public static void ExportExcel(){
Workbook wb=new XSSFWorkbook();
try {
FileOutputStream fos = new FileOutputStream(new File("C:\\Users\\Administrator\\Desktop\\信息.xlsx"));
//单元格样式
CellStyle cellStyle = wb.createCellStyle();
//字体
Font font = wb.createFont();
font.setItalic(true);
cellStyle.setBorderBottom(BorderStyle.DASHED);
cellStyle.setFont(font);
//设置旋转角度
cellStyle.setRotation((short) 270);
Sheet sheet = wb.createSheet("info");
Row row = sheet.createRow(0);
//设置该行的行高
row.setHeight((short) 800);
Cell cell = row.createCell(0);
cell.setCellValue("myvalue");
cell.setCellStyle(cellStyle);
//同上
CellStyle cellStyle2 = wb.createCellStyle();
Row row2 = sheet.createRow(1);
row2.setHeight((short) 1000);
Cell cell2 = row2.createCell(1);
cellStyle2.setRotation((short) 180);
cell2.setCellValue(true);
cell2.setCellStyle(cellStyle2);
//row行和cell列都是从0开始的
Cell cell3 = row2.createCell(7);
Cell cell4 = row2.createCell(8);
Cell cell5 = row2.createCell(9);
Cell cell6 = row2.createCell(10);
cell3.setCellValue(11);
cell4.setCellValue(22);
cell5.setCellValue(33);
//设置单元格的类型为:公式类型FORMULA
cell6.setCellType(CellType.FORMULA);
cell6.setCellFormula("SUM(H2:J2)");
//求出工作部所有的已设置使用公式的值
wb.getCreationHelper().createFormulaEvaluator().evaluateAll();
//在确定xls或xlsx对象类型时也可这样使用求公式值
//XSSFFormulaEvaluator.evaluateAllFormulaCells(wb);
//超链接
CellStyle style = wb.createCellStyle();
Font font2 = wb.createFont();
//设置字体格式为单下划线
font2.setUnderline(Font.U_SINGLE);
//font2.setColor(Font.COLOR_RED);
font2.setColor(HSSFColor.HSSFColorPredefined.BLUE.getIndex());
style.setFont(font2);
Cell cell12 = row2.createCell(12);
cell12.setCellValue("跳转网站");
cell12.setCellStyle(style);
CreationHelper creationHelper = wb.getCreationHelper();
Hyperlink hyperlink = creationHelper.createHyperlink(HyperlinkType.URL);
hyperlink.setAddress("http://www.baidu.com");
//单元格设置超链接
cell12.setHyperlink(hyperlink);
//////////设置打印区域/////////
wb.setPrintArea(0, 0, 8, 0, 5);
sheet.getPrintSetup().setPaperSize(PrintSetup.A4_PAPERSIZE);
sheet.setDisplayGridlines(true);
sheet.setPrintGridlines(true); wb.write(fos);
fos.close();
wb.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }
4.poi导入Excel文件的兼容性以及数字自动加小数点的问题解决方案
http://www.cnblogs.com/qiujiababy/p/9371786.html
https://www.jianshu.com/p/a7eca64237bd
/**
* 处理导入小数点
*/
public static String numOfImport(Cell cell) {
String value = cell.toString();
int i = cell.getCellType();
if (i == 1) {//字符串类型
return value;
} else {
String[] str = value.split("\\.");
if (str.length > 1) {
String str1 = str[1];
int m = Integer.parseInt(str1);
if (m == 0) {
return str[0];
} else {
return value;
}
}else{
return value;
}
}
}
<form name="form1" action="handle.jsp" method="post" enctype="multipart/form-data">
<input type="file" name="excel">
<input type="submit" value="上传"> </form>
public static String ImportExcel(InputStream is){
Workbook workBook=null;
/*try {
System.out.println("create1");
workBook = new XSSFWorkbook(is); } catch (Exception e) {
System.out.println("create2");
try{
System.out.println("create22222");
workBook=new HSSFWorkbook(is);
System.out.println("nonono");
}catch(Exception e2){
System.out.println("无法处理!");
} }*/ try {
workBook=WorkbookFactory.create(is);
} catch (EncryptedDocumentException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (InvalidFormatException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} Sheet sheet = workBook.getSheetAt(0);
int lastRowNum = sheet.getLastRowNum();
System.out.println(lastRowNum);
for(int i=0;i<=lastRowNum;i++){
Row row = sheet.getRow(i);
short lastCellNum = row.getLastCellNum();
for(int j=0;j<lastCellNum;j++){
if(row.getCell(j).getCellTypeEnum().equals(CellType.NUMERIC)){
//System.out.print(row.getCell(j).getNumericCellValue()+"###");
System.out.print(numOfImport(row.getCell(j))+"###");
}else if(row.getCell(j).getCellTypeEnum().equals(CellType.STRING)){
System.out.print(row.getCell(j).getStringCellValue()+"###");
}
}
System.out.println();
}
System.out.println("nono33333333333");
try {
workBook.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("nono44444444444444");
return "ok";
}
使用apach的fileupload.jar包上传Excel,主要处理流(直接request.getInputStream()的流是没经过处理的,所以采用该jar包处理流问题)
<%
if(request.getMethod().equalsIgnoreCase("post")){ try {
FileItemFactory factory = new DiskFileItemFactory();
// 文件上传核心工具类
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setFileSizeMax(10 * 1024 * 1024); // 单个文件大小限制
upload.setSizeMax(50 * 1024 * 1024); // 总文件大小限制
upload.setHeaderEncoding("UTF-8"); // 对中文文件编码处理 if (ServletFileUpload.isMultipartContent(request)) {
List<FileItem> list = upload.parseRequest(request);
// 遍历
for (FileItem item : list) {
if (!item.isFormField()) {
TestExcel.ImportExcel(item.getInputStream());
}
}
}
out.print("成功");
} catch (Exception e) {
out.print("失败");
} } %>
5.导出(下载)Excel(jsp需要使用 response.reset() 来清除首部的空白行)
https://www.cnblogs.com/zml-java/p/6146421.html
https://blog.csdn.net/xingkong22star/article/details/39207015
<button><a href="exportExcel.jsp">下载</a></button>
<body>
<%
TestExcel.xiazai(response);
%>
</body>
public static void xiazai(HttpServletResponse response) throws IOException{
Workbook wb = new XSSFWorkbook();
Sheet sheet = wb.createSheet();
Row row = sheet.createRow(0);
Cell cell = row.createCell(0);
cell.setCellValue("well down 我的测试结果"); ServletOutputStream outputStream = response.getOutputStream();
response.reset();
response.setHeader("Content-disposition", "attachment; filename="+URLEncoder.encode("容杰龙测试", "UTF-8")+".xlsx");
response.setContentType("application/msexcel");
wb.write(outputStream); outputStream.flush();
outputStream.close();
wb.close(); }
6.XSSFWorkbook、HSSFWorkbook导出EXCEL数据和图片
https://blog.csdn.net/sun_cherish/article/details/79712975
https://blog.csdn.net/chenssy/article/details/20524563
https://blog.csdn.net/joyous/article/details/8780112
https://blog.csdn.net/joyous/article/details/9664739
public static void ExportPic() throws IOException{
XSSFWorkbook wb = new XSSFWorkbook();
String sheetName = "excel导出图片测试";
XSSFSheet RZ_TXSheet = wb.createSheet(sheetName); ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
//图片绝对路径
BufferedImage user_headImg = ImageIO.read(new File("C:\\Users\\Administrator\\Desktop\\boy.jpg"));
ImageIO.write(user_headImg, "jpg", byteArrayOut);
//sheet只能获取一个
XSSFDrawing patriarch = RZ_TXSheet.createDrawingPatriarch();
//设置图片的属性
XSSFClientAnchor anchor = new XSSFClientAnchor(0, 0, 255, 255,(short) 0, 0, (short) 5, 8);
anchor.setAnchorType(ClientAnchor.AnchorType.MOVE_DONT_RESIZE);
//插入图片
patriarch.createPicture(anchor,wb.addPicture(byteArrayOut.toByteArray(), XSSFWorkbook.PICTURE_TYPE_JPEG)); FileOutputStream fileOut = new FileOutputStream("C:\\Users\\Administrator\\Desktop\\测试Excel.xlsx");
// 写入excel文件
wb.write(fileOut);
wb.close();
}
public static void ExportTest() throws FileNotFoundException, IOException{
XSSFWorkbook workbook = new XSSFWorkbook();
XSSFSheet xssfSheet = workbook.createSheet("abc");
XSSFDrawing patriarch = xssfSheet.createDrawingPatriarch();
XSSFClientAnchor anchor=new XSSFClientAnchor(0, 0, 255, 255, 2, 2, 8, 8);
byte[] by=IOUtils.toByteArray(new FileInputStream(new File("C:\\Users\\Administrator\\Desktop\\boy.jpg")));
int pictureIndex = workbook.addPicture(by, Workbook.PICTURE_TYPE_JPEG);
patriarch.createPicture(anchor, pictureIndex); FileOutputStream fileOutputStream = new FileOutputStream(new File("C:\\Users\\Administrator\\Desktop\\tupian.xlsx"));
workbook.write(fileOutputStream);
fileOutputStream.close();
workbook.close();
}
多张图片示例:
public static void ExportPic() throws IOException{
XSSFWorkbook wb = new XSSFWorkbook();
String sheetName = "excel导出图片测试";
XSSFSheet RZ_TXSheet = wb.createSheet(sheetName); ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
//图片绝对路径
BufferedImage user_headImg = ImageIO.read(new File("C:\\Users\\Administrator\\Desktop\\boy.jpg"));
ImageIO.write(user_headImg, "jpg", byteArrayOut);
//sheet只能获取一个
XSSFDrawing patriarch = RZ_TXSheet.createDrawingPatriarch();
//设置图片的属性
XSSFClientAnchor anchor = new XSSFClientAnchor(0, 0, 255, 255,(short) 0, 0, (short) 5, 8);
anchor.setAnchorType(ClientAnchor.AnchorType.MOVE_DONT_RESIZE);
//插入图片
patriarch.createPicture(anchor,wb.addPicture(byteArrayOut.toByteArray(), XSSFWorkbook.PICTURE_TYPE_JPEG));
//插入第二张图片
int pictureIndex = wb.addPicture(byteArrayOut.toByteArray(), Workbook.PICTURE_TYPE_JPEG);
XSSFClientAnchor anchor2 = patriarch.createAnchor(0, 0, 255, 255, 1, 10, 10, 15);
patriarch.createPicture(anchor2, pictureIndex); FileOutputStream fileOut = new FileOutputStream("C:\\Users\\Administrator\\Desktop\\测试Excel.xlsx");
// 写入excel文件
wb.write(fileOut);
wb.close();
}
7.poi获取excel中的图片
https://blog.csdn.net/delongcpp/article/details/8833995
https://www.cnblogs.com/colaclicken/p/8058719.html
public static void ReadPictureFromExcel() throws Exception{
FileInputStream fileInputStream = new FileInputStream("C:\\Users\\Administrator\\Desktop\\tupian.xlsx");
Workbook workbook = WorkbookFactory.create(fileInputStream);
List<? extends PictureData> pictures = workbook.getAllPictures();
int i=1;
for (PictureData pictureData : pictures) {
byte[] bs = pictureData.getData();
FileOutputStream fileOutputStream = new FileOutputStream("C:\\Users\\Administrator\\Desktop\\"+i+".jpg");
fileOutputStream.write(bs);
fileOutputStream.close();
i++;
}
}
8.poi读取一个excel中的图片到另一个excel中
public static void main(String[] args) throws Exception, IOException { WritePicToExcel(ReadPictureFromExcel2());
} public static Map<String, XSSFPictureData> ReadPictureFromExcel2() throws Exception {
Map<String, XSSFPictureData> map = new HashMap<String, XSSFPictureData>();
FileInputStream fileInputStream = new FileInputStream("C:\\Users\\Administrator\\Desktop\\tupian.xlsx");
XSSFWorkbook workbook = (XSSFWorkbook) new XSSFWorkbook(fileInputStream);
// List<? extends PictureData> pictures = workbook.getAllPictures();
XSSFSheet sheet = workbook.getSheetAt(0);
List<POIXMLDocumentPart> list = sheet.getRelations();
System.out.println(list.size());
for (POIXMLDocumentPart poixmlDocumentPart : list) {
System.out.println(poixmlDocumentPart instanceof XSSFDrawing);
if (poixmlDocumentPart instanceof XSSFDrawing) {
XSSFDrawing drawing = (XSSFDrawing) poixmlDocumentPart;
List<XSSFShape> shapes = drawing.getShapes();
System.out.println("图的数量:"+shapes.size());
for (XSSFShape shape : shapes) {
XSSFPicture picture = (XSSFPicture) shape;
XSSFClientAnchor anchor = picture.getPreferredSize();
//CTMarker marker = anchor.getFrom();
//String key = marker.getRow() + "-" + marker.getCol();
String key =anchor.getDx1()+"-"+anchor.getDy1()+"-"+anchor.getDx2()+"-"+anchor.getDy2()+"-"+anchor.getCol1()+"-"+anchor.getRow1()+"-"+anchor.getCol2()+"-"+anchor.getRow2();
System.out.println(key);
//System.out.println(anchor.getDx1()+"-"+anchor.getDy1()+"-"+anchor.getDx2()+"-"+anchor.getDy2()+"-"+anchor.getCol1()+"-"+anchor.getRow1()+"-"+anchor.getCol2()+"-"+anchor.getRow2());
map.put(key, picture.getPictureData());
}
}
}
workbook.close();
return map;
} public static void WritePicToExcel(Map<String, XSSFPictureData> map) throws Exception{
FileOutputStream fileOutputStream = new FileOutputStream("C:\\Users\\Administrator\\Desktop\\图片print.xlsx");
XSSFWorkbook xssfWorkbook = new XSSFWorkbook();
XSSFSheet xssfSheet = xssfWorkbook.createSheet("print");
Set<Entry<String, XSSFPictureData>> entrySet = map.entrySet();
//注意!!!
XSSFDrawing patriarch = xssfSheet.createDrawingPatriarch();
for (Entry<String, XSSFPictureData> entry : entrySet) {
String key = entry.getKey();
System.out.println(key);
String[] strings = key.split("-");
//int row = Integer.parseInt(strings[0]);
//int column = Integer.parseInt(strings[1]);
//System.out.println("row:"+row+" column:"+column);
int dx1=Integer.parseInt(strings[0]);
int dy1=Integer.parseInt(strings[1]);
int dx2=Integer.parseInt(strings[2]);
int dy2=Integer.parseInt(strings[3]);
int col1=Integer.parseInt(strings[4]);
int row1=Integer.parseInt(strings[5]);
int col2=Integer.parseInt(strings[6]);
int row2=Integer.parseInt(strings[7]); XSSFPictureData xssfPictureData = entry.getValue();
//XSSFRow xssfRow = xssfSheet.createRow(row); //XSSFClientAnchor anchor=new XSSFClientAnchor();
XSSFClientAnchor anchor = new XSSFClientAnchor(dx1, dy1, dx2, dy2, col1, row1, col2, row2);
anchor.setAnchorType(ClientAnchor.AnchorType.MOVE_DONT_RESIZE);
//anchor.setRow1(row);
//anchor.setCol1(column);
int pictureIndex=xssfWorkbook.addPicture(xssfPictureData.getData(), Workbook.PICTURE_TYPE_JPEG);
patriarch.createPicture(anchor, pictureIndex);
//FileOutputStream outputStream = new FileOutputStream("C:\\Users\\Administrator\\Desktop\\图片print"+row+".jpg");
//outputStream.write(xssfPictureData.getData());
//outputStream.close();
}
xssfWorkbook.write(fileOutputStream);
fileOutputStream.close();
xssfWorkbook.close();
}
POI操作Excel(xls、xlsx)的更多相关文章
- POI操作Excel
POI和Excel简介 JAVA中操作Excel的有两种比较主流的工具包: JXL 和 POI .jxl 只能操作Excel 95, 97, 2000也即以.xls为后缀的excel.而poi可以操作 ...
- poi操作excel的基本用法
这周公司要用excel作为数据存储格式做一个文具申请的功能,感觉以前本来很简单的功能变复杂了不少,但是还是记录一下一些excel的基本用法. 写在最前面:这里只介绍一些excel的基本存储方式(读,写 ...
- 自己封装的poi操作Excel工具类
自己封装的poi操作Excel工具类 在上一篇文章<使用poi读写Excel>中分享了一下poi操作Excel的简单示例,这次要分享一下我封装的一个Excel操作的工具类. 该工具类主要完 ...
- 自己的包poi操作Excel工具
在前面的文章<使用poi读写Excel>中分享了一下poi操作Excel的简单演示样例.这次要分享一下我封装的一个Excel操作的工具类. 该工具类主要完毕的功能是:读取Excel.汇总E ...
- java使用POI操作excel文件,实现批量导出,和导入
一.POI的定义 JAVA中操作Excel的有两种比较主流的工具包: JXL 和 POI .jxl 只能操作Excel 95, 97, 2000也即以.xls为后缀的excel.而poi可以操作Exc ...
- java里poi操作excel的工具类(兼容各版本)
转: java里poi操作excel的工具类(兼容各版本) 下面是文件内具体内容,文件下载: import java.io.FileNotFoundException; import java.io. ...
- 利用Apache POI操作Excel
最近在做接口,有个功能是利用Excel导入汽车发动机所需零件信息到线上系统中.简单回顾一下之前学过的用java操作Excel. 1.maven配置Apache POI pom.xml中配置POIjar ...
- Java POI操作Excel注意点
excel的行索引和列索引都是从0开始,而行号和列号都是从1开始 POI·操作excel基本上都是使用索引 XSSFRow对象的 row.getLastCellNum() 方法返回的是当前行最后有效列 ...
- 使用POI操作Excel时对事先写入模板的公式强制执行
场景:POI读取Excel模板. 当使用POI操作Excel时,发现由POI生成的公式能够在打开Excel是被执行, 而事先手工写入Excel模板文件的公式则不自动被调用,必须手动双击该Cell才能生 ...
随机推荐
- Unicode,GBK,GB2312,UTF-8概念基础(转载)
第一篇:JAVA字符编码系列一:Unicode,GBK,GB2312,UTF-8概念基础本部分采用重用,转载一篇文章来完成这部分的目标.来源:holen'blog 对字符编码与Unicode,IS ...
- pycham database查看db.sqlites文件 无内容解决方法
初学django,使用pycharm IDE的时候,通过使用默认的sqlites数据库,执行问makemigration 和migrate操作之后,控制台正常输出类似如下结果,按照道理应该生成了数据表 ...
- 基于VC++ Win32+CUDA+OpenGL组合与VC++ MFC SDI+CUDA+OpenGL组合两种方案的遥感影像显示:获得的重要结论!
1.基于VC++ Win32+CUDA+OpenGL组合的遥感影像显示 在该组合方案下,初始化时将OpenGL设置为下面两种方式,效果一样 //设置方式1 glutInitDisplayMode (G ...
- Javascript异步编程之setTimeout与setInterval详解分析(一)
Javascript异步编程之setTimeout与setInterval 在谈到异步编程时,本人最主要会从以下三个方面来总结异步编程(注意:特别解释:是总结,本人也是菜鸟,所以总结不好的,请各位大牛 ...
- Python2.7-内置异常类型
python内置了许多异常类型,他们的继承关系如下:-----------------------------------------------BaseException +-- SystemExi ...
- Python2.7-math, cmath
math,cmath 模块,提供了用C标准定义的数学函数,简单说就是效率较高,cmath 不仅有 math 的功能,还增加了计算复数的函数.这两个模块返回的值基本上为 float 类型,除非明确指出返 ...
- 复习zabbix配置agent过程
1. 创建主机configuration(配置)-->Hosts(主机)-->Create host(创建主机) 不使用proxy --- enabled 2.链接监控模板Templa ...
- 第3章 如何用DAP仿真器下载程序
第3章 如何用DAP仿真器下载程序 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/f ...
- 服务发现比较:Consul vs Zookeeper vs Etcd vs Eureka
原文:https://blog.csdn.net/dengyisheng/article/details/71215234 服务发现比较:Consul vs Zookeeper vs Etcd vs ...
- DynamicDataDisplay 实时曲线图的使用和沿轴移动的效果
原文:DynamicDataDisplay 实时曲线图的使用和沿轴移动的效果 由于项目需要,最近在找关于绘制实时曲线图的文章,但看了很多自己实现的话太慢,所以使用了第三方控件来实现(由 ...