日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

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

發布時間:2025/3/12 python 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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()

總結

以上是生活随笔為你收集整理的python 整合excel_python EXcel表整合(自动办公)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲乱色 | 密臀av在线播放 | 欧美性大战久久久久久久 | 成人av高清 | 羞羞的网站在线观看 | 在线观看的网站 | 五月婷婷激情网 | 欧美一区二区三区激情视频 | 骚虎tv| 天天搞夜夜 | 久热精品免费视频 | 国产免费一级片 | 国产精品无码av在线有声小说 | 成人高潮视频 | 97少妇| 天天干天天日 | 韩日精品中文字幕 | 人人妻人人澡人人爽欧美一区 | 国产黄色大片视频 | 4438色| 午夜精品偷拍 | 日韩精品aaa | 绝顶高潮合集videos | 色婷婷激情 | 天天有av | 亚洲精品成| 国产精品久久久久影院 | 91大片在线观看 | 精品视频在线观看免费 | 日本污视频在线观看 | aa亚洲| 爱蜜臀av | 毛片在线免费 | a√天堂资源| 国产三级国产精品 | 久久福利视频导航 | 国产影视一区二区 | 日韩啊啊啊 | 少妇福利在线 | 麻豆国产尤物av尤物在线观看 | 操皮视频 | av首页在线 | 波多野结衣一本 | 日日夜夜草 | 五月婷婷丁香在线 | 成人福利午夜 | 热热色原网址 | 欧美毛片在线观看 | 销魂奶水汁系列小说 | 美女扒开屁股让男人桶 | 日本黄色三级网站 | 国产在线日本 | 欧美日韩亚洲国产 | 成人爽a毛片一区二区免费 日本高清免费看 | 操天天 | 色多多入口 | 亚洲无色 | 天天插天天搞 | 亚洲不卡影院 | 超碰天天操 | 欧美brazzers | 又大又粗欧美黑人aaaaa片 | 欧美顶级metart裸体全部自慰 | 九九九九国产 | 久久久久成人片免费观看蜜芽 | 奇米影视狠狠 | av免费一区 | 99热| 五十路黄色片 | 四虎久久久 | 特级做a爱片免费69 少妇第一次交换又紧又爽 亚洲大胆人体 | 成人av高清在线观看 | 日本在线天堂 | 国产一级淫 | 99插插插 | 操日本老太太 | 久草91 | 午夜免费视频观看 | 成人高清视频免费观看 | 91人人干| 中文字幕在线视频网 | 福利在线一区二区三区 | 欧美黄色大片视频 | 深夜影院深a| 特大黑人巨交吊性xx | www.国产黄色 | 日本公与丰满熄 | 色一情一伦一子一伦一区 | 国产女主播av | 国产欧美中文字幕 | 97影音| 午夜性福利视频 | 久久亚洲一区二区三区四区 | 精品一区二区毛片 | a毛片基地 | 免费看亚洲 | 日本精品一二区 | 国产成人精品免高潮在线观看 | 国产99久久久国产精品 |