当前位置: 首页 > news >正文

解析html将表格插入word文档

用到依赖包

 <dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.15.2</version></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.7</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.15</version></dependency>

代码

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.poi.xwpf.usermodel.*;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.nodes.Node;
import org.jsoup.select.Elements;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.*;
import org.springframework.util.StringUtils;import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.math.BigInteger;
import java.util.List;
import java.util.Objects;@Slf4j
public class Html2WordTest1 {/*** 每厘米567缇*/private static double teePerCM = 567;/*** 每厘米28.35磅*/private static double poundPerCm = 28.35;private static String rgb_black = "000000";/*** 根据磅,获取缇** @return*/private static BigInteger getTwipFromPound(double pound) {Double d = pound * teePerCM / poundPerCm;return BigInteger.valueOf(d.longValue());}/*** 根据厘米,获取缇** @param cm* @return*/private static BigInteger getTwipFromCM(double cm) {Double d = cm * teePerCM;return BigInteger.valueOf(d.longValue());}public static void main(String[] args) throws Exception {
//        buildTable1();buildTable2();log.info("通过html构建docx文件成功!");}public static void buildTable2() throws Exception {String htmlPath = "D:\\work\\project\\jar\\wordtopdf-server\\createWordBytemplate\\src\\test\\java\\simple.html";String templatePath = "D:\\work\\project\\jar\\wordtopdf-server\\createWordBytemplate\\src\\test\\java\\template.docx";String targetPath = "D:\\work\\project\\jar\\wordtopdf-server\\createWordBytemplate\\src\\test\\java\\simple.docx";Document htmlDocument = Jsoup.parse(new File(htmlPath));List<Node> nodeList = htmlDocument.body().childNodes();XWPFDocument document = new XWPFDocument(new FileInputStream(new File(templatePath)));for (Node node : nodeList) {
//            获取出table标签if (node.nodeName().equalsIgnoreCase("table")) {XWPFParagraph paragraph = document.getLastParagraph();parseTableToWord(document, node, paragraph);}}FileOutputStream fileOutputStream = new FileOutputStream(new File(targetPath));document.write(fileOutputStream);fileOutputStream.close();}private static void parseTableToWord(XWPFDocument doc, Node node, XWPFParagraph paragraph) throws Exception {//简化表格htmlString string = node.toString();org.jsoup.nodes.Document tableDoc = Jsoup.parse(string);Elements trList = tableDoc.getElementsByTag("tr");//创建表格XWPFTable xwpfTable = doc.insertNewTbl(paragraph.getCTP().newCursor());if (null == xwpfTable) {return;}//设置样式CTTblPr ctTblPr = xwpfTable.getCTTbl().getTblPr();if (ctTblPr == null) {ctTblPr = xwpfTable.getCTTbl().addNewTblPr();}CTJc jc = ctTblPr.getJc();if (jc == null) {jc = ctTblPr.addNewJc();}//表格位置居中显示jc.setVal(STJc.CENTER);ctTblPr.setJc(jc);//设置表格宽度ctTblPr.getTblW().setType(STTblWidth.PCT);
//        ctTblPr.getTblW().setType(STTblWidth.DXA);//设置表格宽度10cm转换成缇  1cm=567缇ctTblPr.getTblW().setW(getTwipFromCM(10));//设置单元格边框
//        CTTcBorders borders = CTTcBorders.Factory.newInstance();
//        CTBorder border = CTBorder.Factory.newInstance();
//        border.setVal(STBorder.SINGLE);
//        加粗
//        border.setVal(STBorder.THICK);
//       虚线边框
//        border.setVal(STBorder.DOTTED);
//        三层边框
//        border.setVal(STBorder.TRIPLE);
//        波浪
//        border.setVal(STBorder.WAVE);
//        border.setColor(rgb_black);
//        border.setSz(BigInteger.ONE);
//        border.setSpace(BigInteger.ZERO);
//        borders.setLeft(border);
//        borders.setBottom(border);
//        borders.setRight(border);
//        borders.setTop(border);
//        CTTcPr ctTcPr = xwpfTable.getRow(0).getCell(0).getCTTc().getTcPr();
//        if (ctTcPr == null) ctTcPr = xwpfTable.getRow(0).getCell(0).getCTTc().addNewTcPr();
//        ctTcPr.setTcBorders(borders);//写入表格行和列内容for (int row = 0; row < trList.size(); row++) {XWPFTableRow tableRow = xwpfTable.getRow(row);if (null == tableRow) {tableRow = xwpfTable.createRow();}Element trElement = trList.get(row);
//            先后获取表头<th></th>Elements tds = trElement.getElementsByTag("th");if (CollectionUtils.isEmpty(tds)) {
//                 如果th为空说明该行是表内容 <td></td>tds = trElement.getElementsByTag("td");}double widthTotal = 0.0;
//            操作列for (int col = 0; col < tds.size(); col++) {
//                获取当前列对象XWPFTableCell tableCell = tableRow.getCell(col);if (null == tableCell) {tableCell = tableRow.createCell();}//设置单元格边框样式CTTcPr tcPr = tableCell.getCTTc().isSetTcPr() ? tableCell.getCTTc().getTcPr() : tableCell.getCTTc().addNewTcPr();CTTcBorders ctTcBorders = tcPr.addNewTcBorders();ctTcBorders.addNewLeft().setVal(STBorder.SINGLE);ctTcBorders.addNewRight().setVal(STBorder.SINGLE);ctTcBorders.addNewTop().setVal(STBorder.SINGLE);ctTcBorders.addNewBottom().setVal(STBorder.SINGLE);Element colElement = tds.get(col);List<Node> nodes = colElement.childNodes();for (Node tdNode : nodes) {if ("#text".equalsIgnoreCase(tdNode.nodeName())) {//将每一个的内容当成一个段落进行编辑之后再填充到table中parseHtmlToWordTable(colElement, doc, tableCell.getParagraphs().get(0));}}}}}static void parseHtmlToWordTable(Node node, XWPFDocument doc, XWPFParagraph xwpfParagraph) {List<Node> nodes = node.childNodes();if (CollectionUtils.isNotEmpty(nodes)) {for (Node childNode : nodes) {parseHtmlToWordTable(childNode, doc, xwpfParagraph);}}//处理table标签if ("table".equalsIgnoreCase(node.nodeName())) {return;}if (CollectionUtils.isNotEmpty(node.childNodes())) {return;}String nodeValue = node.toString();Node parent = node.parent();boolean boldFlag = false;String color = "";boolean subFlag = false;boolean supFlag = false;boolean ulFlag = false;if (null != parent) {String parentNodeName = parent.nodeName();if (parentNodeName.equalsIgnoreCase("strong") || parentNodeName.equalsIgnoreCase("b")) {boldFlag = true;} else if (parentNodeName.equalsIgnoreCase("font")) {if (Objects.requireNonNull(parent.parent()).nodeName().equalsIgnoreCase("strong")|| Objects.requireNonNull(parent.parent()).nodeName().equalsIgnoreCase("b")) {boldFlag = true;}String color1 = parent.attr("color");if (!StringUtils.isEmpty(color1)) {color = color1.substring(1);}Node parented = parent.parent();if (null != parented) {if (parented.nodeName().equalsIgnoreCase("li")) {if (Objects.requireNonNull(parented.parent()).nodeName().equalsIgnoreCase("ul")) {ulFlag = true;}}}} else if (parentNodeName.equalsIgnoreCase("sub")) {subFlag = true;} else if (parentNodeName.equalsIgnoreCase("sup")) {supFlag = true;} else if (parentNodeName.equalsIgnoreCase("li")) {if (Objects.requireNonNull(parent.parent()).nodeName().equalsIgnoreCase("ul")) {ulFlag = true;}}}if ("#text".equalsIgnoreCase(node.nodeName()) && !nodeValue.contains("<")) {XWPFRun run = xwpfParagraph.createRun();run.setFontFamily("Times New Roman");run.setFontSize(10);if (boldFlag) {run.setBold(true);}if (StringUtils.isEmpty(color)) {run.setColor(color);}if (supFlag) {run.setSubscript(VerticalAlign.SUPERSCRIPT);}if (subFlag) {run.setSubscript(VerticalAlign.SUBSCRIPT);}if (ulFlag && StringUtils.isEmpty(nodeValue.trim())) {XWPFParagraph paragraph = doc.createParagraph();paragraph.setIndentFromLeft(0);paragraph.setFirstLineIndent(0);
//                paragraph.setIndentationLeftChars(125);XWPFRun run1 = paragraph.createRun();run1.setFontFamily("Times New Roman");run1.setFontSize(8);run1.setText("●");run1.addTab();XWPFRun run2 = paragraph.createRun();run2.setText(nodeValue.trim());run2.setFontFamily("Times New Roman");run2.setFontSize(10);}if (StringUtils.isEmpty(nodeValue) && !ulFlag) {run.setText(nodeValue.trim());}}//        boolean enabledBreak = ReUtil.isMatch("(|h[12345]|li|img|br)", node.nodeName().toLowerCase());boolean enabledBreak = true;if (enabledBreak) {XWPFRun run = xwpfParagraph.createRun();run.addCarriageReturn();}}/****//*  public static void buildTable1() throws IOException {String htmlPath = "D:\\work\\project\\jar\\wordtopdf-server\\createWordBytemplate\\src\\test\\java\\simple.html";String templatePath = "D:\\work\\project\\jar\\wordtopdf-server\\createWordBytemplate\\src\\main\\resources\\template.docx";String targetPath = "D:\\work\\project\\jar\\wordtopdf-server\\createWordBytemplate\\src\\test\\java\\simple.docx";Document htmlDocument = Jsoup.parse(new File(htmlPath));List<Node> nodeList = htmlDocument.body().childNodes();List<Node> table = nodeList.stream().filter(o -> o.nodeName().equalsIgnoreCase("table")).collect(Collectors.toList());XWPFTemplate template = XWPFTemplate.compile(templatePath);for (Node node : table) {Map map = new HashMap<>();Elements rows = ((Element) node).getElementsByTag("tr");if (CollectionUtils.isEmpty(rows)) {continue;}RowRenderData[] rowArr = new RowRenderData[rows.size()];for (int row = 0; row < rows.size(); row++) {Elements cols = rows.get(row).getElementsByTag("th");if (CollectionUtils.isEmpty(cols)) {cols = rows.get(row).getElementsByTag("td");}String[] colsAtrr = new String[cols.size()];for (int col = 0; col < cols.size(); col++) {colsAtrr[col] = cols.get(col).text();}rowArr[row] = Rows.of(colsAtrr).create();}TableRenderData tableRenderData = Tables.create(rowArr);map.put("table", tableRenderData);template.render(map);}template.writeAndClose(Files.newOutputStream(Paths.get(targetPath)));}*/}

相关文章:

解析html将表格插入word文档

用到依赖包 <dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.15.2</version></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweav…...

Java核心知识详解:String类、StringBuffer、数组及日期时间的全面解析

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;Java &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; 标题 Java核心知识详解&#xff1a;String类、StringBuffer、数组及日期时间的全面解析 摘要 在Java中…...

唯一设备序列号(UID)、唯一产品识别码(UPI)和备份寄存器BKP

文章目录 一、唯一设备序列号UID二、唯一产品识别码UPI三、备份寄存器BKP 一、唯一设备序列号UID MCU 系列产品内置两个不同长度的唯一设备序列号&#xff0c;分别为 96 位的 UID(Unique device ID)和 128 位的UCID(Unique Customer ID)&#xff0c;这两个设备序列号存放在闪存…...

Kafka - 消费者程序仅消费一半分区消息的问题

1. 问题描述 修改安全服务状态有时逻辑正常有时候逻辑不正常&#xff0c;排查incident服务的日志发现消息可以正常发送到 kafka topic &#xff0c;但是incident-cron 服务有时候有拉取消息的日志有时候没有日志。 kafka 生产者可以将消息正常发送到 kafka topic &#xff0c…...

养老院管理系统+小程序项目需求分析文档

智慧综合养老服务平台是以业务为牵引、场景为驱动&#xff0c;围绕“老人”业务域&#xff0c;持续沉淀和打磨形成适应不同养老业务发展需要的业务能力&#xff0c;推动业务模式升级&#xff0c;为养老服务提供数字化解决方案&#xff0c;并依托实体站点与养老机构实现线上线下…...

K8s 下通过prometheus监控 nginx

k8s 下有两个版本的nginx ingress 分别是 ingress nginx 以及 nginx ingress Ingress-nginx 与 Nginx-ingress - LeoZhanggg - 博客园 这里我讨论的是 nginx ingress Nginx Ingress 使用Prometheus 导出数据 nginx ingress 本身支持通过支持这个提供prometheus 格式的…...

基于SpringBoot的京东绿谷旅游信息服务平台设计与实现(源码+定制+开发)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…...

使用Redis生成全局唯一id

为了生成一个符合要求的分布式全局ID&#xff0c;我们可以使用 StringRedisTemplate 来实现。这个ID由三部分组成&#xff1a; 符号位&#xff08;1 bit&#xff09;&#xff1a;始终为0&#xff0c;表示正数。时间戳&#xff08;31 bit&#xff09;&#xff1a;表示从某个起始…...

pytorch自定义算子导出onnx

文章目录 1、为什么要自定义算子&#xff1f;2、如何自定义算子3、自定义算子导出onnx4、example1、重写一个pytorch 自定义算子&#xff08;实现自定义激活函数&#xff09;2、现有算子上封装pytorch 自定义算子&#xff08;实现动态放大超分辨率模型&#xff09; 1、为什么要…...

从搭建uni-app+vue3工程开始

技术栈 uni-app、vue3、typescript、vite、sass、uview-plus、pinia、axios 一、项目搭建 1、创建以 typescript 开发的工程 npx degit dcloudio/uni-preset-vue#vite-ts my-vue3-project2、安装sass npm install -D sass// 安装sass-loader&#xff0c;注意需要版本10&…...

波点音乐自动点击

波点音乐 import uiautomator2 as u2 import time import sys import os# 动态点击时间&#xff0c;打印剩余时间 def dynamic_sleep(seconds):wait_time secondsfor i in range(wait_time):print(f"Waiting... {wait_time - i} seconds remaining")sys.stdout.flu…...

【一篇搞定配置】wget 下载与安装(Window)

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;各种软件安装与配置_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 1.…...

2025年春招修订版《C/C++笔面试系列》(1) C语言经典笔面试题(上)

C语言是嵌入式开发的常用语言&#xff0c;也是主要语言&#xff0c;很多企业在招聘嵌入式软件工程师时&#xff0c;C语言的熟练程度是一个重要考察点。笔试也是以C语言为主&#xff0c;所以想要拿到面试机会&#xff0c;还得通过C语言笔试&#xff0c;本专题总结了各大企业C语言…...

【042C】基于51RFID门禁系统(LCD12864显示)【Proteus仿真+Keil程序+报告+原理图】

☆、设计硬件组成&#xff1a;51单片机最小系统RFID读卡器4*4矩阵键盘AT24C02存储芯片LCD12864液晶显示继电器蜂鸣器LED灯。 1、设计采用STC89C52、AT89C52、AT89S52作为主控芯片&#xff0c;采用LCD12864液晶显示屏实时显示门禁系统&#xff1b; 2、系统集成两种解锁方式&am…...

scratch二次开发:blockly工作区垃圾桶和进度条的隐藏和显示

大家好&#xff0c;我是小黄。 本期给大家介绍的内容是实现blockly工作区的垃圾桶和进度条的显示和隐藏实现。 本次基于的项目源码大家可以关注小黄回复垃圾桶自行获取。 一.垃圾桶的显示和实现。 在blockly中&#xff0c;我们进行块的删除的时候最常用的两种方法是&#xf…...

【STM32】MPU6050初始化常用寄存器说明及示例代码

一、MPU6050常用配置寄存器 1、电源管理寄存器1&#xff08; PWR_MGMT_1 &#xff09; 此寄存器允许用户配置电源模式和时钟源。 DEVICE_RESET &#xff1a;用于控制复位的比特位。设置为1时复位 MPU6050&#xff0c;内部寄存器恢复为默认值&#xff0c;复位结束…...

LDR6020驱动的Type-C接口显示器解决方案

一、引言 随着科技的飞速发展&#xff0c;Type-C接口凭借其高速数据传输、强大的电力传输能力以及便捷的正反可插设计&#xff0c;正逐渐成为现代电子设备的主流接口标准。在显示器领域&#xff0c;Type-C接口的引入不仅简化了线缆连接&#xff0c;还为用户带来了更丰富的功能…...

Spring Boot + Android 实现登录功能

在移动互联网的今天&#xff0c;许多应用需要通过移动端实现与服务器的交互功能&#xff0c;其中登录是最常见且基础的一种功能。通过登录&#xff0c;用户可以获得独特的身份标识&#xff0c;从而访问特定的资源或服务。本篇博客将详细介绍如何使用 Spring Boot 和 Android 实…...

【通俗理解】边际化技巧在概率论中的应用——从公式到实例

【通俗理解】边际化技巧在概率论中的应用——从公式到实例 关键词提炼 #边际化技巧 #概率论 #联合概率 #条件概率 #积分计算 #概率分布 #贝叶斯推断 第一节&#xff1a;边际化技巧的类比与核心概念【尽可能通俗】 边际化技巧&#xff0c;就像是你在一个复杂的概率迷宫中&am…...

Chen_AdaMV-MoE_Adaptive_Multi-Task_Vision_Mixture-of-Experts 译文

摘要 稀疏激活的专家混合&#xff08;MoE&#xff09;正在成为多任务学习&#xff08;MTL&#xff09;的一个有前途的范例。 MoE 不是将多个任务的知识压缩到单个模型中&#xff0c;而是分离参数空间&#xff0c;仅利用给定任务类型及其输入的相关模型片段&#xff0c;从而提供…...

多线程下使用数据库 - 20241124

问题 并发性较低&#xff0c;每秒千次但是较高一致性&#xff0c;比如利用数据库中的数据进行判断是否执行某个操作 存在的问题是&#xff0c;如何只锁定判断相关的数据&#xff0c;而不影响数据库操作无关数据。脏读/不可重复读/幻读 解决方案 利用数据InnoDB引擎的LBCC和…...

GMAN解读(论文+代码)

一、注意力机制 注意力机制与传统的卷积神经网络不同的是&#xff0c;前者擅长捕获全局依赖和长程关系&#xff0c;权重会动态调整。而后者对于所有特征都使用同一个卷积核。关于更多注意力机制内容&#xff0c;详见&#xff1a; 注意力机制、自注意力机制、多头注意力机制、通…...

《文件操作》

一 . 文本文件和二进制文件 根据数据的组织形式&#xff0c;数据文件被分为了二进制文件和文本文件 数据在内存中是以二进制的形式存储&#xff0c;如果不加转换的输出到外存的文件中&#xff0c;就是二进制文件。 如果要求在外存上以ASCII 码的形式存储&#xff0c;则需要再存…...

【君正T31开发记录】8.了解rtsp协议及设计模式

前边搞定了驱动&#xff0c;先不着急直接上手撸应用层的代码&#xff0c;先了解一下大致要用到的东西。 设计PC端先用vlc rtsp暂时H264编码&#xff08;vlc好像不支持h265,这个后边我试试&#xff09;的视频流&#xff0c;先需要支持上rtsp server&#xff0c;了解rtsp协议是必…...

C++菜鸟教程 - 从入门到精通 第三节

上节课的题 上节课的题,大家都做出来了吗? 看一下这道题: 题目描述 N!1*2*...*N; 例5!1*2*3*4*5120. 编程求1!2!3!...N!. 输入 输入一行&#xff0c;只有一个整数n (1<n<10) 输出 输出只有一行&#xff08;这意味着末尾有一个回车符号&#xff09;&#xff0c;包括1…...

原生JS和CSS,HTML实现开屏弹窗

开屏弹窗常应用于打开游戏&#xff0c;或者打开网站的时候&#xff0c;跳出来在正中间&#xff0c;来显示一些信息&#xff0c;并可以设置今日不再显示 CSS代码如下 <style>#box {width: 100vw;height: 100vh;background-color: rgba(0, 0, 0, 0.2);position: relative…...

微软发布Win11 24H2系统11月可选更新KB5046740!

系统之家11月22日报道&#xff0c;微软针对Win11 24H2系统推出2024年11月最新可选更新补丁KB5046740&#xff0c;更新后系统版本后升至26100.2454&#xff0c;此次更新后修复当应用程序以PDF和XLSX格式导出图表对象时停止响应、无法使用API查找旋转信息等问题。以下小编将给大家…...

【Rabbitmq篇】高级特性----TTL,死信队列,延迟队列

目录 一.TTL 1.设置消息的TTL 2.设置队列的TTL 3.俩者区别 二.死信队列 定义&#xff1a; 消息成为死信的原因&#xff1a; 1.消息被拒绝&#xff08;basic.reject 或 basic.nack&#xff09; 2.消息过期&#xff08;TTL&#xff09; 3.队列达到最大长度 ​编辑 …...

【Linux】gcc/g++使用

编译 我们知道&#xff0c;gcc只能编译C&#xff0c;g既能编译C&#xff0c;也能编译C。 由于两者的选项是相同的&#xff0c;这里我们使用gcc来说明。 这就是一个我们在linux中gcc编译一段代码后会自动生成一个a.out为名的可执行文件&#xff0c;然后我们./a.out&#xff0c…...

IDEA2023 SpringBoot整合MyBatis(三)

一、数据库表 CREATE TABLE students (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(100) NOT NULL,age INT,gender ENUM(Male, Female, Other),email VARCHAR(100) UNIQUE,phone_number VARCHAR(20),address VARCHAR(255),date_of_birth DATE,enrollment_date DATE,cours…...

Java网络编程 - cookiesession

cookie 之前学习了 Okhttp3 库可以调用API、抓取网页、下载文件。但是这些操作都是不要求登录的&#xff0c;如果 API、网页、文件等内容要求登录才能访问&#xff0c;就需要学习新的 cookie 相关的知识。 下面以豆瓣为例&#xff0c;使用 Java 程序读取“我的豆瓣”页面内容…...

100.【C语言】数据结构之二叉树的堆实现(顺序结构) 1

目录 1.顺序结构 2.示意图 ​编辑 从物理结构还原为逻辑结构的方法 3.父子节点编号的规律 4.顺序存储的前提条件 5.堆的简介 堆的定义 堆的两个重要性质 小根堆和大根堆 6.堆的插入 7.堆的实现及操作堆的函数 堆的结构体定义 堆初始化函数HeapInit 堆插入元素函…...

《Python基础》之循环结构

目录 简介 一、for循环 1、基本语法与作用 2、使用 range() 函数配合 for 循环 3、嵌套的for循环 二、while循环 1、基本语法与作用 2、while 循环嵌套 &#xff08;1&#xff09;、while循环与while循环嵌套 &#xff08;2&#xff09;、while循环与for循环嵌套 简介 …...

使用JDBC操作数据库

文章目录 使用JDBC操作数据库1. JDBC访问数据库步骤2. Statement与PreparedStatement区别3. JDBC的内容4. JDBC封装4.1 为什么进行JDBC封装4.2 实现JDBC封装4.3 什么是DAO4.4 配置数据库访问参数4.5 配置数据库连接池使用之JNDI的方式 5. 单例模式5.1 懒汉模式5.2 饿汉模式 使用…...

轻松解析 PDF 文档:深入了解 Python 的 pdfplumber 库

轻松解析 PDF 文档&#xff1a;深入了解 Python 的 pdfplumber 库 PDF 是一种常见的文件格式&#xff0c;广泛用于报告、文档、表单等领域。然而&#xff0c;如何高效解析 PDF 内容&#xff08;尤其是文本和表格&#xff09;&#xff0c;一直是开发者面临的挑战。pdfplumber 是…...

实验五 时域采样与频域采样

时域采样理论的验证 【实例3-1】近似绘制x (n) R4n 在(0,2 π \pi π ) 上的幅频响应曲线( F T [ x ( n ) ] FT[x(n)] FT[x(n)] )。 x [1, 1, 1, 1]; N 64; xk fft(x, N); figure; subplot(2, 1, 1); stem(0:3, x, .); subplot(2, 1, 2); k 0:N-1; plot(2*k/N, abs(x…...

爬虫cookie反爬------加速乐(jsl)

加速乐 反爬虫技术&#xff1a;加速乐采用了包括OB混淆、动态加密算法和多层Cookie获取等高级反爬虫技术&#xff0c;确保整体校验的严密性。关键校验字段位于Cookie中的 __jsl_clearance_s&#xff0c;其验证过程通常涉及三次关键的请求&#xff0c;有效抵御恶意爬虫的侵扰。…...

设计模式——解释器模式

定义&#xff1a; 解释器模式是一种行为设计模式&#xff0c;它给定一个语言&#xff0c;定义它的文法的一种表示&#xff0c;并定义一个解释器&#xff0c;这个解释器使用该表示来解释语言中的句子。在这种模式中&#xff0c;通常会将一个复杂的表达式&#xff08;如数学表达…...

sorted()函数

sorted(iterable, keyNone, reverseFalse)iterable: 需要排序的可迭代对象&#xff08;如列表、元组、字符串等&#xff09;。 key: 一个函数&#xff0c;用于从每个元素中提取排序的依据。如果未指定&#xff0c;默认直接比较元素本身。 reverse: 一个布尔值&#xff0c;Tru…...

动静态分析

静态分析 获取哈希值&#xff1a; 查壳&#xff1a; 导出函数&#xff1a; 获取资源信息&#xff1a; 通过发现dos头和pe头&#xff0c;来确定它是个可执行程序。 动态分析...

2024年信号处理与神经网络应用国际学术会议(SPNNA 2024)

重要信息 会议时间&#xff1a;2024年12月13-15日 会议地点&#xff1a;中国武汉 会议官网&#xff1a;www.spnna.org 会议简介 2024年信号处理与神经网络应用国际学术会议&#xff08;SPNNA 2024&#xff09;将于2024年12月13日至15日在中国武汉召开。本次会议旨在为全球研…...

winfrom快速自适应

在软件界面设计中&#xff0c;我们通常需要添加各种布局器和规则来实现界面布局&#xff0c;但对于不太熟练的工程师来说&#xff0c;这可能存在一定难度。这里要分享一种自适应布局的方法&#xff0c;它可以根据界面比例自动缩放内容控件&#xff0c;在较短时间内完成软件布局…...

VMware16安装macOS12【详细教程】

因为在应用上线IOS应用商店时&#xff0c;需要用到mac系统进行&#xff0c;于是就在VMware16pro虚拟机进行安装macOS12系统&#xff0c;安装的过程做了一个记录&#xff0c;希望对你有所帮助&#xff01; 前言 首先需要下载好下面工具&#xff1a; VMware workstation pro 16…...

【设计模式】【创建型模式(Creational Patterns)】之单例模式

单例模式是一种常用的创建型设计模式&#xff0c;其目的是确保一个类只有一个实例&#xff0c;并提供一个全局访问点。 单例模式的原理 单例模式的核心在于控制类的实例化过程&#xff0c;通常通过以下方式实现&#xff1a; 私有化构造函数&#xff0c;防止外部直接实例化。…...

【1.2 Getting Started--->Installation Guide】

NVIDIA TensorRT DOCS 此 NVIDIA TensorRT 10.6.0 安装指南提供安装要求、TensorRT 包中包含的内容列表以及安装 TensorRT 的分步说明。 安装指南 摘要&#xff1a; 本 NVIDIA TensorRT 10.3.0 安装指南提供了安装要求、TensorRT 软件包中包含的内容列表以及安装 TensorRT 的…...

Vue 中 data 属性为函数的深度剖析:原理、区别与实践

在 Vue.js 中,data 属性通常是一个 函数 而不是一个对象,这背后有一系列设计上的原因和原理,尤其是与 Vue 的组件系统、实例化机制、以及响应式数据的管理有关。下面我将详细解答这个问题,并结合实际项目示例和代码分析,进行全面讲解。 1. Vue 中 data 为什么是一个函数而…...

【漏洞复现】H3C 用户自助服务平台 dynamiccontent.properties.xhtml 远程命令执行

免责声明: 本文旨在提供有关特定漏洞的信息,以帮助用户了解潜在风险。发布此信息旨在促进网络安全意识和技术进步,并非出于恶意。读者应理解,利用本文提到的漏洞或进行相关测试可能违反法律或服务协议。未经授权访问系统、网络或应用程序可能导致法律责任或严重后果…...

【技术支持】vscode不使用插件,两种方式重命名html标签对

1. 使用 VS Code 内置功能 VS Code 内置支持 HTML/XML 标签对的重命名功能。步骤如下&#xff1a; 将光标放置在标签名上&#xff08;如 <div> 或</div>&#xff09;。按下快捷键 F2&#xff08;重命名符号&#xff09;。输入新的标签名&#xff0c;按 Enter&…...

【Seed-Labs 2.0】The Kaminsky Attack Lab

说在前面 本实验属为Seed-Labs 的DNS LAB 中的第二个实验&#xff0c;是第一个实验的延伸&#xff0c;从攻击者和受害者同一个LAN中变成不在同一个LAN中&#xff0c;该系列一共有五个实验: Local DNS Attack LabThe Kaminsky Attack LabDNS Rebinding Attack LabDNS Infrastr…...

node.js中使用express.static()托管静态资源

express.static()定义 express.static(root, [options])是一个中间件函数&#xff0c;负责为Express应用提供静态资源服务。它允许你指定一个或多个目录作为静态资源的根目录&#xff0c;当客户端请求这些资源时&#xff0c;Express会查找并返回对应的文件。 安装express npm i…...