python 整合excel_python EXcel表整合(自动办公)

收到任务,方便领导快速查看每个人的日程安排。比如每个工程师都有一个自己的表格记录自己的日程安排,领导查看每个人的日程安排需要一一打开所有工程师的日程安排表才能知道每个人的信息,而且非常不直观。

这里介绍下利用python解决实际办公问题:

这里用到pandas 库处理Excel,pyqt5做图形界面方便使用操作。

pyqt界面代码:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'FSE.ui'

#

# Created by: PyQt5 UI code generator 5.10

#

# WARNING! All changes made in this file will be lost!

from PyQt5 import QtCore, QtGui, QtWidgets

from read_excel import *

from PyQt5.QtWidgets import *

import sys

import threading

from PyQt5.QtCore import *

import image_rc

class Ui_WB(QWidget):

signal = pyqtSignal(str, str)

def setupUi(self, WB):

WB.setObjectName("WB")

WB.resize(420, 239)

icon = QtGui.QIcon()

icon.addPixmap(QtGui.QPixmap(":/icon/SKF.ico"), QtGui.QIcon.Normal, QtGui.QIcon.Off)

WB.setWindowIcon(icon)

self.mainwindows = WB

self.centralwidget = QtWidgets.QWidget(WB)

self.signal.connect(self.show_Message)

self.centralwidget.setObjectName("centralwidget")

self.horizontalLayout = QtWidgets.QHBoxLayout(self.centralwidget)

self.horizontalLayout.setObjectName("horizontalLayout")

self.gridLayout = QtWidgets.QGridLayout()

self.gridLayout.setObjectName("gridLayout")

self.lineEdit_4 = QtWidgets.QLineEdit(self.centralwidget)

self.lineEdit_4.setMaximumSize(QtCore.QSize(16777215, 16777215))

self.lineEdit_4.setObjectName("lineEdit_4")

self.gridLayout.addWidget(self.lineEdit_4, 1, 1, 1, 1, QtCore.Qt.AlignLeft)

self.label_5 = QtWidgets.QLabel(self.centralwidget)

self.label_5.setObjectName("label_5")

self.gridLayout.addWidget(self.label_5, 0, 0, 1, 1, QtCore.Qt.AlignRight)

self.dateEdit_4 = QtWidgets.QDateEdit(self.centralwidget)

self.dateEdit_4.setMaximumSize(QtCore.QSize(120, 16777215))

self.dateEdit_4.setDateTime(QtCore.QDateTime(QtCore.QDate(2020, 12, 31), QtCore.QTime(0, 0, 0)))

self.dateEdit_4.setObjectName("dateEdit_4")

self.gridLayout.addWidget(self.dateEdit_4, 3, 1, 1, 1, QtCore.Qt.AlignLeft)

self.label_6 = QtWidgets.QLabel(self.centralwidget)

self.label_6.setObjectName("label_6")

self.gridLayout.addWidget(self.label_6, 1, 0, 1, 1, QtCore.Qt.AlignRight)

self.pushButton_4 = QtWidgets.QPushButton(self.centralwidget)

self.pushButton_4.setMaximumSize(QtCore.QSize(20, 20))

self.pushButton_4.setObjectName("pushButton_4")

self.gridLayout.addWidget(self.pushButton_4, 0, 2, 1, 1, QtCore.Qt.AlignLeft)

self.dateEdit_3 = QtWidgets.QDateEdit(self.centralwidget)

self.dateEdit_3.setMaximumSize(QtCore.QSize(120, 16777215))

self.dateEdit_3.setDateTime(QtCore.QDateTime(QtCore.QDate(2020, 1, 1), QtCore.QTime(0, 0, 0)))

self.dateEdit_3.setObjectName("dateEdit_3")

self.gridLayout.addWidget(self.dateEdit_3, 2, 1, 1, 1, QtCore.Qt.AlignLeft)

self.pushButton_5 = QtWidgets.QPushButton(self.centralwidget)

self.pushButton_5.setMaximumSize(QtCore.QSize(20, 20))

self.pushButton_5.setObjectName("pushButton_5")

self.gridLayout.addWidget(self.pushButton_5, 1, 2, 1, 1, QtCore.Qt.AlignLeft)

self.label_8 = QtWidgets.QLabel(self.centralwidget)

self.label_8.setObjectName("label_8")

self.gridLayout.addWidget(self.label_8, 3, 0, 1, 1, QtCore.Qt.AlignRight)

self.lineEdit_3 = QtWidgets.QLineEdit(self.centralwidget)

self.lineEdit_3.setObjectName("lineEdit_3")

self.gridLayout.addWidget(self.lineEdit_3, 0, 1, 1, 1, QtCore.Qt.AlignLeft)

self.label_7 = QtWidgets.QLabel(self.centralwidget)

self.label_7.setObjectName("label_7")

self.gridLayout.addWidget(self.label_7, 2, 0, 1, 1, QtCore.Qt.AlignRight)

self.pushButton_6 = QtWidgets.QPushButton(self.centralwidget)

self.pushButton_6.setObjectName("pushButton_6")

self.gridLayout.addWidget(self.pushButton_6, 4, 1, 1, 1, QtCore.Qt.AlignHCenter)

self.horizontalLayout.addLayout(self.gridLayout)

WB.setCentralWidget(self.centralwidget)

self.statusbar = QtWidgets.QStatusBar(WB)

self.statusbar.setObjectName("statusbar")

WB.setStatusBar(self.statusbar)

self.retranslateUi(WB)

QtCore.QMetaObject.connectSlotsByName(WB)

def retranslateUi(self, WB):

_translate = QtCore.QCoreApplication.translate

WB.setWindowTitle(_translate("WB", "WB"))

self.label_5.setText(_translate("WB", "文件源:"))

self.label_6.setText(_translate("WB", "输出地址:"))

self.pushButton_4.setText(_translate("WB", "..."))

self.pushButton_5.setText(_translate("WB", "..."))

self.label_8.setText(_translate("WB", "结束时间:"))

self.label_7.setText(_translate("WB", "起始时间:"))

self.pushButton_6.setText(_translate("WB", "开始输出"))

self.click_event()

def click_event(self):

self.pushButton_5.clicked.connect(

lambda: self.search_path(2))

self.pushButton_4.clicked.connect(

lambda: self.search_path(1))

self.pushButton_6.clicked.connect(self.output)

def threading_event(self):

t = threading.Thread(target=self.output) # 创建线程

t.setDaemon(True) # 设置为后台线程,这里默认是False,设置为True之后则主线程不用等待子线程

t.start() # 开启线程

def output(self):

# 使用:

try:

input_path = self.lineEdit_3.text()

output_path = self.lineEdit_4.text()

if input_path == '' or output_path == '':

self.signal.emit('提示', "请输入完整路径!")

return

filename_list = get_file_name_list(input_path)

data_df = pd.DataFrame()

for file_name in filename_list:

try:

print(file_name)

datadf = read_excel(file_name)

data_df = data_df.append(datadf)

# data_df = pd.merge(data_df, datadf)

except Exception as e:

print(e)

print(data_df)

# start_date = datetime(2020, 8, 1)

# end_date = datetime(2020, 8, 26)

start_date = self.dateEdit_3.date().toPyDate()

end_date = self.dateEdit_4.date().toPyDate()

if end_date < start_date:

self.signal.emit('提示', "请输入正确的时间段!!!")

else:

write_data(output_path, data_df, start_date, end_date)

self.signal.emit('提示', "输出成功!!!")

except Exception as e:

self.signal.emit('提示', "输出失败!!!\n" + '原因:' +str(e))

print(e)

def search_path(self,tag):

try:

directory = QFileDialog.getExistingDirectory(self.mainwindows, "选择路径", "",QFileDialog.DontUseNativeDialog)

directory = QFileDialog.geto

# 当窗口非继承QDialog时,self可替换成 None

if tag == 1:

if type(directory) == tuple:

self.lineEdit_3.setText(directory[0])

else:

self.lineEdit_3.setText(directory)

else:

if type(directory) == tuple:

self.lineEdit_4.setText(directory[0])

else:

self.lineEdit_4.setText(directory)

except Exception as e:

print(e)

def show_Message(self,title,content):

QMessageBox.about(self.mainwindows, title, content)

if __name__ =='__main__':

app = QtWidgets.QApplication(sys.argv)

MainWindow = QtWidgets.QMainWindow()

ui = Ui_WB()

ui.setupUi(MainWindow)

MainWindow.show()

sys.exit(app.exec_())

读取Excel信息(read_excel.py):

from write_excel import *

def get_file_name_list(file_dir):

'''

:brief:获取文件夹下内,所有文件

:param file_dir:文件夹目录

:return: 文件列表

'''

root = ''

dirs = ''

files = ''

for root,dirs,files in os.walk(file_dir):

break

file_list = []

for file in files:

file_path = (os.path.join(root, file))

file_list.append(file_path)

return file_list

def read_excel(path):

try:

pd.set_option('display.max_columns', None)

# 显示所有行

pd.set_option('display.max_rows', None)

data = pd.read_excel(path, sheet_name = 0)

# for index, row in data.iterrows():

# print(row)

# print(data)

return data

except Exception as e:

print(e)

生成新Excel输出(write_excel.py)

import pandas as pd

from datetime import datetime,timedelta

from colum_to_name import column_to_name

import os

def write_data(path,input_df,start_date,end_date):

start_date = datetime.combine(start_date, datetime.min.time())

end_date = datetime.combine(end_date, datetime.min.time())

start_date_str = start_date.strftime('%Y%m%d')

end_date_str = end_date.strftime('%Y%m%d')

# print(start_date_str,end_date_str)

days = pd.date_range(start_date_str, end_date_str, freq='1D')

# print(days.tolist())

date_list = days.tolist()

columns = []

weeks = []

for dateTime in date_list:

# print(type(dateTime))

date1 = dateTime.to_pydatetime()

# print(type(date1))

columns.append(date1.strftime("%y/%m/%d"))

# print(date1.weekday())

week_day = {

0: '星期一',

1: '星期二',

2: '星期三',

3: '星期四',

4: '星期五',

5: '星期六',

6: '星期日',

}

weeks.append(week_day[date1.weekday()])

name = ['星期']

df1 = pd.DataFrame(index=name,columns = columns) # 随机生成一个DataFrame 数据

for index,colums in enumerate(df1.columns):

# print(index,colums)

df1.loc['星期', colums] = weeks[index]

# print(df1)

t = datetime.now().date() - timedelta(days=1)

path = (os.path.join(path, ('FSE scheduling%d%02d%02d.xlsx' % (t.year, t.month, t.day))))

writer = pd.ExcelWriter(path)

workbook = writer.book

fmt = workbook.add_format({"font_name": u"微软雅黑"})

percent_fmt = workbook.add_format({'num_format': '0.00%'})

red_format = workbook.add_format({'bg_color': 'red'})

red_format2 = workbook.add_format({'bg_color': '#FFC0CB'})

yellow_format1 = workbook.add_format({'bg_color': '#FF8247'})

yellow_format2 = workbook.add_format({'bg_color': '#FFFACD'})

green_format1 = workbook.add_format({'bg_color': '#90EE90'})

green_format2 = workbook.add_format({'bg_color': '#7FFFD4'})

# 填充图案样式

patternType1 = workbook.add_format({'pattern': 2})

patternType3 = workbook.add_format({'pattern': 3})

patternType4 = workbook.add_format({'pattern': 4})

patternType5 = workbook.add_format({'pattern': 5})

patternType6 = workbook.add_format({'pattern': 6})

patternType7 = workbook.add_format({'pattern': 7})

patternType8 = workbook.add_format({'pattern': 8})

patternType9 = workbook.add_format({'pattern': 9})

patternType10 = workbook.add_format({'pattern': 10})

patternType11= workbook.add_format({'pattern': 11})

patternType12 = workbook.add_format({'pattern': 12})

patternType13 = workbook.add_format({'pattern': 13})

patternType14 = workbook.add_format({'pattern': 14})

border_format = workbook.add_format({'border': 1})

note_fmt = workbook.add_format(

{'bold': True, 'font_name': u'微软雅黑', 'font_color': 'red', 'align': 'left', 'valign': 'vcenter'})

date_fmt = workbook.add_format({'bold': False, 'font_name': u'微软雅黑', 'num_format': 'yyyy-mm-dd'})

date_fmt1 = workbook.add_format(

{'bold': True, 'font_size': 10, 'font_name': u'微软雅黑', 'num_format': 'yyyy-mm-dd', 'bg_color': '#9FC3D1',

'valign': 'vcenter', 'align': 'center'})

highlight_fmt = workbook.add_format({'bg_color': '#FFD7E2', 'num_format': '0.00%'})

for index, row in input_df.iterrows():

# print(row)

# print(type(row['计划开始时间']))

try:

date1 = (row['计划开始时间']).to_pydatetime()

date2 = (row['计划结束时间']).to_pydatetime()

if date1 > end_date or date2 < start_date:

continue

elif date1 < start_date and date2 >= start_date:

date1 = start_date

elif date1 <= end_date and date2 > end_date:

date2 = end_date

else:

pass

colum = date1.strftime("%y/%m/%d")

df1.loc[row['姓名'], colum] = row['地点'] + '-' + row['服务类型'] + '-' + row['客户']

except Exception as e:

print(e)

rows_list = (df1._stat_axis.values.tolist())

df = df1

l_end = len(df.index) + 1 # 表格的行数,便于下面设置格式

df.to_excel(writer, sheet_name=u'测试页签', encoding='utf8', header=True, index=True)

worksheet1 = writer.sheets[u'测试页签']

for index, row in input_df.iterrows():

try:

date1 = (row['计划开始时间']).to_pydatetime()

date2 = (row['计划结束时间']).to_pydatetime()

if date1 > end_date or date2 < start_date:

continue

elif date1 < start_date and date2 >= start_date:

date1 = start_date

elif date1 <= end_date and date2 > end_date:

date2 = end_date

else:

pass

colum_num = (date1 - start_date).days + 2

column_name_start = column_to_name(colum_num)

if date2 > end_date:

date2 = end_date

colum_num = (date2 - start_date).days + 2

column_name_end = column_to_name(colum_num)

# colum = date1.strftime("%y/%m/%d")

row1 = rows_list.index(row['姓名']) + 2

worksheet1.conditional_format('{}{}:{}{}'.format(column_name_start,row1,column_name_end,row1), {'type': 'no_blanks', 'format': green_format2})

worksheet1.conditional_format('{}{}:{}{}'.format(column_name_start, row1, column_name_end, row1),

{'type': 'blanks', 'format': green_format2})

date1 = (row['实际开始时间']).to_pydatetime()

date2 = (row['实际结束时间']).to_pydatetime()

if date1 > end_date or date2 < start_date:

continue

elif date1 < start_date and date2 >= start_date:

date1 = start_date

elif date1 <= end_date and date2 > end_date:

date2 = end_date

else:

pass

colum_num2 = (date1 - start_date).days + 2

column_name_start2 = column_to_name(colum_num2)

colum_num2 = (date2 - start_date).days + 2

column_name_end2 = column_to_name(colum_num2)

worksheet1.conditional_format('{}{}:{}{}'.format(column_name_start2, row1, column_name_end2, row1),

{'type': 'no_blanks', 'format': patternType14})

worksheet1.conditional_format('{}{}:{}{}'.format(column_name_start2, row1, column_name_end2, row1),

{'type': 'blanks', 'format': patternType14})

except Exception as e:

print(e)

# for col_num, value in enumerate(df.columns.values):

# worksheet1.write(1, col_num, value, date_fmt1)

# worksheet1.merge_range('A1:B1', u'测试情况统计表', note_fmt)

# 设置列宽

# worksheet1.set_column('B:H%d' % l_end, 30, fmt)

num = (end_date - start_date).days + 2

# print(end_date,start_date)

# print(num)

column_name = column_to_name(num)

# print(column_name)

# worksheet1.set_column('B:H%d' % l_end, 25, fmt)

worksheet1.set_column('B:{}{}'.format(column_name,l_end), 10, fmt)

# 有条件设定表格格式:周六日列

worksheet1.conditional_format('B2:{}{}'.format(column_name,l_end), {'type': 'text', 'criteria': 'containing',

'value': '星期六', 'format': red_format2})

worksheet1.conditional_format('B2:{}{}'.format(column_name, l_end), {'type': 'text', 'criteria': 'containing',

'value': '星期日', 'format': red_format2})

# # 有条件设定表格格式:百分比

# worksheet1.conditional_format('E3:H%d' % l_end,

# {'type': 'cell', 'criteria': '<=', 'value': 0.1, 'format': percent_fmt})

# # 有条件设定表格格式:高亮百分比

# worksheet1.conditional_format('E3:H%d' % l_end,

# {'type': 'cell', 'criteria': '>', 'value': 0.1, 'format': highlight_fmt})

# 加边框

worksheet1.conditional_format('A1:{}{}'.format(column_name,l_end), {'type': 'no_blanks', 'format': border_format})

worksheet1.conditional_format('A1:{}{}'.format(column_name, l_end), {'type': 'blanks','format': border_format})

# 设置日期格式

worksheet1.conditional_format('A3:A62', {'type': 'no_blanks', 'format': date_fmt})

writer.save()

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

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

相关文章

java poi 打开 保存_Java-Apache POI-在DB中读取和存储RTF内容

我们在Java应用程序中有一个新要求,即用户可以上传excel文件.excel文件中的一列将使用粗体,斜体,项目符号,彩色文本等格式.我们需要读取此excel文件并将这些值存储在Oracle DB表中.随后,我们还需要提取这些数据,并保留格式并下载到excel工作表中.我们计划将Apache-poi用于相同的…

Spring循环依赖的三种方式

引言&#xff1a;循环依赖就是N个类中循环嵌套引用&#xff0c;如果在日常开发中我们用new 对象的方式发生这种循环依赖的话程序会在运行时一直循环调用&#xff0c;直至内存溢出报错。下面说一下Spring是如果解决循环依赖的。 第一种&#xff1a;构造器参数循环依赖 Spring容…

python字典统计排序1_python-如何按字典顺序对Counter.mostCommon(n)的...

这里的问题是Counter dict是无序的,并且most_common不在乎键.为此,您需要对字典中的项目进行排序,然后提取最常见的3个项目. counter Counter(abcdef) most_common sorted(counter.items(), keylambda pair: (-pair[1], pair[0])) 这将首先对-pair [1](计数)进行排序.由于出现…

Java最后_Java最后一次总结

前言&#xff1a;最开始我学习了java如何简单编写一小段代码&#xff0c;发现java代码和C语言还是有很多相似的地方&#xff0c;到类与对象之后等等的很多的内容&#xff0c;我觉得还是有很大区别的&#xff0c;java对于c语言来说&#xff0c;显得更为高级及方便&#xff0c;让…

Spring 是如何解决循环依赖的?

1.由同事抛的一个问题开始 最近项目组的一个同事遇到了一个问题&#xff0c;问我的意见&#xff0c;一下子引起的我的兴趣&#xff0c;因为这个问题我也是第一次遇到。平时自认为对spring循环依赖问题还是比较了解的&#xff0c;直到遇到这个和后面的几个问题后&#xff0c;重…

python3自动化软件发布系统_基于python3做C/S端自动化测试可能用到的工具(不断更新中。。。。)...

选择一个合适的框架(库) (1)如果你的c/s端工具界面控件可以被捕获&#xff0c;则可以使用pyautoit,和pywinauto这2个库&#xff0c;附上界面元素捕获小工具(链接&#xff1a;https://pan.baidu.com/s/1_5--ZWsV-oS7r2ORwX7M7g 提取码&#xff1a;o4z5 ) (2)如果界面控件不可以…

java按钮触发另一个页面_前端跨页面通信,你知道哪些方法?

戳蓝字「前端技术优选」关注我们哦&#xff01; 引言在浏览器中&#xff0c;我们可以同时打开多个Tab页&#xff0c;每个Tab页可以粗略理解为一个“独立”的运行环境&#xff0c;即使是全局对象也不会在多个Tab间共享。然而有些时候&#xff0c;我们希望能在这些“独立”的Tab页…

【Java用法】java 8两个List集合取交集、并集、差集、去重并集

在业务的开发过程中会经常用到两个List集合相互取值的情况&#xff0c;于是记录在此&#xff0c;方便后续使用哦~~~ public class ListTest {public static void main(String[] args) {ArrayList<String> listA CollectionUtil.toList("a", "b", &…

java中的列表栈链表_Java数据结构(栈,队列,双链表)

(1)栈package ChapterOne;public class Stack {//栈数组long stackArr[];//栈的大小int maxSize;//栈的顶部int top;//初始化一个大小为size的栈public Stack(int size){maxSize size;stackArr new long[size];top -1;}//出栈操作public long pop(){return stackArr[top--];…

jsonp react 获取返回值_Django+React全栈开发:文章列表

React现在我们有了一个属于文章的API&#xff0c;可以添加、修改、删除、查看文章&#xff0c;但是对于我们的网站来说&#xff0c;还需要一个用户界面才行。现在开始探索一下ReactJS吧。经常听到有前端三大框架Angular、React、Vue的说法&#xff0c;不过React官网对自己的介绍…

24个经典的MySQL索引问题,你都遇到过哪些?

1、什么是索引&#xff1f; 索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分)&#xff0c;它们包含着对数据表里所有记录的引用指针。 索引是一种数据结构。数据库索引&#xff0c;是数据库管理系统中一个排序的数据结构&#xff0c;以协助快速查询、更新数…

java 3 4_Java-3/4_树.md at master · yrcDream/Java-3 · GitHub

树二叉树二叉树具有唯一根节点二叉树每个节点最多有两个孩子&#xff0c;最多有一个父亲二叉树具有天然递归结构二叉树不一定是 “满” 的&#xff1a;一个节点也是二叉树、空节点也是二叉树二叉搜索树(BST)BST 的基本功能public class BST> {private Node root;private int…

python模块导入_python模块导入

不同的执行方式&#xff1a; 从IDE中执行&#xff0c;python程序由IDE设置环境决定。 从系统中执行&#xff0c;python程序由环境变量中的系统变量path决定&#xff0c;从上往下选择。 模块导入顺序&#xff1a; 系统包优先级最高 > 同目录 > sys.path&#xff0c;之所以…

再也不怕SVN冲突:轻松解决SVN冲突

什么时候容易出现冲突&#xff1f; 多个人同时修改了同个文件中的同一行代码 无法进行对比的二进制文件&#xff0c;比如图片等 如何解决冲突&#xff1f; 如上图&#xff0c;test_conflict.py文件发生了冲突&#xff0c;并且多出了几个文件&#xff0c;其中.mine是我本地修…

不删除旧版本java_Linux 卸载旧版jdk 并安装新版jdk(转)

1、查看现有版本java -version2、查看jdk的具体版本rpm –qa| grep jdkrpm –qa| grep gcj3、删除已安装jdk包rpm –e –nodeps jdk包4、再次检查jdk版本&#xff0c;确认是否卸载成功java –version显示结果为&#xff1a;/usr/bin/java:No such file or directory5、手动下载…

手机型号大全_2020值得入手的三款手机。每个优秀,选择哪一个?励志故事名言视频...

如今&#xff0c;手机等数码产品更新很快。各种新的技能&#xff0c;让用户真正体验到科技的力量&#xff0c;它可以被描述为“具有多种功能的一个装置。”然而&#xff0c;这么多车型&#xff0c;难免有些人不知道如何选择。当4G和5G手机**的对峙&#xff0c;很多朋友也问小中…

AspectJ

Aspectj与Spring AOP比较 XML配置方式 <aop:aspect>&#xff1a; 定义切面, 包括通知和切点. 是一般的bean//定义切面 public class SleepHelperAspect{public void beforeSleep(){System.out.println("睡觉前要脱衣服&#xff01;");}public void afterSleep…

aixs1 生成java代码_通过axis1.4 来生成java客户端代码

1.首先下载axis-1.4所有的jar包&#xff0c;2.我是直接打开cmd&#xff0c;进入到该jar包的目录下&#xff0c;3.直接运行命令(运行这个命令之前要确定java的环境变量都已配置好)&#xff1a;java -Djava.ext.dirs${lib的目录} org.apache.axis.wsdl.WSDL2Java -o${代码输出路径…

windows分屏_windows内到底藏了多少好东西?

恭喜!点开这篇文章&#xff0c;你将解锁 WIN10 系统内那些不为人知的高效的冷知识&#xff01;相信所有的职场人都会搜索过这样的问题&#xff1a;有哪些高效的办公神器&#xff1f;在之前的文章中&#xff0c;我分享过很多高效神器&#xff0c;如果你感兴趣的话&#xff0c;点…

@Aspect中@Pointcut 12种用法

本文主要内容&#xff1a;掌握Pointcut的12种用法。 Aop相关阅读 阅读本文之前&#xff0c;需要先掌握下面3篇文章内容&#xff0c;不然会比较吃力。 Spring系列第15篇&#xff1a;代理详解&#xff08;java动态代理&CGLIB代理)Spring系列第30篇&#xff1a;jdk动态代理…