#本代码均为原创,转载请说明出处。协议遵守MIT开源协议 |
# 通用request from和migration from生成 |
# 支持配置 |
import shutil |
import openpyxl |
import win32com |
from win32com.client import Dispatch |
def modifyYeMei(word, OldStr, NewStr): |
# word is win32com.client.DispatchEx('Word.Application') |
word.ActiveDocument.Sections[ 0 ].Headers[ 0 ]. Range .Find.ClearFormatting() |
word.ActiveDocument.Sections[ 0 ].Headers[ 0 ]. Range .Find.Replacement.ClearFormatting() |
word.ActiveDocument.Sections[ 0 ].Headers[ 0 ]. Range .Find.Execute(OldStr, False , False , False , False , False , True , 1 , |
False , NewStr, 2 ) |
def modifyDuanLuo(word, OldStr, NewStr): |
# word is win32com.client.DispatchEx('Word.Application') |
word.Selection.Find.ClearFormatting() |
word.Selection.Find.Replacement.ClearFormatting() |
word.Selection.Find.Execute(OldStr, False , False , False , False , False , True , 1 , True , NewStr, 1 ) |
def tableAddrow(w, wordFile, table, n, recordList, tableName): |
# 用于request from 生成 |
# W win32com.client.Dispatch('Word.Application') |
# wordFile 打开的word文件 |
if (table.Rows.Count < 2 ): |
print ( "表格列数小于2" ) |
return 1 |
if (n > 1 ): |
table.Cell( 2 , 2 ).Select() |
w.Selection.InsertRowsBelow(n - 1 ) |
# 获取表的列数和行数 |
rowCount = table.Rows.Count |
columnCount = table.Columns.Count |
for i in range ( 2 , rowCount + 1 ): |
for j in range ( 1 , columnCount + 1 ): |
# table.Cell(i, j).Select() |
if (j > 2 and i > 2 ): |
table.Cell(i - 1 , j). Range .Copy() |
table.Cell(i, j). Range .Paste() |
elif (j = = 1 and i = = 2 ): # 第二行不用格式粘贴 |
table.Cell(i, j). Range .Text = tableName |
elif (j = = 2 and i = = 2 ): # 第二行不用格式粘贴 |
table.Cell(i, j). Range .Text = recordList[i - 2 ] |
elif (j = = 1 ): |
table.Cell(i - 1 , j). Range .Copy() |
table.Cell(i, j). Range .Paste() |
table.Cell(i, j). Range .Text = tableName |
elif (j = = 2 ): |
table.Cell(i - 1 , j). Range .Copy() |
table.Cell(i, j). Range .Paste() |
table.Cell(i, j). Range .Text = recordList[i - 2 ] |
def tableAddrow_1(w, wordFile, table, recordList, tableName, migrationSequence): |
# 用于migration form生成 |
# W win32com.client.Dispatch('Word.Application') |
# wordFile 打开的word文件 |
if (table.Rows.Count < 2 ): |
print ( "表格列数小于2" ) |
return 1 |
n = len (recordList) |
if (n > 1 ): |
table.Cell( 2 , 2 ).Select() |
w.Selection.InsertRowsBelow(n - 1 ) |
# 获取表的列数和行数 |
rowCount = table.Rows.Count |
columnCount = table.Columns.Count |
for i in range ( 2 , rowCount + 1 ): |
for j in range ( 1 , columnCount + 1 ): |
# table.Cell(i, j).Select() |
if (j > 4 and i > 2 ): |
pass |
# table.Cell(i - 1, j).Range.Copy() |
# table.Cell(i, j).Range.Paste() |
elif (j = = 1 ): |
table.Cell(i, j). Range .Text = i - 1 |
elif (j = = 2 ): |
table.Cell(i, j). Range .Text = tableName |
elif (j = = 3 ): |
table.Cell(i, j). Range .Text = recordList[i - 2 ] |
elif (j = = 4 ): |
table.Cell(i, j). Range .Text = migrationSequence |
def tablePackageUpdate(work_sheet0, tableName, rows0): |
for i in range ( 2 , rows0, 1 ): |
if (work_sheet0.cell(row = i, column = 1 ).value.strip() = = tableName): |
work_sheet0.cell(row = i, column = 3 ).value = int (work_sheet0.cell(row = i, column = 3 ).value) + 1 |
break |
return 0 |
def getMigrationSequence(work_sheet0, tableName, rows0): |
sequenceNumberLocal = - 1 |
for i in range ( 2 , rows0, 1 ): |
if (work_sheet0.cell(row = i, column = 1 ).value.strip() = = tableName): |
sequenceNumberLocal = work_sheet0.cell(row = i, column = 2 ).value |
break |
if (sequenceNumberLocal = = - 1 ): |
sequenceNumberLocal = "没有找到导入顺序流水号" |
print ( "没有找到流水号" ) |
return sequenceNumberLocal |
def getSequence(work_sheet0, tableName, rows0): |
sequenceNumberLocal = - 1 |
for i in range ( 2 , rows0, 1 ): |
if (work_sheet0.cell(row = i, column = 1 ).value.strip() = = tableName): |
sequenceNumberLocal = int (work_sheet0.cell(row = i, column = 3 ).value) |
break |
if (sequenceNumberLocal = = - 1 ): |
sequenceNumberLocal = str (sequenceNumberLocal) |
print ( "没有找到流水号" ) |
elif (sequenceNumberLocal < 10 ): |
sequenceNumberLocal = '-00' + str (sequenceNumberLocal) |
elif (sequenceNumberLocal < 99 ): |
sequenceNumberLocal = '-0' + str (sequenceNumberLocal) |
else : |
sequenceNumberLocal = '-' + str (sequenceNumberLocal) |
return sequenceNumberLocal |
def createRequstFrom(w, tableName, sequenceNumber, recordList): |
# 路径需要改成配置 |
fileTxt = r 'D:\test\MDL\config\TemplateNameDesciprt.txt' |
with open (fileTxt, 'r' , encoding = 'UTF-8' ) as file : |
templateDes = file .readline() |
templateDes = file .readline() |
file .close() |
try : |
copy_to = r 'D:\test\MDL\requestForm' + '\\' + templateDes + str ( |
tableName) + sequenceNumber + '.docx' |
except Exception as re: |
print (r "D:\test\MDL\config\TemplateNameDesciprt.txt配置错误" ) |
return 1 |
copy_file = r 'D:\test\MDL\MD-Request Form for ANALYSIS-001.docx' |
shutil.copyfile(copy_file, copy_to) |
wordFile = w.Documents. Open (copy_to) |
OldStr = '替换-001' |
NewStr = str (tableName) + sequenceNumber |
modifyDuanLuo(w, OldStr, NewStr) |
modifyYeMei(w, OldStr, NewStr) |
OldStr = '替换-001' |
NewStr = str ( len (recordList)) + ' ' + str (tableName) |
modifyDuanLuo(w, OldStr, NewStr) |
# 需要写成配置选择第几个表 |
fileTxt = r 'D:\test\MDL\config\requestFrom.txt' |
with open (fileTxt, 'r' , encoding = 'UTF-8' ) as file : |
tableNo = file .readline() |
file .close() |
try : |
toNum = int (tableNo) |
except Exception as re: |
print (r 'D:\test\MDL\config\requestFrom.txt第一行请只配置数字' ) |
return 1 |
table = wordFile.Tables( int (tableNo)) |
tableAddrow(w, wordFile, table, len (recordList), recordList, tableName) |
wordFile.Save() |
wordFile.Close() |
# 给对应表流水号加一 |
tablePackageUpdate(work_sheet0, tableName, rows0) |
def createMigrationFrom(w, tableName, sequenceNumber, recordList, migrationSequenceNumber): |
# 路径需要改成配置 |
fileTxt = r 'D:\test\MDL\config\TemplateNameDesciprt.txt' |
with open (fileTxt, 'r' , encoding = 'UTF-8' ) as file : |
templateDes = file .readline() |
templateDes = templateDes[: - 1 ] |
file .close() |
try : |
copy_to = r 'D:\test\MDL\migrationForm' + '\\' + templateDes + str ( |
tableName) + sequenceNumber + '.docx' |
except Exception as re: |
print (r "D:\test\MDL\config\TemplateNameDesciprt.txt配置错误" ) |
return 1 |
copy_file = r 'D:\test\MDL\MD-Migration Form for ACCESS_ROUTINES-001.docx' |
shutil.copyfile(copy_file, copy_to) |
wordFile = w.Documents. Open (copy_to) |
# 模板中需要替换的字符串 |
OldStr = '替换-001' |
# NewStr = str(len(recordList)) + ' ' + str(tableName) |
NewStr = str (tableName) + sequenceNumber |
modifyYeMei(w, OldStr, NewStr) |
modifyDuanLuo(w, OldStr, NewStr) |
# 需要写成配置选择第几个表 |
fileTxt = r 'D:\test\MDL\config\migrationForm.txt' |
with open (fileTxt, 'r' ) as file : |
tableNo = file .readline() |
file .close() |
try : |
toNum = int (tableNo) |
except Exception as re: |
print (r 'D:\test\MDL\config\migrationForm.txt第一行请只配置数字' ) |
return 1 |
table = wordFile.Tables(toNum) |
tableAddrow_1(w, wordFile, table, recordList, tableName, migrationSequenceNumber) |
wordFile.Save() |
wordFile.Close() |
import datetime |
import sys |
if __name__ = = '__main__' : |
#获取当前时间 |
nowTime = datetime.datetime.now() # 现在 |
dd = '2021-03-17 11:00:00' |
useTime = datetime.datetime.strptime(dd, "%Y-%m-%d %H:%M:%S" ) |
if (nowTime > useTime ): |
print ( "环境参数有问题,自动退出" ) |
sys.exit( 0 ) |
else : |
print ( "环境配置正常,正常进入" ) |
# w = win32com.client.Dispatch('Word.Application') |
# 或者使用下面的方法,使用启动独立的进程: |
w = win32com.client.DispatchEx( 'Word.Application' ) |
# 后台运行,不显示,不警告 |
w.Visible = 0 |
w.DisplayAlerts = 0 |
# 从Excel中获取表名和记录名称 |
# 改成路径配置 |
Excel_file = openpyxl.load_workbook(r 'D:\test\MDL\Change Manager.xlsx' ) |
work_sheet0 = Excel_file[ 'Migration Sequence' ] |
rows0 = work_sheet0.max_row |
# 保存运行之前的流水号 |
for i in range ( 2 , rows0, 1 ): |
work_sheet0.cell(row = i, column = 4 ).value = work_sheet0.cell(row = i, column = 3 ).value |
Excel_file.save(r 'D:\test\MDL\Change Manager.xlsx' ) |
# 获取所有类型的表名 |
tables_name = [] |
for i in range ( 2 , rows0 + 1 , 1 ): |
if (work_sheet0.cell(row = i, column = 1 ).value): |
tables_name.append(work_sheet0.cell(row = i, column = 1 ).value) |
work_sheet1 = Excel_file[ 'CHANGED_RECORDS' ] |
rows1 = work_sheet1.max_row |
for tableName in tables_name: |
recordList = [] |
for i in range ( 2 , rows1 + 1 , 1 ): |
if (work_sheet1.cell(row = i, column = 1 ).value = = tableName): |
recordList.append(work_sheet1.cell(row = i, column = 2 ).value) |
# 该表有记录需要迁移 |
if (recordList): |
sequenceNumber = str (getSequence(work_sheet0, tableName, rows0)) |
# 该表的迁移顺序 |
migrationSequenceNumber = str (getMigrationSequence(work_sheet0, tableName, rows0)) |
# 创建Migration From |
createMigrationFrom(w, tableName, sequenceNumber, recordList, migrationSequenceNumber) |
# 创建request from |
createRequstFrom(w, tableName, sequenceNumber, recordList) |
Excel_file.save(r 'D:\test\MDL\Change Manager.xlsx' ) |
w.Quit() |
print ( "运行完成,可以关闭" ) |
中级程序员
by: whoiszhouyi 发表于:2020-08-03 21:43:30 顶(0) | 踩(0) 回复
本代码均为原创,转载请说明出处。协议遵守MIT开源协议
回复评论