利用Python为csv文件刷上excel格式——pandas和openpyxl库用例

  • 背景 

已知:

1、有多个城市的csv文件存放在下图文件夹中

2、有带格式的excel文件模板template一份 

 利用Python为csv文件刷上excel格式——pandas和openpyxl库用例_第1张图片

3、csv文件内容如下图左,模板文件见右

利用Python为csv文件刷上excel格式——pandas和openpyxl库用例_第2张图片利用Python为csv文件刷上excel格式——pandas和openpyxl库用例_第3张图片

 

  • 目标 

1、将上图左csv文件,刷上上图右excel格式

2、将变化率大于30%的数据在excel原因列(上图右黄表头列)的对应行备注说明

 

  • 解决思路

1、重命名复制excel模板

2、读取csv目标内容部分

3、写入excel —— 由于pandas的df.to_excel()方法无法指定写入位置,所以采用openpyxl库给单元格赋值方式来写入指定位置

4、判断目标列值,特定行写入备注

 

  • 实现代码

#给CSV文件刷上excel格式
#import chardet
import os,shutil
import openpyxl as xl
import pandas as pd


csv_root = r"D:\20Q2\05版本比对\city_9_csv"
excel_root = csv_root.replace('csv','excel')
template_dir =  r"D:\20Q2\05版本比对\AOMEN_template.xlsx"
#print(excel_root)

def writeText(df,i,j,text,ws):#填写变化说明
    #df的末2列,值>30%
    if j in [df.shape[1]-1,df.shape[1]]:
        percent_value = float(df.values[i,j].strip('%'))
        if percent_value > 30:
            ws.cell(i+2,j+4).value = text


if os.path.exists(excel_root) == False:
    os.mkdir(excel_root)


csv_file_ls = os.listdir(csv_root)
for csv_file in csv_file_ls:    
    
    
    #加载csv创建DataFrame
    csv_dir = os.path.join(csv_root,csv_file)
    
    #查看文件的编码格式
    f = open(csv_dir,'rb')
    csv_data = f.read()
    #print(chardet.detect(csv_data))

    #取dataframe中代写内容
    df = pd.read_csv(csv_dir,nrows=36,
    usecols=['Add','Delete','Modify','Same','NodeChangeRate','FaceChangeRate'])
    print(df)
#    print(data.values[0,2])#获取单元格,除去行列号外的第0行,第2列
#    print(data.values[0][2])
#    print(data['Add'])#按列名获取某列
    #拷贝带格式的模板excel
    excel_file = csv_file.replace(".csv",".xlsx")
    excel_dir = os.path.join(excel_root,excel_file)
    if os.path.exists(excel_dir) == False:
        shutil.copy(template_dir,excel_dir)  
    
    #写入excel
    #data.to_excel(excel_dir, sheet_name='Sheet1')#无法指定起始位置
    wb = xl.load_workbook(excel_dir)
    ws = wb['Sheet1']
    #按excel单元索引 range[m,n) 注意usecols
    for i in range(0,df.shape[0]): # (df行数)
        for j in range(0,df.shape[1]):  #(df列数)
            print("切片dataframe索引行列号:")
            print(i,j)            
            
            print("写入excel单元格索引行列号:")
            print(i+2,j+3)
            #注意按df格式索引时,单元索引号-1,因df不含表头
            print("切片dataframe{}索引行{}索引列的值:".format(i,j))
            print(df.values[i,j])
            print('____'*10)
            ws.cell(row=i+2, column=j+3).value = df.values[i,j]
            
            #写入变化率超过30%原因            
            writeText(df,i,j,"正常数据更新,数据正确",ws)
            #位置参数 实参按顺序匹配形参
            #关键字参数:形参=实参方式赋值
            #关键字参数必须在位置参数后
    wb.save(excel_dir)      
    wb.close() 
            

 

你可能感兴趣的:(python,pandas,openpyxl,excel,csv)