思路: 1.使用DocxTemplate庫對word文件進行操作;
2.在數據庫中創建臨時表,表內容爲該用戶下面所有的表,並且加上序號和狀態兩個字段,語句如下:
創建臨時表create table BALL AS select T.*,ROWNUM PAGES,'0' STATUS from user_tab_comments T;
3.循環查詢臨時表ball狀態等於0的行,跑出行對應的表的所有字段信息寫入word;
4.寫入完成後改變ball該行的狀態值爲1,表明該行處理完畢;
word模板是 :
描述:{{bzs}}
表 {{page}} {{tablename}}
序號 |
字段名稱 |
字段描述 |
字段類型 |
長度 |
允許空 |
缺省值 |
{%tr for row in rows %} |
||||||
{{row.xh}} |
{{row.zdmc}} |
{{row.zdms}} |
{{row.zdlx}} |
{{row.cd}} |
{{row.yxk}} |
{{row.qsz}} |
{%tr endfor %} |
模板下載連接:https://download.csdn.net/download/black_liu8561/11021767
以下是PY代碼,代碼寫得稍微有點亂,現階段是以實現爲主,將就看,過段時間整理一下。
from docxtpl import DocxTemplate
import cx_Oracle
def create_word(data,templatepath,filepath,filename):
'''
根據模板創建docx文件的函數
:param data: docxtemplate模塊所需字典,直接和docx文件進行關聯
:param templatepath: docx模板路徑
:param filepath: 保存的文件夾路徑
:param filename: 保存的文件名
:return: 生成一個docx文件
'''
doc = DocxTemplate(templatepath)
context = data
savepath=filepath+filename+'.docx'
doc.render(context)
doc.save(savepath)
def create_docx(dbinfo,templatepath,filepath):
'''
讀取數據庫數據並封裝成字典後傳給create_word函數生成docx文件
:param dbinfo: 數據庫信息
:return:
'''
connection = cx_Oracle.Connection(dbinfo)
cursor = connection.cursor()
sql='select * from ball where status=0'
cursor.execute(sql)
result=cursor.fetchone()
data={}
data['tablename']=result[0]
data['page']=result[3]
data['bzs']=result[2]
cursor.close()
#上述查詢臨時表數據
l=[]
cursor = connection.cursor()
sql1='''select rownum xh,t.COLUMN_NAME zdmc,t1.comments zdms,t.DATA_TYPE zdlx,t.DATA_LENGTH cd,t.NULLABLE,t.DATA_DEFAULT qsz from user_tab_cols t,user_col_comments t1
where t.COLUMN_NAME=t1.column_name(+) and
t.TABLE_NAME={0} and t1.table_name={1}'''.format("'"+data['tablename']+"'","'"+data['tablename']+"'")
cursor.execute(sql1)
result1=cursor.fetchall()
for i in result1:
row = {}
row['xh']=i[0]
row['zdmc'] = i[1]
row['zdms'] = i[2]
row['zdlx'] = i[3]
row['cd'] = i[4]
row['yxk'] = i[5]
row['qsz'] = i[6]
l.append(row)
data['rows']=l
create_word(data,templatepath=templatepath,filepath=filepath,filename=data['tablename'])
#創建文件
cursor = connection.cursor()
sql2 = '''update ball t set t.status=1 where t.table_name={0}'''.format("'"+data['tablename']+"'")
cursor.execute(sql2)
connection.commit()
cursor.close()
#修改狀態
print(data['tablename']+'已生成')
dbinfo="username/passwd@localhost:1521/instance"
templatepath=r"C:\Users\Administrator\Desktop\test.docx"
filepath="C:\\Users\\Administrator\\Desktop\\"
#配置:數據庫連接信息,docx模板位置,存儲目錄
while 1==1:
create_docx(dbinfo=dbinfo,templatepath=templatepath,filepath=filepath)