{"id":426,"date":"2018-03-14T16:10:47","date_gmt":"2018-03-14T08:10:47","guid":{"rendered":"http:\/\/www.max-shu.com\/blog\/?p=426"},"modified":"2018-03-14T16:13:10","modified_gmt":"2018-03-14T08:13:10","slug":"%e4%bd%bf%e7%94%a8python%e4%bb%8emysql%e7%94%9f%e6%88%90discuz%e7%9a%84excel%e6%8a%a5%e8%a1%a8","status":"publish","type":"post","link":"http:\/\/www.max-shu.com\/blog\/?p=426","title":{"rendered":"\u4f7f\u7528python\u4eceMySQL\u751f\u6210discuz\u7684excel\u62a5\u8868"},"content":{"rendered":"<div>\u8981\u6c42\uff1a\u6bcf\u5468\u4ecediscuz\u7684mysql\u6570\u636e\u5e93\u8bfb\u53d6\u6570\u636e\uff0c\u751f\u6210\u6240\u9700\u8981\u7684xecel\u62a5\u8868\uff0c\u6a21\u677f\u683c\u5f0f\u5982\u4e0b\uff1a<\/div>\n<div><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-428\" src=\"http:\/\/www.max-shu.com\/blog\/wp-content\/uploads\/2018\/03\/6631873707722764763.jpg\" alt=\"\" width=\"750\" height=\"142\" \/><\/div>\n<div>\u540c\u65f6\u751f\u6210\u7edf\u8ba1\u56fe\uff1a<\/div>\n<div><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-430\" src=\"http:\/\/www.max-shu.com\/blog\/wp-content\/uploads\/2018\/03\/6632066122257628576.jpg\" alt=\"\" width=\"487\" height=\"478\" \/><\/div>\n<p>&nbsp;<\/p>\n<div><b>\u9644\uff0c\u4ee3\u7801\u5982\u4e0b\uff08\u9700\u8981\u6839\u636e\u4e0a\u9762\u7684\u8868\u683c\u5148\u505a\u597dexcel\u6a21\u677f\uff09\uff1a<\/b><\/div>\n<div>\n<div>#!\/usr\/bin\/env python<\/div>\n<div># -*- coding: cp936 -*-<\/div>\n<div>__author__ = &#8216;Max Shu&#8217;<\/div>\n<div><\/div>\n<div>import sys<\/div>\n<div>import string<\/div>\n<div>import os<\/div>\n<div>import time<\/div>\n<div>import datetime<\/div>\n<div>import struct<\/div>\n<div>import MySQLdb<\/div>\n<div>import openpyxl<\/div>\n<div>from openpyxl.styles import Style, PatternFill, Border, Side, Alignment, Protection, Font<\/div>\n<div>from openpyxl.charts import LineChart, Reference, Series<\/div>\n<div>from openpyxl.cell import coordinate_from_string, get_column_letter, get_column_interval, column_index_from_string<\/div>\n<div><\/div>\n<div>class BCDISCUZ_Statistics():<\/div>\n<div>\u00a0 \u00a0 conn = None<\/div>\n<div><\/div>\n<div>\u00a0 \u00a0 usersTotal = 0<\/div>\n<div>\u00a0 \u00a0 usersActivityTotal = 0<\/div>\n<div>\u00a0 \u00a0 usersZombieTotal = 0<\/div>\n<div>\u00a0 \u00a0 postsMaxOfSingleUser = 0<\/div>\n<div>\u00a0 \u00a0 threadsMaxOfSingleUser = 0<\/div>\n<div><\/div>\n<div>\u00a0 \u00a0 postsTotal = 0<\/div>\n<div>\u00a0 \u00a0 threadsTotal = 0<\/div>\n<div>\u00a0 \u00a0 postsMaxOfSingleThread = 0<\/div>\n<div>\u00a0 \u00a0 pvMaxOfSingleThread = 0<\/div>\n<div><\/div>\n<div>\u00a0 \u00a0 forumsTotal =0<\/div>\n<div>\u00a0 \u00a0 postsMaxOfSingleForum = 0<\/div>\n<div>\u00a0 \u00a0 threadsMaxOfSingleForum = 0<\/div>\n<div><\/div>\n<div>\u00a0 \u00a0 def __init__(self):<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 try:<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 self.conn = MySQLdb.connect(host = &#8220;localhost&#8221;,<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 user = &#8220;root&#8221;,<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 passwd = &#8220;xxxxx&#8221;,<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 db = &#8220;discuz_ecloud&#8221;)<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 except MySQLdb.Error, e:<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 print &#8220;Error %d: %s&#8221; % (e.args[0], e.args[1])<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 print &#8220;ERROR: Can&#8217;t connect to MySQL( localhost:3306 )&#8221;<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 self.conn = None<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return<\/div>\n<div><\/div>\n<div>\u00a0 \u00a0 def __del__(self):<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 if self.conn != None:<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 self.conn.commit()<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 self.conn.close()<\/div>\n<div><\/div>\n<div>\u00a0 \u00a0 def Print_All_Statistics_Value(self):<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 print &#8221; &#8220;<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 print &#8220;usersTotal: %d&#8221; % self.usersTotal<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 print &#8220;usersActivityTotal: %d&#8221; % self.usersActivityTotal<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 print &#8220;usersZombieTotal: %d&#8221; % self.usersZombieTotal<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 print &#8220;postsMaxOfSingleUser: %d&#8221; % self.postsMaxOfSingleUser<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 print &#8220;threadsMaxOfSingleUser: %d&#8221; % self.threadsMaxOfSingleUser<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 print &#8221; &#8220;<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 print &#8220;postsTotal: %d&#8221; % self.postsTotal<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 print &#8220;threadsTotal: %d&#8221; % self.threadsTotal<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 print &#8220;postsMaxOfSingleThread: %d&#8221; % self.postsMaxOfSingleThread<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 print &#8220;pvMaxOfSingleThread: %d&#8221; % self.pvMaxOfSingleThread<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 print &#8221; &#8220;<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 print &#8220;forumsTotal: %d&#8221; % self.forumsTotal<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 print &#8220;postsMaxOfSingleForum: %d&#8221; % self.postsMaxOfSingleForum<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 print &#8220;threadsMaxOfSingleForum: %d&#8221; % self.threadsMaxOfSingleForum<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 print &#8221; &#8220;<\/div>\n<div><\/div>\n<div>\u00a0 \u00a0 def Get_All_Statistics_Value(self):<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 self.Get_Users_Total()<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 self.Get_Users_Activity_Total()<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 self.Get_Users_Zombie_Total()<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 self.Get_Posts_Max_Of_Single_User()<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 self.Get_Threads_Max_Of_Single_User()<\/div>\n<div><\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 self.Get_Posts_Total()<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 self.Get_Threads_Total()<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 self.Get_Posts_Max_Of_Single_Thread()<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 self.Get_PV_Max_Of_Single_Thread()<\/div>\n<div><\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 self.Get_Forums_Total()<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 self.Get_Posts_Max_Of_Single_Forum()<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 self.Get_Threads_Max_Of_Single_Forum()<\/div>\n<div><\/div>\n<div>\u00a0 \u00a0 def Get_Users_Total(self):<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 &#8220;&#8221;&#8221;\u7528\u6237\u6570&#8221;&#8221;&#8221;<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 if self.conn == None:<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return 0<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 try:<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 cursor = self.conn.cursor ()<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 cursor.execute (&#8220;SELECT COUNT(*) FROM pre_common_member;&#8221;)<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 result_set = cursor.fetchall ()<\/div>\n<div># \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0for row in result_set:<\/div>\n<div># \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0print &#8220;%s&#8221; % (row[0])<\/div>\n<div># \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0print &#8220;Number of rows returned: %d&#8221; % cursor.rowcount<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 cursor.close ()<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 self.usersTotal = result_set[0][0]<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return self.usersTotal<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 except MySQLdb.Error, e:<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 print &#8220;Error %d: %s&#8221; % (e.args[0], e.args[1])<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return 0<\/div>\n<div><\/div>\n<div>\u00a0 \u00a0 def Get_Users_Activity_Total(self):<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 &#8220;&#8221;&#8221;\u6d3b\u8dc3\u7528\u6237\u6570&#8221;&#8221;&#8221;<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 if self.conn == None:<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return 0<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 try:<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 cursor = self.conn.cursor ()<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 cursor.execute (&#8220;SELECT COUNT(*) FROM pre_common_member_status WHERE lastvisit &gt;= UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 1 WEEK));&#8221;)<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 result_set = cursor.fetchall ()<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 cursor.close ()<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 self.usersActivityTotal = result_set[0][0]<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return self.usersActivityTotal<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 except MySQLdb.Error, e:<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 print &#8220;Error %d: %s&#8221; % (e.args[0], e.args[1])<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return 0<\/div>\n<div><\/div>\n<div>\u00a0 \u00a0 def Get_Users_Zombie_Total(self):<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 &#8220;&#8221;&#8221;\u50f5\u5c38\u7528\u6237\u6570&#8221;&#8221;&#8221;<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 if self.conn == None:<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return 0<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 try:<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 cursor = self.conn.cursor ()<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 cursor.execute (&#8220;SELECT COUNT(*) FROM pre_common_member_status WHERE lastvisit &lt;= UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 3 MONTH));&#8221;)<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 result_set = cursor.fetchall ()<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 cursor.close ()<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 self.usersZombieTotal = result_set[0][0]<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return self.usersZombieTotal<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 except MySQLdb.Error, e:<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 print &#8220;Error %d: %s&#8221; % (e.args[0], e.args[1])<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return 0<\/div>\n<div><\/div>\n<div>\u00a0 \u00a0 def Get_Posts_Max_Of_Single_User(self):<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 &#8220;&#8221;&#8221;\u5355\u7528\u6237\u6700\u591a\u5e16\u5b50\u6570&#8221;&#8221;&#8221;<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 if self.conn == None:<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return 0<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 try:<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 cursor = self.conn.cursor ()<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 cursor.execute (&#8220;SELECT MAX(posts) FROM pre_common_member_count;&#8221;)<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 result_set = cursor.fetchall ()<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 cursor.close ()<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 self.postsMaxOfSingleUser = result_set[0][0]<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return self.postsMaxOfSingleUser<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 except MySQLdb.Error, e:<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 print &#8220;Error %d: %s&#8221; % (e.args[0], e.args[1])<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return 0<\/div>\n<div><\/div>\n<div>\u00a0 \u00a0 def Get_Threads_Max_Of_Single_User(self):<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 &#8220;&#8221;&#8221;\u5355\u7528\u6237\u6700\u591a\u4e3b\u9898\u6570&#8221;&#8221;&#8221;<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 if self.conn == None:<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return 0<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 try:<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 cursor = self.conn.cursor ()<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 cursor.execute (&#8220;SELECT MAX(threads) FROM pre_common_member_count;&#8221;)<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 result_set = cursor.fetchall ()<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 cursor.close ()<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 self.threadsMaxOfSingleUser = result_set[0][0]<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return self.threadsMaxOfSingleUser<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 except MySQLdb.Error, e:<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 print &#8220;Error %d: %s&#8221; % (e.args[0], e.args[1])<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return 0<\/div>\n<div><\/div>\n<div>\u00a0 \u00a0 def Get_Posts_Total(self):<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 &#8220;&#8221;&#8221;\u5e16\u5b50\u6570&#8221;&#8221;&#8221;<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 if self.conn == None:<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return 0<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 try:<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 cursor = self.conn.cursor ()<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 cursor.execute (&#8220;SELECT COUNT(*) FROM pre_forum_post;&#8221;)<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 result_set = cursor.fetchall ()<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 cursor.close ()<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 self.postsTotal = result_set[0][0]<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return self.postsTotal<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 except MySQLdb.Error, e:<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 print &#8220;Error %d: %s&#8221; % (e.args[0], e.args[1])<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return 0<\/div>\n<div><\/div>\n<div>\u00a0 \u00a0 def Get_Threads_Total(self):<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 &#8220;&#8221;&#8221;\u4e3b\u9898\u6570&#8221;&#8221;&#8221;<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 if self.conn == None:<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return 0<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 try:<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 cursor = self.conn.cursor ()<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 cursor.execute (&#8220;SELECT COUNT(*) FROM pre_forum_thread;&#8221;)<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 result_set = cursor.fetchall ()<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 cursor.close ()<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 self.threadsTotal = result_set[0][0]<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return self.threadsTotal<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 except MySQLdb.Error, e:<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 print &#8220;Error %d: %s&#8221; % (e.args[0], e.args[1])<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return 0<\/div>\n<div><\/div>\n<div>\u00a0 \u00a0 def Get_Posts_Max_Of_Single_Thread(self):<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 &#8220;&#8221;&#8221;\u5355\u4e3b\u9898\u6700\u591a\u5e16\u5b50\u6570&#8221;&#8221;&#8221;<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 if self.conn == None:<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return 0<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 try:<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 cursor = self.conn.cursor ()<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 cursor.execute (&#8220;SELECT MAX(t1.c1) FROM (SELECT COUNT(*) AS c1 FROM pre_forum_post GROUP BY tid) AS t1;&#8221;)<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 result_set = cursor.fetchall ()<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 cursor.close ()<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 self.postsMaxOfSingleThread = result_set[0][0]<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return self.postsMaxOfSingleThread<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 except MySQLdb.Error, e:<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 print &#8220;Error %d: %s&#8221; % (e.args[0], e.args[1])<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return 0<\/div>\n<div><\/div>\n<div>\u00a0 \u00a0 def Get_PV_Max_Of_Single_Thread(self):<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 &#8220;&#8221;&#8221;\u5355\u4e3b\u9898\u6700\u5927PV\u503c&#8221;&#8221;&#8221;<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 if self.conn == None:<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return 0<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 try:<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 cursor = self.conn.cursor ()<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 cursor.execute (&#8220;SELECT MAX(views) FROM pre_forum_thread;&#8221;)<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 result_set = cursor.fetchall ()<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 cursor.close ()<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 self.pvMaxOfSingleThread = result_set[0][0]<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return self.pvMaxOfSingleThread<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 except MySQLdb.Error, e:<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 print &#8220;Error %d: %s&#8221; % (e.args[0], e.args[1])<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return 0<\/div>\n<div><\/div>\n<div>\u00a0 \u00a0 def Get_Forums_Total(self):<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 &#8220;&#8221;&#8221;\u7248\u5757\u6570&#8221;&#8221;&#8221;<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 if self.conn == None:<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return 0<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 try:<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 cursor = self.conn.cursor ()<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 cursor.execute (&#8220;SELECT COUNT(*) FROM pre_forum_forum WHERE STATUS=1 AND TYPE &lt;&gt; &#8216;group&#8217;;&#8221;)<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 result_set = cursor.fetchall ()<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 cursor.close ()<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 self.forumsTotal = result_set[0][0]<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return self.forumsTotal<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 except MySQLdb.Error, e:<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 print &#8220;Error %d: %s&#8221; % (e.args[0], e.args[1])<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return 0<\/div>\n<div><\/div>\n<div>\u00a0 \u00a0 def Get_Posts_Max_Of_Single_Forum(self):<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 &#8220;&#8221;&#8221;\u5355\u7248\u5757\u6700\u591a\u5e16\u5b50\u6570&#8221;&#8221;&#8221;<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 if self.conn == None:<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return 0<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 try:<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 cursor = self.conn.cursor ()<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 cursor.execute (&#8220;SELECT MAX(posts) FROM pre_forum_forum;&#8221;)<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 result_set = cursor.fetchall ()<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 cursor.close ()<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 self.postsMaxOfSingleForum = result_set[0][0]<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return self.postsMaxOfSingleForum<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 except MySQLdb.Error, e:<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 print &#8220;Error %d: %s&#8221; % (e.args[0], e.args[1])<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return 0<\/div>\n<div><\/div>\n<div>\u00a0 \u00a0 def Get_Threads_Max_Of_Single_Forum(self):<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 &#8220;&#8221;&#8221;\u5355\u7248\u5757\u6700\u591a\u4e3b\u9898\u6570&#8221;&#8221;&#8221;<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 if self.conn == None:<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return 0<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 try:<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 cursor = self.conn.cursor ()<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 cursor.execute (&#8220;SELECT MAX(threads) FROM pre_forum_forum;&#8221;)<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 result_set = cursor.fetchall ()<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 cursor.close ()<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 self.threadsMaxOfSingleForum = result_set[0][0]<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return self.threadsMaxOfSingleForum<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 except MySQLdb.Error, e:<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 print &#8220;Error %d: %s&#8221; % (e.args[0], e.args[1])<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return 0<\/div>\n<div><\/div>\n<div>\u00a0 \u00a0 def Write_Excel_File(self):<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 fileDir = u&#8221;Excel\u5468\u62a5&#8221;<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 fileNamePre = u&#8221;\u8bba\u575b\u73b0\u7f51\u73af\u5883\u4e1a\u52a1\u7edf\u8ba1\u5468\u62a5-&#8220;<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 dateStr = time.strftime(&#8216;%Y%m%d&#8217;, time.localtime())<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 # delete old file for today.<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 fileName = os.path.join(fileDir, fileNamePre+dateStr+u&#8221;.xlsx&#8221;)<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 fileName = fileName.encode(&#8220;cp936&#8221;)<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 if os.path.isfile(fileName):<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 os.remove(fileName)<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 # get newest file for before.<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 newestFileName = &#8220;&#8221;<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 oldFileDate = &#8220;&#8221;<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 fileDir = fileDir.encode(&#8220;cp936&#8221;)<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 for file in os.listdir(fileDir):<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 fileDate = file[len(fileNamePre):file.index(&#8220;.xlsx&#8221;)]<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 if oldFileDate &lt; fileDate:<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 oldFileDate = fileDate<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 newestFileName = file<\/div>\n<div><\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 # open the newest file to operation.<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 border=Border(left=Side(border_style=&#8217;thin&#8217;, color=&#8217;FF000000&#8242;),<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 right=Side(border_style=&#8217;thin&#8217;, color=&#8217;FF000000&#8242;),<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 top=Side(border_style=&#8217;thin&#8217;, color=&#8217;FF000000&#8242;),<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 bottom=Side(border_style=&#8217;thin&#8217;, color=&#8217;FF000000&#8242;))<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 workBook = openpyxl.load_workbook(os.path.join(fileDir, newestFileName))<\/div>\n<div><\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 sheet = workBook.get_sheet_by_name(u&#8221;Statistics&#8221;)<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 row = sheet.max_row + 1<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 # date<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 sheet.cell(&#8216;A&#8217;+str(row)).value = datetime.date.today()<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 sheet.cell(&#8216;A&#8217;+str(row)).number_format = &#8220;yyyy\/mm\/dd&#8221;<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 sheet.cell(&#8216;A&#8217;+str(row)).style = Style(border=border, number_format=&#8217;yyyy\/mm\/dd&#8217;)<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 # user<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 sheet.cell(&#8216;B&#8217;+str(row)).value = self.usersTotal<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 sheet.cell(&#8216;B&#8217;+str(row)).style = Style(border=border)<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 sheet.cell(&#8216;C&#8217;+str(row)).value = self.usersActivityTotal<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 sheet.cell(&#8216;C&#8217;+str(row)).style = Style(border=border)<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 sheet.cell(&#8216;D&#8217;+str(row)).value = self.usersZombieTotal<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 sheet.cell(&#8216;D&#8217;+str(row)).style = Style(border=border)<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 sheet.cell(&#8216;E&#8217;+str(row)).value = self.postsMaxOfSingleUser<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 sheet.cell(&#8216;E&#8217;+str(row)).style = Style(border=border)<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 sheet.cell(&#8216;F&#8217;+str(row)).value = self.threadsMaxOfSingleUser<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 sheet.cell(&#8216;F&#8217;+str(row)).style = Style(border=border)<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 # post<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 sheet.cell(&#8216;G&#8217;+str(row)).value = self.postsTotal<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 sheet.cell(&#8216;G&#8217;+str(row)).style = Style(border=border)<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 sheet.cell(&#8216;H&#8217;+str(row)).value = self.threadsTotal<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 sheet.cell(&#8216;H&#8217;+str(row)).style = Style(border=border)<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 sheet.cell(&#8216;I&#8217;+str(row)).value = self.postsMaxOfSingleThread<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 sheet.cell(&#8216;I&#8217;+str(row)).style = Style(border=border)<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 sheet.cell(&#8216;J&#8217;+str(row)).value = self.pvMaxOfSingleThread<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 sheet.cell(&#8216;J&#8217;+str(row)).style = Style(border=border)<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 # forum<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 sheet.cell(&#8216;K&#8217;+str(row)).value = self.forumsTotal<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 sheet.cell(&#8216;K&#8217;+str(row)).style = Style(border=border)<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 sheet.cell(&#8216;L&#8217;+str(row)).value = self.postsMaxOfSingleForum<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 sheet.cell(&#8216;L&#8217;+str(row)).style = Style(border=border)<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 sheet.cell(&#8216;M&#8217;+str(row)).value = self.threadsMaxOfSingleForum<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 sheet.cell(&#8216;M&#8217;+str(row)).style = Style(border=border)<\/div>\n<div><\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 # chart operation<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 sheetChart = workBook.get_sheet_by_name(u&#8221;Chart&#8221;)<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 chartTopPos = 5<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 chartInterval = 5<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 chartLeftPos = 10<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 chartWidth = 1200<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 realValueStartRow = 3<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 labels = Reference(sheet, (realValueStartRow, column_index_from_string(&#8216;A&#8217;)), (sheet.max_row, column_index_from_string(&#8216;A&#8217;)))<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 # No.1 chart<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 values = Reference(sheet, (realValueStartRow, column_index_from_string(&#8216;B&#8217;)), (sheet.max_row, column_index_from_string(&#8216;B&#8217;)))<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 series1 = Series(values, title=u&#8221;\u603b\u7528\u6237\u6570&#8221;, labels=labels)<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 chartHeight = 300<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 self.Execl_Insert_Chart(sheetChart, u&#8221;\u603b\u7528\u6237\u6570&#8221;, chartLeftPos, chartTopPos, chartWidth, chartHeight, series1)<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 # No.2 chart<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 values = Reference(sheet, (realValueStartRow, column_index_from_string(&#8216;C&#8217;)), (sheet.max_row, column_index_from_string(&#8216;C&#8217;)))<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 series1 = Series(values, title=u&#8221;\u6d3b\u8dc3\u7528\u6237\u6570&#8221;, labels=labels)<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 chartTopPos += (chartHeight + chartInterval)<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 self.Execl_Insert_Chart(sheetChart, u&#8221;\u6d3b\u8dc3\u7528\u6237\u6570&#8221;, chartLeftPos, chartTopPos, chartWidth, chartHeight, series1)<\/div>\n<div><\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 values = Reference(sheet, (realValueStartRow, column_index_from_string(&#8216;G&#8217;)), (sheet.max_row, column_index_from_string(&#8216;G&#8217;)))<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 series1 = Series(values, title=u&#8221;\u603b\u8d34\u6570&#8221;, labels=labels)<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 chartTopPos += (chartHeight + chartInterval)<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 self.Execl_Insert_Chart(sheetChart, u&#8221;\u603b\u8d34\u6570&#8221;, chartLeftPos, chartTopPos, chartWidth, chartHeight, series1)<\/div>\n<div><\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 values = Reference(sheet, (realValueStartRow, column_index_from_string(&#8216;H&#8217;)), (sheet.max_row, column_index_from_string(&#8216;H&#8217;)))<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 series1 = Series(values, title=u&#8221;\u603b\u4e3b\u9898\u6570&#8221;, labels=labels)<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 chartTopPos += (chartHeight + chartInterval)<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 self.Execl_Insert_Chart(sheetChart, u&#8221;\u603b\u4e3b\u9898\u6570&#8221;, chartLeftPos, chartTopPos, chartWidth, chartHeight, series1)<\/div>\n<div><\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 # save today file<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 workBook.save(fileName)<\/div>\n<div><\/div>\n<div>\u00a0 \u00a0 def Execl_Insert_Chart(self, sheet, title, left, top, width, height, *series):<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 chart = LineChart()<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 chart.title = title<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 for serial in series:<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 chart.append(serial)<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 chart.drawing.left = left<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 chart.drawing.top = top<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 chart.drawing.width = width<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 chart.drawing.height = height<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 chart.margin_left = width &#8211; 100<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 sheet.add_chart(chart)<\/div>\n<div><\/div>\n<div>if __name__ == &#8216;__main__&#8217;:<\/div>\n<div>\u00a0 \u00a0 bcdiscuz = BCDISCUZ_Statistics()<\/div>\n<div>\u00a0 \u00a0 if bcdiscuz.conn == None:<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 exit(1)<\/div>\n<div>\u00a0 \u00a0 bcdiscuz.Get_All_Statistics_Value()<\/div>\n<div>\u00a0 \u00a0 bcdiscuz.Print_All_Statistics_Value()<\/div>\n<div>\u00a0 \u00a0 bcdiscuz.Write_Excel_File()<\/div>\n<div>\u00a0 \u00a0 bcdiscuz = None<\/div>\n<div>\u00a0 \u00a0 exit(0)<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u8981\u6c42\uff1a\u6bcf\u5468\u4ecediscuz\u7684mysql\u6570\u636e\u5e93\u8bfb\u53d6\u6570\u636e\uff0c\u751f\u6210\u6240\u9700\u8981\u7684xecel\u62a5\u8868\uff0c\u6a21\u677f\u683c\u5f0f\u5982\u4e0b\uff1a \u540c\u65f6\u751f\u6210\u7edf\u8ba1\u56fe &hellip;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[63],"tags":[364,291,366,365,323,108,367],"class_list":["post-426","post","type-post","status-publish","format-standard","hentry","category-63","tag-discuz","tag-excel","tag-mariadb","tag-mysql","tag-openpyxl","tag-python","tag-367"],"views":1694,"_links":{"self":[{"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/426","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=426"}],"version-history":[{"count":3,"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/426\/revisions"}],"predecessor-version":[{"id":431,"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/426\/revisions\/431"}],"wp:attachment":[{"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=426"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=426"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=426"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}