feat: 输出新统计表

This commit is contained in:
caoqianming 2023-11-16 08:38:46 +08:00
parent abf9267d08
commit 4f7d543ff3
9 changed files with 497 additions and 135 deletions

BIN
favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

170
main.ui
View File

@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>600</width>
<height>830</height>
<height>850</height>
</rect>
</property>
<property name="sizePolicy">
@ -19,21 +19,21 @@
<property name="minimumSize">
<size>
<width>600</width>
<height>830</height>
<height>850</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>600</width>
<height>830</height>
<height>850</height>
</size>
</property>
<property name="windowTitle">
<string>中国建材总院宣传工作信息化管理平台</string>
<string>中国建材总院信息统计平台</string>
</property>
<property name="windowIcon">
<iconset>
<normaloff>start.ico</normaloff>start.ico</iconset>
<normaloff>favicon.ico</normaloff>favicon.ico</iconset>
</property>
<property name="autoFillBackground">
<bool>false</bool>
@ -64,7 +64,7 @@
<x>10</x>
<y>280</y>
<width>191</width>
<height>91</height>
<height>81</height>
</rect>
</property>
<property name="font">
@ -127,7 +127,7 @@
<property name="geometry">
<rect>
<x>10</x>
<y>540</y>
<y>510</y>
<width>581</width>
<height>121</height>
</rect>
@ -323,9 +323,9 @@
<widget class="QLabel" name="label_9">
<property name="geometry">
<rect>
<x>150</x>
<x>390</x>
<y>0</y>
<width>291</width>
<width>211</width>
<height>31</height>
</rect>
</property>
@ -341,7 +341,7 @@
<string notr="true">color:white;</string>
</property>
<property name="text">
<string>中国建材总院宣传工作信息化管理平台</string>
<string>中国建材总院信息统计平台</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
@ -356,7 +356,7 @@
<x>220</x>
<y>280</y>
<width>371</width>
<height>251</height>
<height>231</height>
</rect>
</property>
<property name="font">
@ -373,7 +373,7 @@
<x>10</x>
<y>20</y>
<width>351</width>
<height>221</height>
<height>201</height>
</rect>
</property>
<property name="font">
@ -390,9 +390,9 @@
<property name="geometry">
<rect>
<x>10</x>
<y>380</y>
<y>370</y>
<width>191</width>
<height>151</height>
<height>141</height>
</rect>
</property>
<property name="font">
@ -507,9 +507,9 @@
<property name="geometry">
<rect>
<x>10</x>
<y>670</y>
<y>630</y>
<width>581</width>
<height>111</height>
<height>171</height>
</rect>
</property>
<property name="font">
@ -535,14 +535,14 @@
</font>
</property>
<property name="text">
<string>汇总结果Excel:</string>
<string>分析汇总数据</string>
</property>
</widget>
<widget class="QLabel" name="label_11">
<property name="geometry">
<rect>
<x>10</x>
<y>80</y>
<y>90</y>
<width>91</width>
<height>16</height>
</rect>
@ -553,7 +553,7 @@
</font>
</property>
<property name="text">
<string>汇总打分Excel:</string>
<string>总院年度文章表</string>
</property>
</widget>
<widget class="Line" name="line_2">
@ -573,8 +573,8 @@
<property name="geometry">
<rect>
<x>110</x>
<y>55</y>
<width>381</width>
<y>60</y>
<width>391</width>
<height>21</height>
</rect>
</property>
@ -591,8 +591,8 @@
<property name="geometry">
<rect>
<x>110</x>
<y>80</y>
<width>381</width>
<y>90</y>
<width>401</width>
<height>16</height>
</rect>
</property>
@ -655,6 +655,130 @@
<string>汇总打分</string>
</property>
</widget>
<widget class="QPushButton" name="bOpenCalRes3">
<property name="geometry">
<rect>
<x>520</x>
<y>110</y>
<width>51</width>
<height>24</height>
</rect>
</property>
<property name="text">
<string>打开</string>
</property>
</widget>
<widget class="QLabel" name="label_12">
<property name="geometry">
<rect>
<x>10</x>
<y>120</y>
<width>91</width>
<height>16</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="text">
<string>总院年度打分表</string>
</property>
</widget>
<widget class="QLabel" name="lCalRes3">
<property name="geometry">
<rect>
<x>110</x>
<y>120</y>
<width>401</width>
<height>16</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>9</pointsize>
</font>
</property>
<property name="text">
<string/>
</property>
</widget>
<widget class="Line" name="line_3">
<property name="geometry">
<rect>
<x>10</x>
<y>100</y>
<width>561</width>
<height>16</height>
</rect>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
<widget class="Line" name="line_4">
<property name="geometry">
<rect>
<x>10</x>
<y>130</y>
<width>561</width>
<height>16</height>
</rect>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
<widget class="QLabel" name="label_13">
<property name="geometry">
<rect>
<x>10</x>
<y>150</y>
<width>91</width>
<height>16</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="text">
<string>单位月度统计表</string>
</property>
</widget>
<widget class="QPushButton" name="bOpenCalRes4">
<property name="geometry">
<rect>
<x>520</x>
<y>140</y>
<width>51</width>
<height>24</height>
</rect>
</property>
<property name="text">
<string>打开</string>
</property>
</widget>
<widget class="QLabel" name="lCalRes4">
<property name="geometry">
<rect>
<x>110</x>
<y>150</y>
<width>401</width>
<height>16</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>9</pointsize>
</font>
</property>
<property name="text">
<string/>
</property>
</widget>
</widget>
</widget>
<widget class="QMenuBar" name="menubar">

View File

@ -5,6 +5,8 @@ from mycode.base import BASE_DIR
import re
from openpyxl import load_workbook
from urllib.parse import urlparse
from datetime import datetime
import numpy as np
wechat_dir = os.path.join(BASE_DIR, 'article')
web_dir = os.path.join(BASE_DIR, 'web_dir')
@ -23,106 +25,290 @@ def trans_to_json():
with open('biao.json', 'w', encoding='utf-8') as f:
f.write(json_str)
def make_simple_csv_from_db():
def make_simple_csv_from_db(now: datetime):
# 只查找当前月份更新的公众号数据
now_month_str = now.strftime('%Y-%m-%d 00:00:00')
conn = sqlite3.connect(os.path.join(BASE_DIR, 'db_folder/test.db'))
query = "select id, g.nickname, a.title, a.content_url, datetime(a.p_date, 'unixepoch', 'localtime') as pub_date from articles a LEFT JOIN gzhs g on g.biz = a.biz"
query = f"""
SELECT
id,
g.nickname,
a.title,
a.content_url,
datetime( a.p_date, 'unixepoch', 'localtime' ) AS pub_date,
datetime( g.updated_at, 'unixepoch', 'localtime' ) AS g_updated_at
FROM
articles a
LEFT JOIN gzhs g ON g.biz = a.biz
WHERE
g_updated_at > '{now_month_str}'
"""
df = pd.read_sql_query(query, conn)
# 关闭数据库连接
conn.close()
# 将数据写入CSV文件
df.to_csv(os.path.join(wechat_dir, 'articles.csv'), index=False)
def float_to_int(value):
try:
return int(value)
except:
return value
def get_cbma_info_from_db_and_ana(year: str = '2023'):
# 全年统计数据
zybiz = "MzIzMDU4Njg3MA=="
df_fx = pd.DataFrame({"单位": [ "中国建材总院",
"瑞泰科技", "国检集团", "中材高新", "哈玻院", "中国新材院", "秦皇岛院", "西安墙材院", "咸阳陶瓷院", "钟表所", "总院北分", "中岩科技", "水泥新材院", "中建材科创院", "科建苑", "办公室(董事会办公室)", "党委组织部/人力资源部", "财务部", "科技部", "投资部", "企业管理部、安全环保部", "党群部/宣传统战部",
"党风办/巡察办、纪委综合室", "监督执纪室", "审计办公室"],
"公众号Biz": [zybiz, "MzU0MzgwMzg1NA==", "MzI1MjYzNDQ3NA==", "MzA5MDkzNDA0NQ==", "Mzg2MDg0NjkwNw==", "MzI3MTY5NTExNA==", "MzI1MzY1Njg5MQ==", "MzIxOTQwNjE2MQ==",
"Mzg3OTI0NTYzMA==", "MzA3NTU5NjM2MA==", "", "Mzg2NDgyMDM3OA==","","MzA5NTQ5MjY4Nw==", "", "", "", "", "", "", "", "", "", "", "", ],
# "供总院稿数": [], "供总院专稿数": [], "供总院组稿数": [], "供总院阅读10000及以上数": [], "供总院阅读5000及以上数": [], "供总院阅读1000及以上数": [],
# "1月发布数": [], "1月最高点击文章": [],
# "2月发布数": [], "2月最高点击文章": [],
# "3月发布数": [], "3月最高点击文章": [],
# "4月发布数": [], "4月最高点击文章": [],
# "5月发布数": [], "5月最高点击文章": [],
# "6月发布数": [], "6月最高点击文章": [],
# "7月发布数": [], "7月最高点击文章": [],
# "8月发布数": [], "8月最高点击文章": [],
# "9月发布数": [], "9月最高点击文章": [],
# "10月发布数": [], "10月最高点击文章": [],
# "11月发布数": [], "11月最高点击文章": [],
# "12月发布数": [], "12月最高点击文章": [],
# "半年发布数": [], "半年最高点击文章": [],
# "全年发布数": [], "全年最高点击文章": []
})
# 查询所有指定公众号的文章并按年/月排序
conn = sqlite3.connect(os.path.join(BASE_DIR, 'db_folder/test.db'))
query = f'''
query_gzhs = f'''
SELECT
id,
strftime('%Y年%m月%d', datetime(a.p_date, 'unixepoch', 'localtime')) as pub_date,
g.biz as gbiz,
strftime('%Y', datetime(a.p_date, 'unixepoch', 'localtime')) as pub_year,
strftime('%m', datetime(a.p_date, 'unixepoch', 'localtime')) as pub_month,
strftime('%d', datetime(a.p_date, 'unixepoch', 'localtime')) as pub_day,
g.nickname,
a.title,
a.content_url,
a.read_num
FROM
articles a
articles a
LEFT JOIN
gzhs g ON g.biz = a.biz
gzhs g ON g.biz = a.biz
WHERE
pub_date > '{year}'
AND
g.biz = 'MzIzMDU4Njg3MA=='
pub_year = '{year}'
AND
g.biz in ({', '.join([f"'{biz}'" for biz in df_fx["公众号Biz"].tolist()])})
ORDER BY
pub_date
pub_year, pub_month, pub_day;
'''
df = pd.read_sql_query(query, conn)
# 关闭数据库连接
conn.close()
df = pd.read_sql_query(query_gzhs, conn)
conn.close
# 追加总院数据来源
for ind, row in df.iterrows():
id = row['id']
full_path = os.path.join(wechat_dir, row['nickname'], row['id'] + '.md')
try:
with open(full_path, encoding='utf-8') as f:
content = f.read()
# 从content中获取来源
a_match = re.findall('来源丨(.*?)\n', content)
a_list = []
if a_match:
# a = a_match[0].replace('\xa0', '、').replace(' ', '、')
# a = re.sub(r'、+', '、', a)
a = re.sub(r'[\xa0\s]+', '', a_match[0])
df.at[ind, 'source'] = a
except FileNotFoundError:
print(full_path + '---不存在')
# 填充到execl中
if row['gbiz'] == zybiz:
full_path = os.path.join(wechat_dir, row['nickname'], row['id'] + '.md')
try:
with open(full_path, encoding='utf-8') as f:
content = f.read()
# 从content中获取来源
a_match = re.findall('来源丨(.*?)\n', content)
if a_match:
# a = a_match[0].replace('\xa0', '、').replace(' ', '、')
# a = re.sub(r'、+', '、', a)
a = re.sub(r'[\xa0\s]+', '', a_match[0].strip())
df.at[ind, 'source'] = a
except FileNotFoundError:
print(full_path + '---不存在')
df['source'] = df['source'].fillna('')
# df_fx['供总院稿数'] = df_fx['单位'].apply(lambda unit: (df['source'].str.contains(unit)).sum())
# df_fx['供总院专稿数'] = df_fx['单位'].apply(lambda unit: (df['source'] == unit).sum())
# df_fx['供总院组稿数'] = df_fx['单位'].apply(lambda unit: ((df['source'].str.contains(unit)&(df['source']!=unit))).sum())
# df_fx['供总院阅读10000及以上数'] = df_fx['单位'].apply(lambda unit: ((df['read_num']>=10000)&(df['source'].str.contains(unit))).sum())
# df_fx['供总院阅读5000及以上数'] = df_fx['单位'].apply(lambda unit: ((df['read_num']>=5000)&(df['read_num']<10000)&(df['source'].str.contains(unit))).sum())
# df_fx['供总院阅读1000及以上数'] = df_fx['单位'].apply(lambda unit: ((df['read_num']>=1000)&(df['read_num']<5000)&(df['source'].str.contains(unit))).sum())
# df_fx['1月发布数'] = df_fx['公众号Biz'].apply(lambda unit: ((df['pub_year']==year)&(df['pub_month']=='01')&(df['gbiz']==unit)).sum() if unit else '')
# 更详细的分析
for ind, row in df_fx.iterrows():
dw = row['单位']
gbiz = row['公众号Biz']
# 全年对总院供给统计
# if '、' in dw: # 针对这种同一部门的
# cons = (df['gbiz']==zybiz)
# cons_dw_1 = pd.Series(False, index=df.index)
# for item in dw.split('、'):
# cons_dw_1 = (df['source'].str.contains(item))|cons_dw_1
# df_fx.at[ind, '供总院全年稿数'] = ((cons_dw_1)&(cons)).sum()
# else:
# df_fx.at[ind, '供总院全年稿数'] = ((df['source'].str.contains(dw))&(df['gbiz']==zybiz)).sum()
df_fx.at[ind, '供总院全年专稿数'] = ((df['source'] == dw)&(df['gbiz']==zybiz)).sum()
df_fx.at[ind, '供总院全年组稿数'] = ((df['source'].str.contains(dw)&(df['source']!=dw))&(df['gbiz']==zybiz)).sum()
df_fx.at[ind, '供总院全年阅读10000及以上数'] = ((df['read_num']>=10000)&(df['source'].str.contains(dw))&(df['gbiz']==zybiz)).sum()
df_fx.at[ind, '供总院全年阅读5000及以上数'] = ((df['read_num']>=5000)&(df['read_num']<10000)&(df['source'].str.contains(dw))&(df['gbiz']==zybiz)).sum()
df_fx.at[ind, '供总院全年阅读1000及以上数'] = ((df['read_num']>=1000)&(df['read_num']<5000)&(df['source'].str.contains(dw))&(df['gbiz']==zybiz)).sum()
for i in ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月', '上半年', '下半年', '全年']:
if '' in i:
i_str = i.replace('', '').zfill(2)
cons_y_m = (df['pub_month']==str(i_str))
elif i == '上半年':
cons_y_m = (df['pub_month'] =='01')|(df['pub_month'] =='02')|(df['pub_month'] =='03')|(df['pub_month'] =='04')|(df['pub_month'] =='05')|(df['pub_month'] =='06')
elif i == '下半年':
cons_y_m = (df['pub_month'] =='07')|(df['pub_month'] =='08')|(df['pub_month'] =='09')|(df['pub_month'] =='10')|(df['pub_month'] =='11')|(df['pub_month'] =='12')
elif i == '全年':
cons_y_m = pd.Series(True, index=df.index)
if '' in dw: # 针对这种同一部门的
cons_dw_1 = pd.Series(False, index=df.index)
for item in dw.split(''):
cons_dw_1 = (df['source'].str.contains(item))|cons_dw_1
df_fx.at[ind, f'供总院{i}稿数'] = ((cons_dw_1)&(cons_y_m)&(df['gbiz']==zybiz)).sum()
else:
df_fx.at[ind, f'供总院{i}稿数'] = (df['source'].str.contains(dw)&(cons_y_m)&(df['gbiz']==zybiz)).sum()
df_fx[f'供总院{i}稿数'] = df_fx[f'供总院{i}稿数'].fillna(0)
df_fx[f'供总院{i}稿数'] = df_fx[f'供总院{i}稿数'].astype(int)
if gbiz:
# 进行查询
# 条件
cons = (cons_y_m)&(df['gbiz']==gbiz)
cons_sum = (cons).sum()
df_fx.at[ind, f'{i}发布数'] = cons_sum
df_fx[f'{i}发布数'] = df_fx[f'{i}发布数'].fillna(0)
df_fx[f'{i}发布数'] = df_fx[f'{i}发布数'].astype(int)
df_fx.at[ind, f'{i}最高点击文章'] = ''
if cons_sum:
max_read_row = df[cons].loc[df[cons]['read_num'].idxmax()]
max_read_row_list = [max_read_row['id'], max_read_row['title'], str(max_read_row['read_num']), f'{max_read_row["pub_year"]}-{max_read_row["pub_month"]}-{max_read_row["pub_day"]}', max_read_row['source']]
df_fx.at[ind, f'{i}最高点击文章'] = '***'.join(max_read_row_list)
# 矫正数据类型
df_fx = df_fx.applymap(float_to_int)
# 先输出原始统计数据
origin_path = os.path.join(BASE_DIR, f'summary/{year}_fx.xlsx')
df_fx.to_excel(origin_path, index=True)
# 追加到总院年分析表中
template_path = os.path.join(BASE_DIR, 'summary/template_cbma.xlsx')
workbook = load_workbook(template_path)
sheet = workbook['公众号更新数']
sheet.cell(row=1, column=1, value=f'关于{year}年度中国建材总院新媒体更新情况明细表\n(官微)')
ind_zy = 0
for ind, row in df.iterrows():
sheet.cell(row=ind+3, column=1, value=str(ind+1))
sheet.cell(row=ind+3, column=2, value=row['pub_date'])
sheet.cell(row=ind+3, column=3, value=row['title'])
sheet.cell(row=ind+3, column=4, value=row['source'])
sheet.cell(row=ind+3, column=6, value=row['read_num'])
sheet.cell(row=ind+3, column=7, value=row['content_url'])
output_path = os.path.join(BASE_DIR, f'summary/{year}年_cbma.xlsx')
workbook.save(output_path)
# 开始统计分数
t_1 = (df['source'].str.contains('瑞泰科技')).sum()
t_2 = (df['source'].str.contains('国检集团')).sum()
t_3 = (df['source'].str.contains('中材高新')).sum()
t_4 = (df['source'].str.contains('哈玻院')).sum()
t_5 = (df['source'].str.contains('中国新材院')).sum()
t_6 = (df['source'].str.contains('秦皇岛院')).sum()
t_7 = (df['source'].str.contains('西安墙材院')).sum()
t_8 = (df['source'].str.contains('咸阳陶瓷院')).sum()
t_9 = (df['source'].str.contains('钟表所')).sum()
t_10 = (df['source'].str.contains('总院北分')).sum()
t_11 = (df['source'].str.contains('中岩科技')).sum()
t_12 = (df['source'].str.contains('水泥新材院')).sum()
t_13 = (df['source'].str.contains('中建材科创院')).sum()
t_14 = (df['source'].str.contains('科建苑')).sum()
if row['gbiz'] == zybiz:
sheet.cell(row=ind_zy+3, column=1, value=str(ind_zy+1))
sheet.cell(row=ind_zy+3, column=2, value=f'{row["pub_year"]}-{row["pub_month"]}-{row["pub_day"]}')
sheet.cell(row=ind_zy+3, column=3, value=row['title'])
sheet.cell(row=ind_zy+3, column=4, value=row['source'])
sheet.cell(row=ind_zy+3, column=6, value=row['read_num'])
sheet.cell(row=ind_zy+3, column=7, value=row['id'])
sheet.cell(row=ind_zy+3, column=8, value=row['content_url'])
ind_zy = ind_zy + 1
cbma_path = os.path.join(BASE_DIR, f'summary/{year}年_cbma.xlsx')
workbook.save(cbma_path)
print(f'总院{year}年文章表生成完毕!')
template_cal_path = os.path.join(BASE_DIR, 'summary/tempalte_cbma_cal.xlsx')
workbook2 = load_workbook(template_cal_path)
need_df_list = [ "瑞泰科技", "国检集团", "中材高新", "哈玻院", "中国新材院", "秦皇岛院", "西安墙材院", "咸阳陶瓷院", "钟表所", "总院北分", "中岩科技", "水泥新材院", "中建材科创院", "科建苑"]
sheet2= workbook2['打分表']
sheet2.cell(row=1, column=1, value=f'中国建材总院宣传工作计分表({year}年度)')
sheet2.cell(row=6, column=5, value=t_1)
sheet2.cell(row=6, column=7, value=t_2)
sheet2.cell(row=6, column=9, value=t_3)
sheet2.cell(row=6, column=11, value=t_4)
sheet2.cell(row=6, column=13, value=t_5)
sheet2.cell(row=6, column=15, value=t_6)
sheet2.cell(row=6, column=17, value=t_7)
sheet2.cell(row=6, column=19, value=t_8)
sheet2.cell(row=6, column=21, value=t_9)
sheet2.cell(row=6, column=23, value=t_10)
sheet2.cell(row=6, column=25, value=t_11)
sheet2.cell(row=6, column=27, value=t_12)
sheet2.cell(row=6, column=29, value=t_13)
sheet2.cell(row=6, column=31, value=t_14)
output_path2 = os.path.join(BASE_DIR, f'summary/{year}年_cbma_cal.xlsx')
workbook2.save(output_path2)
return output_path, output_path2
for ind, val in enumerate(need_df_list):
row_ind_df_fx = df_fx['单位'].to_list().index(val)
sheet2.cell(row=6, column=5+2*ind, value=df_fx.at[row_ind_df_fx, '供总院全年专稿数'])
sheet2.cell(row=10, column=5+2*ind, value=df_fx.at[row_ind_df_fx, '供总院全年组稿数'])
sheet2.cell(row=12, column=5+2*ind, value=df_fx.at[row_ind_df_fx, '供总院全年阅读10000及以上数'])
sheet2.cell(row=13, column=5+2*ind, value=df_fx.at[row_ind_df_fx, '供总院全年阅读5000及以上数'])
sheet2.cell(row=14, column=5+2*ind, value=df_fx.at[row_ind_df_fx, '供总院全年阅读1000及以上数'])
cbma_cal_path = os.path.join(BASE_DIR, f'summary/{year}年_cbma_cal.xlsx')
workbook2.save(cbma_cal_path)
print(f'总院{year}年打分表生成完毕!')
# need_df_list_full = [ "瑞泰科技股份有限公司", "中国国检测试控股集团股份有限公司", "中材高新材料股份有限公司", "哈尔滨玻璃钢研究院有限公司", "中国新型建材设计研究院有限公司", "秦皇岛玻璃工业研究设计院有限公司", "西安墙体材料研究设计院有限公司", "咸阳陶瓷研究设计院有限公司", "西安轻工业钟表研究所有限公司", "中国建材总院北京分公司", "中建材中岩科技有限公司", "水泥科学与新型建筑材料研究院(中研益)", "中建材科创新技术研究院(山东)有限公司", "北京科建苑物业管理有限公司"]
dw_list = df_fx['单位'].to_list()
template_month_path = os.path.join(BASE_DIR, 'summary/template_month.xlsx')
workbook3 = load_workbook(template_month_path)
for i in ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月', '上半年', '下半年', '全年']:
try:
sheet= workbook3[i]
except KeyError:
sheet = workbook3.copy_worksheet(workbook3['1月'])
sheet.title = i
sheet.cell(row=1, column=1, value=f'关于{year}年度中国建材总院各企业新媒体更新情况统计表\n{i}')
# 开始总院填充数据
sheet.cell(row=4, column=3, value=df_fx.at[0, f'{i}发布数'])
max_read_row = df_fx.at[dw_list.index('中国建材总院'), f'{i}最高点击文章']
if max_read_row:
_, title, read_num, pub_date, source = max_read_row.split('***')
sheet.cell(row=7, column=2, value=title)
sheet.cell(row=7, column=4, value=read_num)
sheet.cell(row=7, column=5, value=pub_date)
sheet.cell(row=7, column=6, value=source)
# 开始填充各单位数据
sheet.cell(row=14, column=3, value=df_fx.at[dw_list.index('瑞泰科技'), f'{i}发布数'])
sheet.cell(row=14, column=6, value=df_fx.at[dw_list.index('瑞泰科技'), f'供总院{i}稿数'])
sheet.cell(row=15, column=3, value=df_fx.at[dw_list.index('国检集团'), f'{i}发布数'])
sheet.cell(row=15, column=6, value=df_fx.at[dw_list.index('国检集团'), f'供总院{i}稿数'])
sheet.cell(row=16, column=3, value=df_fx.at[dw_list.index('中材高新'), f'{i}发布数'])
sheet.cell(row=16, column=6, value=df_fx.at[dw_list.index('中材高新'), f'供总院{i}稿数'])
sheet.cell(row=17, column=3, value=df_fx.at[dw_list.index('哈玻院'), f'{i}发布数'])
sheet.cell(row=17, column=6, value=df_fx.at[dw_list.index('哈玻院'), f'供总院{i}稿数'])
sheet.cell(row=18, column=3, value=df_fx.at[dw_list.index('中国新材院'), f'{i}发布数'])
sheet.cell(row=18, column=6, value=df_fx.at[dw_list.index('中国新材院'), f'供总院{i}稿数'])
sheet.cell(row=19, column=3, value=df_fx.at[dw_list.index('秦皇岛院'), f'{i}发布数'])
sheet.cell(row=19, column=6, value=df_fx.at[dw_list.index('秦皇岛院'), f'供总院{i}稿数'])
sheet.cell(row=20, column=3, value=df_fx.at[dw_list.index('西安墙材院'), f'{i}发布数'])
sheet.cell(row=20, column=6, value=df_fx.at[dw_list.index('西安墙材院'), f'供总院{i}稿数'])
sheet.cell(row=21, column=3, value=df_fx.at[dw_list.index('咸阳陶瓷院'), f'{i}发布数'])
sheet.cell(row=21, column=6, value=df_fx.at[dw_list.index('咸阳陶瓷院'), f'供总院{i}稿数'])
sheet.cell(row=22, column=3, value=df_fx.at[dw_list.index('钟表所'), f'{i}发布数'])
sheet.cell(row=22, column=6, value=df_fx.at[dw_list.index('钟表所'), f'供总院{i}稿数'])
# sheet.cell(row=23, column=3, value=df_fx.at[dw_list.index('总院北分'), f'{i}发布数'])
sheet.cell(row=23, column=6, value=df_fx.at[dw_list.index('总院北分'), f'供总院{i}稿数'])
sheet.cell(row=24, column=3, value=df_fx.at[dw_list.index('中岩科技'), f'{i}发布数'])
sheet.cell(row=24, column=6, value=df_fx.at[dw_list.index('中岩科技'), f'供总院{i}稿数'])
sheet.cell(row=25, column=3, value=df_fx.at[dw_list.index('水泥新材院'), f'{i}发布数'])
sheet.cell(row=25, column=6, value=df_fx.at[dw_list.index('水泥新材院'), f'供总院{i}稿数'])
# sheet.cell(row=26, column=3, value=df_fx.at[dw_list.index('中建材科创院'), f'{i}发布数'])
sheet.cell(row=26, column=6, value=df_fx.at[dw_list.index('中建材科创院'), f'供总院{i}稿数'])
# sheet.cell(row=27, column=3, value=df_fx.at[dw_list.index('科建苑'), f'{i}发布数'])
sheet.cell(row=27, column=6, value=df_fx.at[dw_list.index('科建苑'), f'供总院{i}稿数'])
sheet.cell(row=29, column=2, value=df_fx.at[dw_list.index('办公室(董事会办公室)'), f'供总院{i}稿数'])
sheet.cell(row=30, column=2, value=df_fx.at[dw_list.index('党委组织部/人力资源部'), f'供总院{i}稿数'])
sheet.cell(row=31, column=2, value=df_fx.at[dw_list.index('财务部'), f'供总院{i}稿数'])
sheet.cell(row=32, column=2, value=df_fx.at[dw_list.index('科技部'), f'供总院{i}稿数'])
sheet.cell(row=33, column=2, value=df_fx.at[dw_list.index('投资部'), f'供总院{i}稿数'])
sheet.cell(row=29, column=7, value=df_fx.at[dw_list.index('企业管理部、安全环保部'), f'供总院{i}稿数'])
sheet.cell(row=30, column=7, value=df_fx.at[dw_list.index('党群部/宣传统战部'), f'供总院{i}稿数'])
sheet.cell(row=31, column=7, value=df_fx.at[dw_list.index('党风办/巡察办、纪委综合室'), f'供总院{i}稿数'])
sheet.cell(row=32, column=7, value=df_fx.at[dw_list.index('监督执纪室'), f'供总院{i}稿数'])
sheet.cell(row=33, column=7, value=df_fx.at[dw_list.index('审计办公室'), f'供总院{i}稿数'])
cbma_month_path = os.path.join(BASE_DIR, f'summary/{year}年_cbma_month.xlsx')
workbook3.save(cbma_month_path)
print(f'总院{year}年月度表生成完毕!')
return origin_path, cbma_path, cbma_cal_path, cbma_month_path
def make_wechat_articles_full():

BIN
start.ico

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

View File

@ -87,33 +87,38 @@ class AnaThread(QThread):
now = datetime.datetime.now()
self.update_signal.emit({'msg': '对比开始...'})
self.update_signal.emit({'msg': '正在组合微信公众号爬取内容...'})
make_simple_csv_from_db()
make_simple_csv_from_db(now)
make_wechat_articles_full()
self.update_signal.emit({'msg': "公众号爬取内容组装完毕!"})
self.update_signal.emit({'msg': '开始对比分析所有内容...'})
wechat_results = ana_wechat()
web_results = ana_web()
# 生成汇总表
self.update_signal.emit({'msg': '开始生成汇总表...'})
output_excel_path = os.path.join(BASE_DIR, f'summary/{now.year}{now.month}月-分析结果汇总表.xlsx')
workbook = load_workbook(TEMPLATE_PATH)
wechat_sheet = workbook['公众号']
web_sheet = workbook['网站']
for row in wechat_results:
wechat_sheet.append(row)
for row in web_results:
web_sheet.append(row)
workbook.save(output_excel_path)
workbook.close()
# with open('w1.json', 'w', encoding='utf-8') as f:
# f.write(json.dumps(wechat_results, ensure_ascii=False))
try:
# 生成汇总表
self.update_signal.emit({'msg': '开始生成汇总表...'})
output_excel_path = os.path.join(BASE_DIR, f'summary/{now.year}{now.month}月-分析结果汇总表.xlsx')
workbook = load_workbook(TEMPLATE_PATH)
wechat_sheet = workbook['公众号']
web_sheet = workbook['网站']
for row in wechat_results:
wechat_sheet.append(row)
for row in web_results:
web_sheet.append(row)
workbook.save(output_excel_path)
workbook.close()
# with open('w1.json', 'w', encoding='utf-8') as f:
# f.write(json.dumps(wechat_results, ensure_ascii=False))
# with open('w2.json', 'w', encoding='utf-8') as f:
# f.write(json.dumps(web_results, ensure_ascii=False))
# 生成简报
self.update_signal.emit({'msg': '开始生成汇总简报...'})
output_report_path = gen_doc(wechat_results, web_results)
self.update_signal.emit({'msg': '分析完毕, 请查看结果栏, 可手动校对', 'output_excel_path': output_excel_path, 'output_report_path': output_report_path})
# with open('w2.json', 'w', encoding='utf-8') as f:
# f.write(json.dumps(web_results, ensure_ascii=False))
# 生成简报
self.update_signal.emit({'msg': '开始生成汇总简报...'})
output_report_path = gen_doc(wechat_results, web_results)
self.update_signal.emit({'msg': '分析完毕, 请查看结果栏, 可手动校对', 'output_excel_path': output_excel_path, 'output_report_path': output_report_path})
except PermissionError as e:
self.update_signal.emit({'msg': str(e)})
self.update_signal.emit({'msg': '文件被占用请先关闭!'})
raise
def run(self) -> None:
try:
@ -209,6 +214,8 @@ class MainWindow(QMainWindow):
self.ui.bCal.clicked.connect(self.cbma_cal)
self.ui.bOpenCalRes1.clicked.connect(lambda: self.open_file(self.ui.lCalRes1.text()))
self.ui.bOpenCalRes2.clicked.connect(lambda: self.open_file(self.ui.lCalRes2.text()))
self.ui.bOpenCalRes3.clicked.connect(lambda: self.open_file(self.ui.lCalRes3.text()))
self.ui.bOpenCalRes4.clicked.connect(lambda: self.open_file(self.ui.lCalRes4.text()))
self.ui.vLog.setModel(self.logModel)
self.res1Workbook = None
@ -268,9 +275,16 @@ class MainWindow(QMainWindow):
def cbma_cal(self):
now_year = datetime.datetime.now().year
self.update_log({'msg': '正在分析本年总院官微数据...'})
output_path, output_path2 = get_cbma_info_from_db_and_ana(now_year)
self.ui.lCalRes1.setText(output_path)
self.ui.lCalRes2.setText(output_path2)
try:
origin_path, cbma_path, cbma_cal_path, cbma_month_path = get_cbma_info_from_db_and_ana(now_year)
except PermissionError as e:
self.update_log({'msg': str(e)})
self.update_log({'msg': '文件被占用请先关闭!'})
raise
self.ui.lCalRes1.setText(origin_path)
self.ui.lCalRes2.setText(cbma_path)
self.ui.lCalRes3.setText(cbma_cal_path)
self.ui.lCalRes4.setText(cbma_month_path)
self.update_log({'msg': '分析完毕!'})
def update_log(self, rdict):
@ -312,7 +326,7 @@ class MainWindow(QMainWindow):
if __name__ == "__main__":
# gen_doc()
# pyside6-uic main.ui -o ui_mainwindow.py
print('正在启动程序...')
app = MyApplication(sys.argv)
main_window = app.createMainWindow()

Binary file not shown.

BIN
summary/template_month.xlsx Normal file

Binary file not shown.

View File

@ -23,16 +23,16 @@ class Ui_MainWindow(object):
def setupUi(self, MainWindow):
if not MainWindow.objectName():
MainWindow.setObjectName(u"MainWindow")
MainWindow.resize(600, 830)
MainWindow.resize(600, 850)
sizePolicy = QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(MainWindow.sizePolicy().hasHeightForWidth())
MainWindow.setSizePolicy(sizePolicy)
MainWindow.setMinimumSize(QSize(600, 830))
MainWindow.setMaximumSize(QSize(600, 830))
MainWindow.setMinimumSize(QSize(600, 850))
MainWindow.setMaximumSize(QSize(600, 850))
icon = QIcon()
icon.addFile(u"start.ico", QSize(), QIcon.Normal, QIcon.Off)
icon.addFile(u"favicon.ico", QSize(), QIcon.Normal, QIcon.Off)
MainWindow.setWindowIcon(icon)
MainWindow.setAutoFillBackground(False)
self.centralwidget = QWidget(MainWindow)
@ -44,7 +44,7 @@ class Ui_MainWindow(object):
self.label.setScaledContents(True)
self.groupBox = QGroupBox(self.centralwidget)
self.groupBox.setObjectName(u"groupBox")
self.groupBox.setGeometry(QRect(10, 280, 191, 91))
self.groupBox.setGeometry(QRect(10, 280, 191, 81))
font = QFont()
font.setPointSize(11)
self.groupBox.setFont(font)
@ -65,7 +65,7 @@ class Ui_MainWindow(object):
self.label_5.setStyleSheet(u"color: red;")
self.groupBox_5 = QGroupBox(self.centralwidget)
self.groupBox_5.setObjectName(u"groupBox_5")
self.groupBox_5.setGeometry(QRect(10, 540, 581, 121))
self.groupBox_5.setGeometry(QRect(10, 510, 581, 121))
self.groupBox_5.setFont(font)
self.label_7 = QLabel(self.groupBox_5)
self.label_7.setObjectName(u"label_7")
@ -122,7 +122,7 @@ class Ui_MainWindow(object):
self.bAna.setStyleSheet(u"background-color:#409EFF; color: white; border-radius: 2px")
self.label_9 = QLabel(self.centralwidget)
self.label_9.setObjectName(u"label_9")
self.label_9.setGeometry(QRect(150, 0, 291, 31))
self.label_9.setGeometry(QRect(390, 0, 211, 31))
font6 = QFont()
font6.setFamilies([u"\u6977\u4f53"])
font6.setPointSize(12)
@ -134,16 +134,16 @@ class Ui_MainWindow(object):
self.label_9.setMargin(6)
self.groupBox_6 = QGroupBox(self.centralwidget)
self.groupBox_6.setObjectName(u"groupBox_6")
self.groupBox_6.setGeometry(QRect(220, 280, 371, 251))
self.groupBox_6.setGeometry(QRect(220, 280, 371, 231))
self.groupBox_6.setFont(font)
self.vLog = QListView(self.groupBox_6)
self.vLog.setObjectName(u"vLog")
self.vLog.setGeometry(QRect(10, 20, 351, 221))
self.vLog.setGeometry(QRect(10, 20, 351, 201))
self.vLog.setFont(font3)
self.vLog.setStyleSheet(u"")
self.groupBox_2 = QGroupBox(self.centralwidget)
self.groupBox_2.setObjectName(u"groupBox_2")
self.groupBox_2.setGeometry(QRect(10, 380, 191, 151))
self.groupBox_2.setGeometry(QRect(10, 370, 191, 141))
self.groupBox_2.setFont(font)
self.bWebSite = QPushButton(self.groupBox_2)
self.bWebSite.setObjectName(u"bWebSite")
@ -170,7 +170,7 @@ class Ui_MainWindow(object):
self.bStart.setStyleSheet(u"background-color:#409EFF; color: white; border-radius: 2px")
self.groupBox_7 = QGroupBox(self.centralwidget)
self.groupBox_7.setObjectName(u"groupBox_7")
self.groupBox_7.setGeometry(QRect(10, 670, 581, 111))
self.groupBox_7.setGeometry(QRect(10, 630, 581, 171))
self.groupBox_7.setFont(font)
self.label_10 = QLabel(self.groupBox_7)
self.label_10.setObjectName(u"label_10")
@ -178,7 +178,7 @@ class Ui_MainWindow(object):
self.label_10.setFont(font2)
self.label_11 = QLabel(self.groupBox_7)
self.label_11.setObjectName(u"label_11")
self.label_11.setGeometry(QRect(10, 80, 91, 16))
self.label_11.setGeometry(QRect(10, 90, 91, 16))
self.label_11.setFont(font2)
self.line_2 = QFrame(self.groupBox_7)
self.line_2.setObjectName(u"line_2")
@ -187,11 +187,11 @@ class Ui_MainWindow(object):
self.line_2.setFrameShadow(QFrame.Sunken)
self.lCalRes1 = QLabel(self.groupBox_7)
self.lCalRes1.setObjectName(u"lCalRes1")
self.lCalRes1.setGeometry(QRect(110, 55, 381, 21))
self.lCalRes1.setGeometry(QRect(110, 60, 391, 21))
self.lCalRes1.setFont(font3)
self.lCalRes2 = QLabel(self.groupBox_7)
self.lCalRes2.setObjectName(u"lCalRes2")
self.lCalRes2.setGeometry(QRect(110, 80, 381, 16))
self.lCalRes2.setGeometry(QRect(110, 90, 401, 16))
self.lCalRes2.setFont(font3)
self.bOpenCalRes1 = QPushButton(self.groupBox_7)
self.bOpenCalRes1.setObjectName(u"bOpenCalRes1")
@ -205,6 +205,38 @@ class Ui_MainWindow(object):
self.bCal.setGeometry(QRect(20, 30, 151, 24))
self.bCal.setFont(font)
self.bCal.setStyleSheet(u"background-color:#409EFF; color: white; border-radius: 2px")
self.bOpenCalRes3 = QPushButton(self.groupBox_7)
self.bOpenCalRes3.setObjectName(u"bOpenCalRes3")
self.bOpenCalRes3.setGeometry(QRect(520, 110, 51, 24))
self.label_12 = QLabel(self.groupBox_7)
self.label_12.setObjectName(u"label_12")
self.label_12.setGeometry(QRect(10, 120, 91, 16))
self.label_12.setFont(font2)
self.lCalRes3 = QLabel(self.groupBox_7)
self.lCalRes3.setObjectName(u"lCalRes3")
self.lCalRes3.setGeometry(QRect(110, 120, 401, 16))
self.lCalRes3.setFont(font3)
self.line_3 = QFrame(self.groupBox_7)
self.line_3.setObjectName(u"line_3")
self.line_3.setGeometry(QRect(10, 100, 561, 16))
self.line_3.setFrameShape(QFrame.HLine)
self.line_3.setFrameShadow(QFrame.Sunken)
self.line_4 = QFrame(self.groupBox_7)
self.line_4.setObjectName(u"line_4")
self.line_4.setGeometry(QRect(10, 130, 561, 16))
self.line_4.setFrameShape(QFrame.HLine)
self.line_4.setFrameShadow(QFrame.Sunken)
self.label_13 = QLabel(self.groupBox_7)
self.label_13.setObjectName(u"label_13")
self.label_13.setGeometry(QRect(10, 150, 91, 16))
self.label_13.setFont(font2)
self.bOpenCalRes4 = QPushButton(self.groupBox_7)
self.bOpenCalRes4.setObjectName(u"bOpenCalRes4")
self.bOpenCalRes4.setGeometry(QRect(520, 140, 51, 24))
self.lCalRes4 = QLabel(self.groupBox_7)
self.lCalRes4.setObjectName(u"lCalRes4")
self.lCalRes4.setGeometry(QRect(110, 150, 401, 16))
self.lCalRes4.setFont(font3)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QMenuBar(MainWindow)
self.menubar.setObjectName(u"menubar")
@ -220,7 +252,7 @@ class Ui_MainWindow(object):
# setupUi
def retranslateUi(self, MainWindow):
MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"\u4e2d\u56fd\u5efa\u6750\u603b\u9662\u5ba3\u4f20\u5de5\u4f5c\u4fe1\u606f\u5316\u7ba1\u7406\u5e73\u53f0", None))
MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"\u4e2d\u56fd\u5efa\u6750\u603b\u9662\u4fe1\u606f\u7edf\u8ba1\u5e73\u53f0", None))
self.label.setText("")
self.groupBox.setTitle(QCoreApplication.translate("MainWindow", u"1.\u5fae\u4fe1\u516c\u4f17\u53f7\u4fe1\u606f\u6293\u53d6", None))
self.bWechat.setText(QCoreApplication.translate("MainWindow", u"\u6253\u5f00\u5de5\u5177", None))
@ -235,7 +267,7 @@ class Ui_MainWindow(object):
self.bBiao.setText(QCoreApplication.translate("MainWindow", u"\u6253\u5f00\u5206\u6790\u6807\u51c6Excel", None))
self.label_4.setText(QCoreApplication.translate("MainWindow", u"\u8bf7\u5728\u4fee\u6539\u540e\u4fdd\u5b58\u5e76\u5173\u95ed", None))
self.bAna.setText(QCoreApplication.translate("MainWindow", u"\u5f00\u59cb\u5206\u6790", None))
self.label_9.setText(QCoreApplication.translate("MainWindow", u"\u4e2d\u56fd\u5efa\u6750\u603b\u9662\u5ba3\u4f20\u5de5\u4f5c\u4fe1\u606f\u5316\u7ba1\u7406\u5e73\u53f0", None))
self.label_9.setText(QCoreApplication.translate("MainWindow", u"\u4e2d\u56fd\u5efa\u6750\u603b\u9662\u4fe1\u606f\u7edf\u8ba1\u5e73\u53f0", None))
self.groupBox_6.setTitle(QCoreApplication.translate("MainWindow", u"\u64cd\u4f5c\u65e5\u5fd7\u663e\u793a", None))
self.groupBox_2.setTitle(QCoreApplication.translate("MainWindow", u"2.\u786e\u8ba4\u9700\u8981\u722c\u53d6\u7684\u5b98\u7f51", None))
self.bWebSite.setText(QCoreApplication.translate("MainWindow", u"\u6253\u5f00\u7f51\u7ad9\u5217\u8868Excel", None))
@ -245,12 +277,18 @@ class Ui_MainWindow(object):
self.lSize.setText(QCoreApplication.translate("MainWindow", u"5", None))
self.bStart.setText(QCoreApplication.translate("MainWindow", u"\u5f00\u59cb\u722c\u53d6", None))
self.groupBox_7.setTitle(QCoreApplication.translate("MainWindow", u"\u603b\u9662\u5b98\u5fae", None))
self.label_10.setText(QCoreApplication.translate("MainWindow", u"\u6c47\u603b\u7ed3\u679cExcel:", None))
self.label_11.setText(QCoreApplication.translate("MainWindow", u"\u6c47\u603b\u6253\u5206Excel:", None))
self.label_10.setText(QCoreApplication.translate("MainWindow", u"\u5206\u6790\u6c47\u603b\u6570\u636e", None))
self.label_11.setText(QCoreApplication.translate("MainWindow", u"\u603b\u9662\u5e74\u5ea6\u6587\u7ae0\u8868", None))
self.lCalRes1.setText("")
self.lCalRes2.setText("")
self.bOpenCalRes1.setText(QCoreApplication.translate("MainWindow", u"\u6253\u5f00", None))
self.bOpenCalRes2.setText(QCoreApplication.translate("MainWindow", u"\u6253\u5f00", None))
self.bCal.setText(QCoreApplication.translate("MainWindow", u"\u6c47\u603b\u6253\u5206", None))
self.bOpenCalRes3.setText(QCoreApplication.translate("MainWindow", u"\u6253\u5f00", None))
self.label_12.setText(QCoreApplication.translate("MainWindow", u"\u603b\u9662\u5e74\u5ea6\u6253\u5206\u8868", None))
self.lCalRes3.setText("")
self.label_13.setText(QCoreApplication.translate("MainWindow", u"\u5355\u4f4d\u6708\u5ea6\u7edf\u8ba1\u8868", None))
self.bOpenCalRes4.setText(QCoreApplication.translate("MainWindow", u"\u6253\u5f00", None))
self.lCalRes4.setText("")
# retranslateUi

BIN
宣传信息统计.exe Normal file

Binary file not shown.