Apache POI入门学习

Apache POI入门学习

    • 官网地址
  • excel中使用到的类
  • 读取excel表格内容
    • 表格内容
    • maven依赖
    • 方式一
      • 测试结果
    • 方式二
      • 测试结果
  • 向excel中写入数据
    • 方式一
    • 方式二
    • 方式三
    • 测试结果
  • 从 Excel 工作表中的公式单元格读取数据
    • 测试结果
  • Excel 工作表中写入公式单元格
  • 从受密码保护的Excel中读取数据
    • 方式一
      • 测试结果
    • 方式二
      • 测试结果
  • 填充背景色和前景色到单元格中
    • 测试结果
  • 将HashMap格式写入表格
    • 测试结果
  • 从excel中读取数据到HashMap中
    • 测试结果
  • 从数据库中读取数据并写入Excel
    • 测试结果
  • 从Excel中读取数据并写入数据库表
    • excel内容
    • 生成的数据表
  • Selenium中的数据驱动测试
    • maven依赖
    • 获取提交按钮的Xpath
    • 工具类
    • 案例代码
  • 在Selenium中将WebTable数据写入Excel表(网页数据抽取)
    • 测试结果
  • 在Excel中单元格内容为日期格式
    • 测试结果
  • 代码地址

官网地址

https://poi.apache.org/index.html
Apache POI提供API给Java程序对Microsoft Office格式档案读和写的功能。POI为“Poor Obfuscation Implementation”的首字母缩写,意为“简洁版的模糊实现”。

excel中使用到的类

一个excel表格文件包含一个工作簿,一个工作簿包含多个工作表,每个工作表包含多个行,每行包含多个单元格。
在这里插入图片描述

读取excel表格内容

表格内容

在这里插入图片描述

maven依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.2.4</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>org.example</groupId><artifactId>ApachePoi-Demo</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><!--poi 是基础依赖,提供了操作 Excel 文件的核心功能--><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>5.2.5</version></dependency><!--poi-ooxml 是操作 Office Open XML 格式文件(如 .xlsx、.docx 等)的扩展库。--><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.5</version></dependency><!--spring web--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--lombok--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><!--spring boot单元测试--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>3.1.2</version><configuration><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build></project>

方式一

for循环的方式读取数据

package com.apache.poi.demo.controller;import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;import java.io.InputStream;@RestController
public class DemoController {@PostMapping(value = "/poi/excel/import")public void excelImport(@RequestParam("file") MultipartFile file) throws Exception {// 输入流InputStream inputStream = file.getInputStream();// 创建一个工作簿XSSFWorkbook workbook = new XSSFWorkbook(inputStream);// 获取工作表getSheetAt,索引从0开始表示第一个工作表XSSFSheet sheet = workbook.getSheetAt(0);// 获取工作表中对应的行数int rows = sheet.getLastRowNum();for (int r = 0; r <= rows; r++) {// 获取指定的行XSSFRow row = sheet.getRow(r);// 获取指定的行数所对应的单元格int cols = sheet.getRow(r).getLastCellNum();for (int c = 0; c < cols; c++) {// 获取指定行指定的单元格XSSFCell cell = row.getCell(c);// 单元格类型,可以是字符串也可以是数字,也可以是布尔值CellType cellType = cell.getCellType();switch (cellType) {case STRING -> {// 字符串类型获取对应的字符串值System.out.print(cell.getStringCellValue());break;}case NUMERIC -> {// 数字类型获取对应的数字System.out.print(cell.getNumericCellValue());break;}case BOOLEAN -> {// 布尔类型获取对应的布尔值System.out.print(cell.getBooleanCellValue());break;}}System.out.print(" | ");}System.out.println();}}
}

测试结果

在这里插入图片描述
在这里插入图片描述

方式二

使用Iterator进行遍历表格数据

package com.apache.poi.demo.controller;import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;import java.io.InputStream;
import java.util.Iterator;@RestController
public class DemoTwoController {@PostMapping(value = "/poi/excel/import2")public void excelImportTwo(@RequestParam("file") MultipartFile file) throws Exception {// 输入流InputStream inputStream = file.getInputStream();// 创建一个工作簿XSSFWorkbook workbook = new XSSFWorkbook(inputStream);// 获取工作表getSheetAt,索引从0开始表示第一个工作表XSSFSheet sheet = workbook.getSheetAt(0);Iterator<Row> rowIterator = sheet.rowIterator();while (rowIterator.hasNext()) {// 获取指定的行XSSFRow row = (XSSFRow) rowIterator.next();// 获取单元格Iterator<Cell> cellIterator = row.cellIterator();while (cellIterator.hasNext()) {XSSFCell cell = (XSSFCell) cellIterator.next();CellType cellType = cell.getCellType();switch (cellType) {// 字符串类型获取对应的字符串值case STRING -> System.out.print(cell.getStringCellValue());// 数字类型获取对应的数字case NUMERIC -> System.out.print(cell.getNumericCellValue());//布尔类型获取对应的布尔值case BOOLEAN -> System.out.print(cell.getBooleanCellValue());}System.out.print(" | ");}System.out.println();}}
}

测试结果

在这里插入图片描述
在这里插入图片描述

向excel中写入数据

方式一

通过使用for循环的方式向excel中写入数据

package com.apache.poi.demo;import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;/*** 向excel中写入数据的步骤* Workbook -> Sheet -> Rows -> Cells*/
public class WriteExcelDemo {public static void main(String[] args) throws IOException {// 创建工作簿XSSFWorkbook workbook = new XSSFWorkbook();// 工作表名称为Emp InfoXSSFSheet sheet = workbook.createSheet("Emp Info");Object empdata[][] = {{"EmpID", "Name", "Job"},{101, "David", "Enginner"},{102, "Smith", "Manager"},{103, "Scott", "Analyst"}};for (int r = 0; r < empdata.length; r++) {// 创建表格行XSSFRow row = sheet.createRow(r);for (int c = 0; c < empdata[r].length; c++) {// 创建单元格Cell cell = row.createCell(c);Object value = empdata[r][c];// 判断值的类型,然后进行转换if (value instanceof String) {cell.setCellValue((String) value);} else if (value instanceof Integer) {cell.setCellValue((Integer) value);} else if (value instanceof Boolean) {cell.setCellValue((Boolean) value);}}}File dir = new File(".\\datafiles");if (!dir.exists()) {// 文件夹不存在则自动创建dir.mkdir();}String filePath = ".\\datafiles\\employee.xlsx";// new FileOutputStream(filePath, true);true表示文件不存在时候,自动生成FileOutputStream fileOutputStream = new FileOutputStream(filePath, true);workbook.write(fileOutputStream);// 关闭流workbook.close();fileOutputStream.close();System.out.println("employee.xlsx写入成功");}
}

方式二

package com.apache.poi.demo;import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;/*** 向excel中写入数据的步骤* Workbook -> Sheet -> Rows -> Cells*/
public class WriteExcelDemo2 {public static void main(String[] args) throws IOException {// 创建工作簿XSSFWorkbook workbook = new XSSFWorkbook();// 工作表名称为Emp InfoXSSFSheet sheet = workbook.createSheet("Emp Info");Object empdata[][] = {{"EmpID", "Name", "Job"},{101, "David", "Enginner"},{102, "Smith", "Manager"},{103, "Scott", "Analyst"}};int rowCount = 0;// 数据存储在一维数组emp[]中,for (Object emp[] : empdata) {// rowCount++,每次值使用之后,自动加1XSSFRow row = sheet.createRow(rowCount++);int columnCount = 0;for (Object value : emp) {XSSFCell cell = row.createCell(columnCount++);// 判断值的类型,然后进行转换if (value instanceof String) {cell.setCellValue((String) value);} else if (value instanceof Integer) {cell.setCellValue((Integer) value);} else if (value instanceof Boolean) {cell.setCellValue((Boolean) value);}}}File dir = new File(".\\datafiles");if (!dir.exists()) {// 文件夹不存在则自动创建dir.mkdir();}// 写入当前项目下的datafiles目录下的employee.xlsxString filePath = ".\\datafiles\\employee.xlsx";// new FileOutputStream(filePath, true);true表示文件不存在时候,自动生成FileOutputStream fileOutputStream = new FileOutputStream(filePath, true);workbook.write(fileOutputStream);// 关闭流workbook.close();fileOutputStream.close();System.out.println("employee.xlsx写入成功");}
}

方式三

package com.apache.poi.demo;import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;/*** 向excel中写入数据的步骤* Workbook -> Sheet -> Rows -> Cells*/
public class WriteExcelDemo3 {public static void main(String[] args) throws IOException {// 创建工作簿XSSFWorkbook workbook = new XSSFWorkbook();// 工作表名称为Emp InfoXSSFSheet sheet = workbook.createSheet("Emp Info");ArrayList<Object[]> empData = new ArrayList<>();empData.add(new Object[]{"EmpID", "Name", "Job"});empData.add(new Object[]{101, "David", "Enginner"});empData.add(new Object[]{102, "Smith", "Manager"});empData.add(new Object[]{103, "Scott", "Analyst"});int rowNum = 0;for (Object[] emp : empData) {XSSFRow row = sheet.createRow(rowNum++);int cellNum = 0;for (Object value : emp) {XSSFCell cell = row.createCell(cellNum++);// 判断值的类型,然后进行转换if (value instanceof String) {cell.setCellValue((String) value);} else if (value instanceof Integer) {cell.setCellValue((Integer) value);} else if (value instanceof Boolean) {cell.setCellValue((Boolean) value);}}}// 写入当前项目下的datafiles目录下的employee.xlsxString filePath = ".\\datafiles\\employee.xlsx";// new FileOutputStream(filePath, true);true表示文件不存在时候,自动生成FileOutputStream fileOutputStream = new FileOutputStream(filePath, true);workbook.write(fileOutputStream);// 关闭流workbook.close();fileOutputStream.close();System.out.println("employee.xlsx写入成功");}
}

测试结果

方式一、方式二和方式三的代码,都会在项目的根目录下的datafiles文件夹中生成employee.xlsx
在这里插入图片描述
employee.xlsx的文件内容如下
在这里插入图片描述

从 Excel 工作表中的公式单元格读取数据

package com.apache.poi.demo;import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;import java.io.FileInputStream;
import java.io.IOException;public class ReadDataFromFormulaCell {public static void main(String[] args) throws IOException {String filePath = ".\\datafiles\\readFormula.xlsx";FileInputStream fileInputStream = new FileInputStream(filePath);XSSFWorkbook workbook = new XSSFWorkbook(fileInputStream);XSSFSheet sheet = workbook.getSheetAt(0);int rows = sheet.getLastRowNum();int cols = sheet.getRow(0).getLastCellNum();for (int r = 0; r <= rows; r++) {XSSFRow row = sheet.getRow(r);for (int c = 0; c < cols; c++) {XSSFCell cell = row.getCell(c);switch (cell.getCellType()) {case STRING -> System.out.print(cell.getStringCellValue());case NUMERIC, FORMULA -> System.out.print(cell.getNumericCellValue());case BOOLEAN -> System.out.print(cell.getBooleanCellValue());}System.out.print("|");}System.out.println();}fileInputStream.close();}
}

在这里插入图片描述
在这里插入图片描述

测试结果

在这里插入图片描述

Excel 工作表中写入公式单元格

package com.apache.poi.demo;import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;import java.io.FileOutputStream;
import java.io.IOException;/*** Excel 工作表中写入公式单元格*/
public class WriteDataFromFormulaCell {public static void main(String[] args) throws IOException {XSSFWorkbook workbook = new XSSFWorkbook();String sheetName = "Number";XSSFSheet sheet = workbook.createSheet(sheetName);XSSFRow row = sheet.createRow(0);row.createCell(0).setCellValue(10);row.createCell(1).setCellValue(20);row.createCell(2).setCellValue(30);/*** setCellFormula设置单元格公式,A1*B1*C1,单元格列名,* A1*B1*C1相当于单元格的值等于第一行第一个单元格乘以第一行第二个单元格乘以第一行第三个单元格*/row.createCell(3).setCellFormula("A1*B1*C1");String filePath = ".\\datafiles\\calc.xlsx";// new FileOutputStream(filePath, true);true表示文件不存在,自动生成FileOutputStream fileOutputStream = new FileOutputStream(filePath, true);workbook.write(fileOutputStream);fileOutputStream.close();workbook.close();}
}

生成文件
在这里插入图片描述
文件内容
在这里插入图片描述

从受密码保护的Excel中读取数据

一个excel文件,被密码进行保护,如何读取里面的数据。表格数据如下
在这里插入图片描述

方式一

package com.apache.poi.demo;import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;import java.io.FileInputStream;
import java.io.IOException;/*** 从受密码保护的Excel中读取数据*/
public class ReadingPasswordProtectedExcel {public static void main(String[] args) throws IOException {String path = ".\\datafiles\\customers.xlsx";FileInputStream fis = new FileInputStream(path);// 密码String password = "test123";// 根据可能受密码保护的给定InputStream创建适当的HSSFWorkbook/XSSFWorkbook。XSSFWorkbook workbook = (XSSFWorkbook) WorkbookFactory.create(fis, password);// 获取指定的工作表XSSFSheet sheet = workbook.getSheetAt(0);// 一共有5行数据,索引从0开始int rows = sheet.getLastRowNum();// 一共有3列,索引从1开始int cols = sheet.getRow(0).getLastCellNum();// 使用for循环读取数据for (int r = 0; r <= rows; r++) {XSSFRow row = sheet.getRow(r);for (int c = 0; c < cols; c++) {XSSFCell cell = row.getCell(c);switch (cell.getCellType()) {case NUMERIC, FORMULA -> System.out.print(cell.getNumericCellValue());case STRING -> System.out.print(cell.getStringCellValue());case BOOLEAN -> System.out.print(cell.getBooleanCellValue());}System.out.print(" | ");}System.out.println();}// 关闭流workbook.close();fis.close();}
}

测试结果

在这里插入图片描述

方式二

package com.apache.poi.demo;import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;import java.io.FileInputStream;
import java.io.IOException;
import java.util.Iterator;/*** 从受密码保护的Excel中读取数据*/
public class ReadingPasswordProtectedExcel2 {public static void main(String[] args) throws IOException {String path = ".\\datafiles\\customers.xlsx";FileInputStream fis = new FileInputStream(path);// 密码String password = "test123";// 根据可能受密码保护的给定InputStream创建适当的HSSFWorkbook/XSSFWorkbook。XSSFWorkbook workbook = (XSSFWorkbook) WorkbookFactory.create(fis, password);// 获取指定的工作表XSSFSheet sheet = workbook.getSheetAt(0);// 使用迭代器来读取表格中的数据Iterator<Row> rowIterator = sheet.rowIterator();while (rowIterator.hasNext()) {Row row = rowIterator.next();Iterator<Cell> cellIterator = row.cellIterator();while (cellIterator.hasNext()) {Cell cell = cellIterator.next();switch (cell.getCellType()) {case NUMERIC, FORMULA -> System.out.print(cell.getNumericCellValue());case STRING -> System.out.print(cell.getStringCellValue());case BOOLEAN -> System.out.print(cell.getBooleanCellValue());}System.out.print(" | ");}System.out.println();}// 关闭流workbook.close();fis.close();}
}

测试结果

在这里插入图片描述

填充背景色和前景色到单元格中

package com.apache.poi.demo;import org.apache.poi.ss.usermodel.FillPatternType;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.xssf.usermodel.*;import java.io.FileOutputStream;
import java.io.IOException;public class FormattingCellColor {public static void main(String[] args) throws IOException {XSSFWorkbook workbook = new XSSFWorkbook();XSSFSheet sheet = workbook.createSheet("Sheet1");XSSFRow row = sheet.createRow(1);// 设置背景色XSSFCellStyle style = workbook.createCellStyle();style.setFillBackgroundColor(IndexedColors.BRIGHT_GREEN.getIndex());style.setFillPattern(FillPatternType.BIG_SPOTS);// 创建第一个单元格XSSFCell cell = row.createCell(1);cell.setCellValue("welcome");cell.setCellStyle(style);//设置前景色style = workbook.createCellStyle();style.setFillBackgroundColor(IndexedColors.YELLOW.getIndex());style.setFillPattern(FillPatternType.BIG_SPOTS);// 创建第二个单元格cell = row.createCell(2);cell.setCellValue("Automation");cell.setCellStyle(style);String path = ".\\datafiles\\style.xlsx";FileOutputStream fos = new FileOutputStream(path, true);workbook.write(fos);workbook.close();fos.close();System.out.println("Done!!!");}
}

测试结果

在这里插入图片描述
生成的表格样式
在这里插入图片描述

将HashMap格式写入表格

package com.apache.poi.demo;import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;/****/
public class HashMapExcel {public static void main(String[] args) throws IOException {XSSFWorkbook workbook = new XSSFWorkbook();XSSFSheet sheet = workbook.createSheet("Student data");Map<String, String> data = new HashMap<>();data.put("101", "John");data.put("102", "Smith");data.put("103", "Scott");data.put("104", "Kim");data.put("105", "Mary");int rowNo = 0;for (Map.Entry entry : data.entrySet()) {XSSFRow row = sheet.createRow(rowNo++);row.createCell(0).setCellValue((String) entry.getKey());row.createCell(1).setCellValue((String) entry.getValue());}FileOutputStream fos = new FileOutputStream(".\\datafiles\\student.xlsx", true);workbook.write(fos);workbook.close();fos.close();System.out.println("Excel Written Successfully!");}
}

测试结果

在这里插入图片描述
控制台输出
在这里插入图片描述

从excel中读取数据到HashMap中

package com.apache.poi.demo;import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;import java.io.FileInputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;/*** 把表格数据读取到HashMap中*/
public class ExcelToHashMap {public static void main(String[] args) throws IOException {String path = ".\\datafiles\\student.xlsx";FileInputStream fis = new FileInputStream(path);XSSFWorkbook workbook = new XSSFWorkbook(fis);XSSFSheet sheet = workbook.getSheet("Student data");int rows = sheet.getLastRowNum();HashMap<String, String> data = new HashMap<>();// 读取数据从表格到HashMapfor (int r = 0; r <= rows; r++) {String key = sheet.getRow(r).getCell(0).getStringCellValue();String value = sheet.getRow(r).getCell(1).getStringCellValue();data.put(key, value);}// 读取数据从HashMap中for (Map.Entry entry : data.entrySet()) {System.out.println(entry.getKey() + " " + entry.getValue());}System.out.println(data);workbook.close();fis.close();}
}

测试结果

在这里插入图片描述

从数据库中读取数据并写入Excel

springboot的maven项目添加postgresql数据库依赖

 <!--postgresql依赖--><dependency><groupId>org.postgresql</groupId><artifactId>postgresql</artifactId><scope>runtime</scope></dependency>
package com.apache.poi.demo;import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;import java.io.FileOutputStream;
import java.io.IOException;
import java.sql.*;/*** 从数据库中读取数据并写入Excel*/
public class DataBaseToExcel {/*** url*/private static final String url = "jdbc:postgresql://localhost:5432/cps";/*** 用户名*/private static final String username = "postgres";/*** 密码*/private static final String password = "admin";public static void main(String[] args) throws SQLException, IOException {// 连接到数据库Connection connection = DriverManager.getConnection(url, username, password);// statement/queryStatement statement = connection.createStatement();String sql = "select * from departments";ResultSet rs = statement.executeQuery(sql);// 表格XSSFWorkbook workbook = new XSSFWorkbook();XSSFSheet sheet = workbook.createSheet("Locations Data");// 创建表格标题行XSSFRow row = sheet.createRow(0);row.createCell(0).setCellValue("department_id");row.createCell(1).setCellValue("department_name");row.createCell(2).setCellValue("manager_id");row.createCell(3).setCellValue("location_id");int rowNum = 1;while (rs.next()) {String departmentId = rs.getString("department_id");String departmentName = rs.getString("department_name");String managerId = rs.getString("manager_id");String locationId = rs.getString("location_id");row = sheet.createRow(rowNum++);row.createCell(0).setCellValue(departmentId);row.createCell(1).setCellValue(departmentName);row.createCell(2).setCellValue(managerId);row.createCell(3).setCellValue(locationId);}FileOutputStream fos = new FileOutputStream(".\\datafiles\\department.xlsx");workbook.write(fos);workbook.close();fos.close();//关闭数据库连接connection.close();}
}

测试结果

在这里插入图片描述

从Excel中读取数据并写入数据库表

excel内容

在这里插入图片描述

package com.apache.poi.demo;import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;import java.io.FileInputStream;
import java.io.IOException;
import java.sql.*;/*** 从Excel中读取数据并写入数据库表*/
public class ExcelToDatabase {/*** url*/private static final String url = "jdbc:postgresql://localhost:5432/cps";/****/private static final String username = "postgres";/*** 密码*/private static final String password = "admin";public static void main(String[] args) throws SQLException, IOException {// 连接到数据库Connection connection = DriverManager.getConnection(url, username, password);// statement/queryStatement statement = connection.createStatement();String sql = "create table test.departments (department_id int4 not null,department_name varchar(30) not null,manager_id int4 null,location_id int4 null)";statement.execute(sql);// 表格FileInputStream fis = new FileInputStream(".\\datafiles\\department.xlsx");XSSFWorkbook workbook = new XSSFWorkbook(fis);XSSFSheet sheet = workbook.getSheet("Locations Data");int rows = sheet.getLastRowNum();for (int r = 1; r <= rows; r++) {XSSFRow row = sheet.getRow(r);double departmentId = Double.parseDouble(row.getCell(0).getStringCellValue());String departmentName = row.getCell(1).getStringCellValue();int managerId = Integer.parseInt(row.getCell(2).getStringCellValue());int locationId = Integer.parseInt(row.getCell(3).getStringCellValue());sql = "insert into test.departments values(?,?,?,?)";PreparedStatement preparedStatement = connection.prepareStatement(sql);preparedStatement.setDouble(1, departmentId);preparedStatement.setString(2, departmentName);preparedStatement.setInt(3, managerId);preparedStatement.setInt(4, locationId);preparedStatement.executeUpdate();// 提交sqlstatement.execute("commit");}workbook.close();fis.close();connection.close();}
}

生成的数据表

在这里插入图片描述

Selenium中的数据驱动测试

maven依赖

<!--selenium的java依赖-->
<!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java --><dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>4.20.0</version></dependency><!--TestNg的依赖--><!-- https://mvnrepository.com/artifact/org.testng/testng --><dependency><groupId>org.testng</groupId><artifactId>testng</artifactId><version>7.10.1</version><scope>test</scope></dependency>

获取提交按钮的Xpath

在这里插入图片描述

自动化登录的地址:https://admin-demo.nopcommerce.com/login

工具类

package com.apache.poi.demo;import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.DataFormatter;
import org.apache.poi.ss.usermodel.FillPatternType;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;public class XLUtility {public FileInputStream fis;public FileOutputStream fos;public XSSFWorkbook workbook;public XSSFSheet sheet;public XSSFRow row;public XSSFCell cell;public CellStyle style;String path = null;XLUtility(String path) {this.path = path;}/*** 获取工作表中的行数** @param sheetName 工作表名* @return 表格行数* @throws IOException 抛出IO异常*/public int getRowCount(String sheetName) throws IOException {fis = new FileInputStream(path);workbook = new XSSFWorkbook(fis);sheet = workbook.getSheet(sheetName);int rowCount = sheet.getLastRowNum();workbook.close();fis.close();return rowCount;}/*** 获取工作表中行所在的单元格数量** @param sheetName 工作表名* @param rowNum    表格行号* @return 行所在的单元格数量* @throws IOException 抛出IO异常*/public int getCellCount(String sheetName, int rowNum) throws IOException {fis = new FileInputStream(path);workbook = new XSSFWorkbook(fis);sheet = workbook.getSheet(sheetName);row = sheet.getRow(rowNum);int cellCount = row.getLastCellNum();workbook.close();fis.close();return cellCount;}/*** 获取单元格内容** @param sheetName 工作表名* @param rowNum    表格行号* @param cellNum   单元格号* @return 单元格内容* @throws IOException 抛出IO异常*/public String getCellData(String sheetName, int rowNum, int cellNum) throws IOException {fis = new FileInputStream(path);workbook = new XSSFWorkbook(fis);sheet = workbook.getSheet(sheetName);row = sheet.getRow(rowNum);cell = row.getCell(cellNum);DataFormatter formatter = new DataFormatter();String data;try {data = formatter.formatCellValue(cell);} catch (Exception e) {data = "";}workbook.close();fis.close();return data;}/*** 设置表格单元格内容** @param sheetName 工作表名* @param rowNum    表格行号* @param cellNum   单元格号* @param data      单元格内容* @throws IOException 抛出IO异常*/public void setCellData(String sheetName, int rowNum, int cellNum, String data) throws IOException {fis = new FileInputStream(path);workbook = new XSSFWorkbook(fis);sheet = workbook.getSheet(sheetName);row = sheet.getRow(rowNum);cell = row.getCell(cellNum);cell.setCellValue(data);fos = new FileOutputStream(path);workbook.write(fos);workbook.close();fis.close();fos.close();}/*** 单元格填充颜色** @param sheetName 工作表名* @param rowNum    表格行号* @param cellNum   单元格号* @throws IOException 抛出IO异常*/public void fillGreenColor(String sheetName, int rowNum, int cellNum) throws IOException {fis = new FileInputStream(path);workbook = new XSSFWorkbook(fis);sheet = workbook.getSheet(sheetName);row = sheet.getRow(rowNum);cell = row.getCell(cellNum);style = workbook.createCellStyle();style.setFillForegroundColor(IndexedColors.GREEN.getIndex());style.setFillPattern(FillPatternType.SOLID_FOREGROUND);cell.setCellStyle(style);workbook.write(fos);workbook.close();fis.close();fos.close();}
}

案例代码

package com.apache.poi.demo;import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.Assert;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;import java.io.IOException;
import java.util.concurrent.TimeUnit;public class DataDriverTest {WebDriver driver;@BeforeClasspublic void setup() {// 将chromedriver下载放到自己的一个目录中,并在代码中设置System.setProperty("webdriver.chrome.driver", "..\\selenium-java-demo\\driver\\chromedriver.exe");//使用驱动实例并开启对话driver = new ChromeDriver();// 建立等待策略driver.manage().timeouts().implicitlyWait(500000, TimeUnit.SECONDS);// 窗口最大化driver.manage().window().maximize();}@Test(dataProvider = "LoginData")public void loginTest(String user, String pwd, String exp) {String url = "https://admin-demo.nopcommerce.com/login";// 打开的urldriver.get(url);WebElement txtEmail = driver.findElement(By.id("Email"));// 清空元素的输入txtEmail.clear();// 输入内容txtEmail.sendKeys(user);WebElement txtPassword = driver.findElement(By.id("Password"));txtPassword.clear();txtPassword.sendKeys(pwd);// LOG IN按钮的Xpath陆路径String xPath = "/html/body/div[6]/div/div/div/div/div[2]/div[1]/div/form/div[3]/button";//  点击LOG IN按钮driver.findElement(By.xpath(xPath)).click();String expTitle = "Dashboard / nopCommerce administration";String actTitle = driver.getTitle();if (exp.equals("Valid")) {if (expTitle.equals(actTitle)) {driver.findElement(By.linkText("Logout")).click();Assert.assertTrue(true);} else {Assert.assertTrue(false);}} else if (exp.equals("Invalid")) {if (expTitle.equals(actTitle)) {driver.findElement(By.linkText("Logout")).click();Assert.assertTrue(false);} else {Assert.assertTrue(true);}}}/*** 数据提供者* 必须返回Object[][]数组类型*/@DataProvider(name = "LoginData")public String[][] getData() throws IOException {// 从excel中获取数据String path = ".\\datafiles\\loginData.xlsx";XLUtility util = new XLUtility(path);int totalRows = util.getRowCount("Sheet1");int totalCols = util.getCellCount("Sheet1", 1);String loginData[][] = new String[totalRows][totalCols];for (int i = 1; i < totalRows; i++) {for (int j = 0; j < totalCols; j++) {String cellData = util.getCellData("Sheet1", i, j);loginData[i-1][j] = cellData;}}return loginData;}@AfterClassvoid tearDown() {driver.quit();}
}

在Selenium中将WebTable数据写入Excel表(网页数据抽取)

package com.apache.poi.demo;import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.DataFormatter;
import org.apache.poi.ss.usermodel.FillPatternType;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;public class XLUtility {public FileInputStream fis;public FileOutputStream fos;public XSSFWorkbook workbook;public XSSFSheet sheet;public XSSFRow row;public XSSFCell cell;public CellStyle style;String path = null;XLUtility(String path) {this.path = path;}/*** 获取工作表中的行数** @param sheetName 工作表名* @return 表格行数* @throws IOException 抛出IO异常*/public int getRowCount(String sheetName) throws IOException {fis = new FileInputStream(path);workbook = new XSSFWorkbook(fis);sheet = workbook.getSheet(sheetName);int rowCount = sheet.getLastRowNum();workbook.close();fis.close();return rowCount;}/*** 获取工作表中行所在的单元格数量** @param sheetName 工作表名* @param rowNum    表格行号* @return 行所在的单元格数量* @throws IOException 抛出IO异常*/public int getCellCount(String sheetName, int rowNum) throws IOException {fis = new FileInputStream(path);workbook = new XSSFWorkbook(fis);sheet = workbook.getSheet(sheetName);row = sheet.getRow(rowNum);int cellCount = row.getLastCellNum();workbook.close();fis.close();return cellCount;}/*** 获取单元格内容** @param sheetName 工作表名* @param rowNum    表格行号* @param cellNum   单元格号* @return 单元格内容* @throws IOException 抛出IO异常*/public String getCellData(String sheetName, int rowNum, int cellNum) throws IOException {fis = new FileInputStream(path);workbook = new XSSFWorkbook(fis);sheet = workbook.getSheet(sheetName);row = sheet.getRow(rowNum);cell = row.getCell(cellNum);DataFormatter formatter = new DataFormatter();String data;try {data = formatter.formatCellValue(cell);} catch (Exception e) {data = "";}workbook.close();fis.close();return data;}/*** 设置表格单元格内容** @param sheetName 工作表名* @param rowNum    表格行号* @param cellNum   单元格号* @param data      单元格内容* @throws IOException 抛出IO异常*/public void setCellData(String sheetName, int rowNum, int cellNum, String data) throws IOException {File xlFile = new File(path);if (!xlFile.exists()) {// 如果文件不存在就创建一个新文件workbook = new XSSFWorkbook();fos = new FileOutputStream(path);workbook.write(fos);}fis = new FileInputStream(path);workbook = new XSSFWorkbook(fis);if (workbook.getSheetIndex(sheetName) == -1) {// 工作表不存在就创建workbook.createSheet(sheetName);}sheet = workbook.getSheet(sheetName);if (sheet.getRow(rowNum) == null) {// 表格行不存在就创建row = sheet.createRow(rowNum);}row = sheet.getRow(rowNum);cell = row.createCell(cellNum);cell.setCellValue(data);fos = new FileOutputStream(path);workbook.write(fos);workbook.close();fis.close();fos.close();}/*** 单元格填充颜色** @param sheetName 工作表名* @param rowNum    表格行号* @param cellNum   单元格号* @throws IOException 抛出IO异常*/public void fillGreenColor(String sheetName, int rowNum, int cellNum) throws IOException {fis = new FileInputStream(path);workbook = new XSSFWorkbook(fis);sheet = workbook.getSheet(sheetName);row = sheet.getRow(rowNum);cell = row.getCell(cellNum);style = workbook.createCellStyle();style.setFillForegroundColor(IndexedColors.GREEN.getIndex());style.setFillPattern(FillPatternType.SOLID_FOREGROUND);cell.setCellStyle(style);workbook.write(fos);workbook.close();fis.close();fos.close();}
}
package com.apache.poi.demo;import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;import java.io.IOException;
import java.util.concurrent.TimeUnit;/*** 在Selenium中将WebTable数据写入Excel表(网页数据抽取)*/
public class WebTableToExcel {public static void main(String[] args) throws IOException {//设置环境变量String driverPath = ".\\selenium-java-demo\\driver\\chromedriver.exe";System.setProperty("webdriver.chrome.driver", driverPath);// 使用驱动实例开启会话WebDriver driver = new ChromeDriver();//等待策略driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);// 窗口最大化driver.manage().window().maximize();//导航到的urlString url = "https://en.wikipedia.org/wiki/List_of_countries_and_dependencies_by_population";driver.get(url);String path = ".\\datafiles\\population.xlsx";XLUtility utility = new XLUtility(path);// 设置标题行utility.setCellData("Sheet1", 0, 0, "Location");utility.setCellData("Sheet1", 0, 1, "Population");utility.setCellData("Sheet1", 0, 2, "% of world");utility.setCellData("Sheet1", 0, 3, "Date");utility.setCellData("Sheet1", 0, 4, "Source");// 捕获表格数据WebElement table = driver.findElement(By.xpath("//*[@id=\"mw-content-text\"]/div[1]/table/tbody"));// 在网页中表格的行int size = table.findElements(By.xpath("tr")).size();for (int r = 1; r <= size; r++) {String location = table.findElement(By.xpath("tr[" + r + "]/td[1]")).getText();String population = table.findElement(By.xpath("tr[" + r + "]/td[2]")).getText();String world = table.findElement(By.xpath("tr[" + r + "]/td[3]")).getText();String date = table.findElement(By.xpath("tr[" + r + "]/td[4]")).getText();String source = table.findElement(By.xpath("tr[" + r + "]/td[5]")).getText();System.out.println(location + " " + population + " " + world + " " + date + " " + source);utility.setCellData("Sheet1", r, 0, location);utility.setCellData("Sheet1", r, 1, population);utility.setCellData("Sheet1", r, 2, world);utility.setCellData("Sheet1", r, 3, date);utility.setCellData("Sheet1", r, 4, source);}System.out.println("Web scraping is done successfully...");driver.close();}
}

测试结果

生成population.xlsx
在这里插入图片描述

在Excel中单元格内容为日期格式

package com.apache.poi.demo;import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.CreationHelper;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Date;public class WorkingWithDateCells {public static void main(String[] args) throws IOException {// 创建一个空的工作簿XSSFWorkbook workbook = new XSSFWorkbook();// 创建一个工作表格XSSFSheet sheet = workbook.createSheet("Date formats");sheet.setColumnWidth(0, 256 * 20);XSSFCell cell = sheet.createRow(0).createCell(0);cell.setCellValue(new Date());CreationHelper creationHelper = workbook.getCreationHelper();// 格式化  yyyy-MM-dd HH:mm:ssCellStyle style = workbook.createCellStyle();style.setDataFormat(creationHelper.createDataFormat().getFormat("yyyy-MM-dd HH:mm:ss"));cell.setCellStyle(style);FileOutputStream fos = new FileOutputStream(".\\datafiles\\dataformats.xlsx", true);workbook.write(fos);fos.close();workbook.close();}
}

测试结果

在这里插入图片描述

代码地址

https://gitee.com/BAIXUEQIAN/java-study/tree/develop/Apache-Poi-Demo

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/7375.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

远程代码/命令执行(RCE)

远程代码执行/远程命令执行&#xff08;remote/code/execute||remote/command/execute&#xff09; 类似sql注入xss等漏洞&#xff0c;rce也是代码注入&#xff08;用户可控&#xff09;&#xff0c;注入对象为操作系统命令、后端代码&#xff0c;用户参 数可控&#xff0c;且未…

autoware.auto 安装 ROS2

先进行docker安装 sudo apt-get update sudo apt-get install ca-certificates curl gnupg lsb-release curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - sudo add-apt-repository "deb [archamd64] https://download.docker.com/linux/u…

【前端】HTML基础(2)

文章目录 前言一、HTML常见标签1、 注释标签1.1 标题标签1.2 段落标签1.3 换行标签 2、 格式化标签2.1 加粗标签2.2 倾斜标签2.3 删除线标签2.4 下划线标签 3、 图片标签3.1 src属性3.2 alt属性3.3 title属性3.4 图片大小3.5 图片边框 4、 超链接标签4.1 属性4.2 属性 前言 这篇…

Chromium编译指南2024 Windows11篇-配置depot_tools工具(二)

前言 在《Chromium编译指南2024&#xff08;一&#xff09;》我们探讨了Chromium编译前的准备工作和Visual Studio安装。 接下来&#xff0c;我们将详细介绍如何下载、解压并配置depot_tools工具&#xff0c;以便顺利进行后续的开发工作。 1. 下载解压depot_tools 包 下载d…

Python | Leetcode Python题解之第73题矩阵置零

题目&#xff1a; 题解&#xff1a; class Solution:def setZeroes(self, matrix: List[List[int]]) -> None:m, n len(matrix), len(matrix[0])flag_col0 Falsefor i in range(m):if matrix[i][0] 0:flag_col0 Truefor j in range(1, n):if matrix[i][j] 0:matrix[i]…

DS:链表的分类

欢迎来到Harper.Lee的学习世界&#xff01; 博主主页传送门&#xff1a;Harper.Lee的博客主页 想要一起进步的uu欢迎来后台找我哦&#xff01; 链表的结构⾮常多样&#xff0c;以下情况组合起来就有8种&#xff08;2 * 2 * 2&#xff09;链表结构。下面我们依次来认识它们吧&am…

大数据面试题(十):Hive的高频面试考点(二)

文章目录 Hive的高频面试考点 一、请说明Hive中 sort by ,order by ,cluster by ,distribute by各代表什么意思

Mysql 8.0 -- 最新版本安装(保姆级教程)

Mysql 8.0 -- 最新版本安装&#xff08;保姆级教程&#xff09; ​​ 一&#xff0c;下载Mysql数据库&#xff1a; 官网链接&#xff1a;https://www.mysql.com/downloads/ 二&#xff0c;安装Mysql: 三&#xff0c;找到Mysql安装目录&#xff1a; 找到mysql安装目录&#xf…

攻防世界-NewsCenter

题目信息 分析过程 题目打开是有个输入框可以用来输入搜索信息&#xff0c;初步判断是个sql注入的题目。接下来判断能否进行sql注入&#xff1a; 输入 hi&#xff0c;有搜索结果&#xff0c;如下图: 输入hi’,无结果&#xff0c;如下图&#xff1a; 初步判定是hi‘后面还有单引…

设计模式(2)创造型设计模式

创建型模式 创建型模式1.工厂模式1.1 抽象工厂模式&#xff08;Abstract factory&#xff09;1.2 工厂方法模式&#xff08;Factory Method&#xff09;1.3 简单工厂模式&#xff08;Simple Factory&#xff09; 2. 建造者模式&#xff08;Builder&#xff09;3. 原型模式&…

[Android]四大组件简介

在 Android 开发中&#xff0c;“四大组件”&#xff08;Four Major Components&#xff09;是指构成 Android 应用程序的四种核心组件&#xff0c;它们通过各自的方式与系统交互&#xff0c;实现应用的多样功能。这些组件是&#xff1a;Activity、Service、Broadcast Receiver…

6个月小猫成长必备!福派斯无麸质幼猫粮评测

你知道吗&#xff1f;给小猫选择适合的猫粮是一件非常不容易但很重要的事情。那么&#xff0c;对于6个月大的小猫来说&#xff0c;什么样的猫粮是最适合它们的呢&#xff1f;&#x1f431; 我们首先要考虑的是猫粮的营养成分。6个月大的小猫正处于快速生长期&#xff0c;所以需…

远程连接是什么?

远程连接是指通过网络连接两个或多个设备&#xff0c;实现远程访问、控制或传输数据的技术。它在现代科技发展中起到了重要作用&#xff0c;使得我们可以随时随地与远程设备进行交互、管理和操作。 天联组网是一种高效的远程连接解决方案&#xff0c;它因为操作简单、跨平台应用…

git使用注意事项事项

以下操作均在gitee平台上实现 文章目录 1、本地仓库和远程仓库有冲突2、git提交自动忽略某些文件3、git无法push提交到远程仓库 1、本地仓库和远程仓库有冲突 在web端修改了文件内容或者删除了文件&#xff0c;本地仓库需要重新把远程仓库拉取到本地&#xff0c;或者强制提交到…

Prometheus 2: 一个专门评估其他语言模型的开源语言模型(续集)

普罗米修斯的续集来了。 专有的语言模型如 GPT-4 经常被用来评估来自各种语言模型的回应品质。然而,透明度、可控制性和可负担性等考虑强烈促使开发专门用于评估的开源语言模型。另一方面,现有的开源评估语言模型表现出关键的缺点:1) 它们给出的分数与人类给出的分数存在显著差…

图像处理-图像平滑

图像平滑 前言一、概念介绍1.1 图像的平滑1.2 图像中噪声的分类1.3 MATLAB的添加噪音代码 二、空间域平滑滤波2.1 均值滤波2.2 原理计算 总结 前言 在图像的获取、传输和存储过程常常收到各种噪声的干扰和影响&#xff0c;使得图像的质量下降&#xff0c;为了获得高质量的数字…

读天才与算法:人脑与AI的数学思维笔记20_数学图灵测试

1. 数学图灵测试 1.1. 能不能将这种计算机证明语言翻译成易于与人交流的方式呢&#xff1f; 1.1.1. 剑桥大学的两位数学家蒂莫西高尔斯&#xff08;Timothy Gowers&#xff09;和莫汉加内萨林加姆&#xff08;Mohan Ganesalingam&#xff09;开展了此项研究 1.1.1.1. 他们决…

与Apolo共创生态: Apollo X企业自动驾驶解决方案的亮点

文章目录 前言技术革新的里程碑Apollo X企业自动驾驶解决方案的亮点Application X企业预制套件的多场景覆盖Studio X企业协同工具链的全周期支持第一阶段&#xff1a;上机系统构建第二阶段&#xff1a;POC搭建第三阶段&#xff1a;规模运营小结 共创生态&#xff0c;共享未来共…

Mysql数据在磁盘上的存储结构

一. 前言 一行数据的存储格式大致如下所示: 变长字段的长度列表&#xff0c;null值列表&#xff0c;数据头&#xff0c;column01的值&#xff0c;column02的值&#xff0c;column0n的值… 二. 变长字段 在MySQL里有一些字段的长度是变长的&#xff0c;是不固定的&#xff0c;…

ContEA阅读笔记

Facing Changes: Continual Entity Alignment for Growing Knowledge Graphs 面对变化&#xff1a;不断增长的知识图谱的持续实体对齐 Abstract 实体对齐是知识图谱(KG)集成中一项基本且重要的技术。多年来&#xff0c;实体对齐的研究一直基于知识图谱是静态的假设&#xff…