|
@@ -0,0 +1,73 @@
|
|
|
+import openpyxl
|
|
|
+from openpyxl.cell.cell import ILLEGAL_CHARACTERS_RE
|
|
|
+from openpyxl.utils import get_column_letter
|
|
|
+from pymongo import MongoClient
|
|
|
+
|
|
|
+db = MongoClient('192.168.3.206', 27080, unicode_decode_error_handler="ignore").data_quality
|
|
|
+coll_user = db["bidding_20230707"]
|
|
|
+# 设置列宽
|
|
|
+def setExcelWith(ws):
|
|
|
+ # 第一步:计算每列最大宽度,并存储在列表lks中。
|
|
|
+ lks = [] # 英文变量太费劲,用汉语首字拼音代替
|
|
|
+ for i in range(1, ws.max_column + 1): # 每列循环
|
|
|
+ lk = 1 # 定义初始列宽,并在每个行循环完成后重置
|
|
|
+ for j in range(1, ws.max_row + 1): # 每行循环
|
|
|
+ sz = ws.cell(row=j, column=i).value # 每个单元格内容
|
|
|
+ if isinstance(sz, str): # 中文占用多个字节,需要分开处理
|
|
|
+ lk1 = len(sz.encode('gbk')) # gbk解码一个中文两字节,utf-8一个中文三字节,gbk合适
|
|
|
+ else:
|
|
|
+ lk1 = len(str(sz))
|
|
|
+ if lk < lk1:
|
|
|
+ lk = lk1 # 借助每行循环将最大值存入lk中
|
|
|
+ # print(lk)
|
|
|
+ lks.append(lk) # 将每列最大宽度加入列表。(犯了一个错,用lks = lks.append(lk)报错,append会修改列表变量,返回值none,而none不能继续用append方法)
|
|
|
+
|
|
|
+ # 第二步:设置列宽
|
|
|
+ for i in range(1, ws.max_column + 1):
|
|
|
+ k = get_column_letter(i) # 将数字转化为列名,26个字母以内也可以用[chr(i).upper() for i in range(97, 123)],不用导入模块
|
|
|
+ ws.column_dimensions[k].width = lks[i - 1] + 2 # 设置列宽,一般加两个字节宽度,可以根据实际情况灵活调整
|
|
|
+# 将数据写入excel
|
|
|
+def writeExcel( path, sheetname, tongji_title, tongji_list):
|
|
|
+ book = openpyxl.Workbook()
|
|
|
+ ws = book.active
|
|
|
+ ws.title = sheetname
|
|
|
+ # 表头
|
|
|
+ data_title = tongji_title
|
|
|
+
|
|
|
+ # 创建表头
|
|
|
+ col_num = 1
|
|
|
+ for col in data_title:
|
|
|
+ ws.cell(row=1, column=col_num, value=str(col))
|
|
|
+ col_num += 1
|
|
|
+ # 写入excel
|
|
|
+ for i in range(0, len(tongji_list)):
|
|
|
+ for j in range(0, len(tongji_list[i])):
|
|
|
+ value = ILLEGAL_CHARACTERS_RE.sub(r'', tongji_list[i][j])
|
|
|
+ ws.cell(row=i + 2, column=j + 1, value=value)
|
|
|
+ setExcelWith(ws)
|
|
|
+ book.save(path)
|
|
|
+
|
|
|
+def pankong(key, item):
|
|
|
+ if key in item and item[key]:
|
|
|
+ value = item[key]
|
|
|
+ else:
|
|
|
+ value = ""
|
|
|
+ return value
|
|
|
+
|
|
|
+# 读取数据
|
|
|
+def run_data_daochu():
|
|
|
+ title_name =['id','标题','采购单位','中标单位','区域','flag_title','flag_buyer']
|
|
|
+ mongo_list = ["id", "title", "buyer", "s_winner", "area",'flag_title','flag_buyer']
|
|
|
+ data_list_correct = []
|
|
|
+ data_list_error =[]
|
|
|
+ for item in coll_user.find().batch_size(1000):
|
|
|
+ info_temp = []
|
|
|
+ for i in range(0, len(mongo_list)):
|
|
|
+ info_temp.append(pankong(mongo_list[i],item))
|
|
|
+ if item["flag_title"]==1 and item["flag_buyer"]==1:
|
|
|
+ data_list_correct.append(info_temp)
|
|
|
+ else:
|
|
|
+ data_list_error.append(info_temp)
|
|
|
+ writeExcel("output_correct.xlsx", "统计详情", title_name, data_list_correct)
|
|
|
+ writeExcel("output_error.xlsx", "统计详情", title_name, data_list_error)
|
|
|
+run_data_daochu()
|