前言
这次做的事情是以下这么个流程:
- 连接oracle数据库,然后将数据表进行批量选择与视图存储
- 从数据库中获得数据,利用pandas增加表头,并写入到excel中作为报表
- 合并两个excel的表头和内容
这里记录一下遇到的问题和注意事项。
1、oracle连接报错
首先是python3.6,自动pip install cx_Oracle,instantclient12,提示找不到64位的客户端,可能存在的问题:
-
cx_Oracle和instantclient的版本不匹配,我是最后cx_Oracle8.0和instantclient11连接成功
-
instantclient中的oci.dll、ocijdbc11.dll、oraociei11.dll是否放到python/lib/site-packages中
-
instantclient的系统环境变量设置,可以自行搜索
2、oracle写入到excel
这个我感觉还挺有用的,主要还是利用pandas,而且如果数据量不是很大的话,完全可以替代plsql的导出功能,这里记录一下部分关键代码:
import pandas as pd
out_columns_GBK = ["车辆牌号", "车辆类型", "核定载质量(吨)", "燃料类型", "车辆管理地", "总行程\n(公里)", "载运里程\n(公里)", "货运量\n(吨)", "货物周转量\n(吨公里)"]
cursor.execute(get_str1)
data_result = cursor.fetchall()
#表头字段数和结果的列数保持一致
df = pd.DataFrame(list(data_result), columns=out_columns_GBK)
# excel_name是保存路径
df.to_excel(excel_name)
3、修改excel内容
说是修改,其实还没有可以直接在原来的exce表中修改的方法啦,我是没有找到
原理还是先把源表中的数据读取出来,然后将读取的数据进行修改,修改完毕之后再重新存储到原表中
这里还是给出关键代码:
import cx_Oracle as oc
import pandas as pd
import xlrd
from xlutils.copy import copy
old_wb = xlrd.open_workbook(excel_name)
new_wb = copy(old_wb)
sheet1 = new_wb.get_sheet(0)
# 我这里是在修改i行0列的序号
for i in range(1001):
if i == 0:
sheet1.write(i, 0, "序号")
else:
sheet1.write(i, 0, str(i))
new_wb.save(excel_name)
4、加表头
因为有几十个表,然后我需要的表头在一个excel表中,要给这几十个表都加上,但是懒得一个一个打开加了,所以开始找有没有合并两个excel的,但是有一个比较难顶的问题是,我的表头里面有合并的单元格,读取起来不是很方便,所以索性还是用xlutils.copy的方法,先copy表头保存到一个workbook(假设为a)中,然后再读取内容表写入到a中,然后再存储,这里给出管家代码:
import xlrd
from xlutils.copy import copy
title_wb = xlrd.open_workbook("表头路径")
content_wb = xlrd.open_workbook(excel_name)
content_sheet = content_wb.sheet_by_name("Sheet1")
new_wb2 = copy(title_wb)
# 只有copy的workbook有get_sheet方法,读取的workbook还是用sheet_by_name吧
sheet2 = new_wb2.get_sheet(0)
# 0~4行是表头的内容
for i in range(5, 1006):
for j in range(10):
sheet2.write(i, j, content_sheet.cell(i - 5, j).value)
new_wb2.save(excel_name)
权且记录,可能会有更优的方法,但是先这样吧。