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才能生 ...
随机推荐
- 🈲Eclipse通过jdbc连接数据库制作简单登陆界面【新手必看】
一.前言: 做网站开发,要求有多种搭配方式,前台技术可以使用PHP.ASP.JSP.ASP.NET.CGI等任何一种: 需要用到的基础语言用的最多的就是HTML/CSS.JS.JAVA.XML这些了, ...
- ps工具快捷键
1.覆盖图片原先文件--- 自由转换 快捷键 ctrl+t 1)首先选择一个背景色 点击或者ctrl+t 处于自由切换状态 可以进行上下拉伸 回车即可. 这样就覆盖了文件,且背景色和我们之前的一样. ...
- JAVA框架 Spring 依赖注入
一:介绍 情景:我们在给程序分层的时候:web层.业务层.持久层,各个层之间会有依赖.比如说:业务层和持久层,业务层的代码在调用持久层的时候,传统方式:new 持久层类. 进而进行调用,这种方式会导致 ...
- Vue表单输入绑定(文本框和复选框)
文本框 <!DOCTYPE html><html> <head> <meta charset="utf-8"> ...
- STM32 中 BIT_BAND(位段/位带)和别名区使用入门(转载)
一. 什么是位段和别名区 是这样的,记得MCS51吗? MCS51就是有位操作,以一位(BIT)为数据对象的操作,MCS51可以简单的将P1口的第2位独立操作: P1.2=0;P1.2=1 :这样就把 ...
- 采用PowerDesigner 设计数据库
PowerDesigner设计数据库的教程网上都有,最好的是我一位同学写的,地址: 点击这里 我的大致流程如下: 首先要以管理员的身份打开PowerDesigner,如果没这么做,将导致后面无法创建S ...
- SonarQube配置LDAP认证集成
1.准备工作 获取LDAP服务信息.admin账号.安装sonarldap插件. 2.LDAP配置 #LDAP settings #admin sonar.security.realm=LDAP ld ...
- 20155232《网络对抗》Exp3 免杀原理与实践
20155232<网络对抗>Exp3 免杀原理与实践 问题回答 1.基础问题回答 (1)杀软是如何检测出恶意代码的? 基于特征码的检测 特征码:一段特征码就是一段或多段数据. 如果一个可执 ...
- 20155305《网络对抗》Web基础
20155305<网络对抗>Web基础 实验过程 Web前端:HTML 使用netstat -aptn查看80端口是否被占用(上次实验设置为Apache使用80端口),如果被占用了就kil ...
- VS编程,WPF中两个滚动条 ScrollViewer 同步滚动的一种方法
原文:VS编程,WPF中两个滚动条 ScrollViewer 同步滚动的一种方法 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307934/ar ...