使用python将SQL输出数据更新到相应表单中的现有Excel中

时间:2017-08-14 12:30:46

标签: python excel

我是Python编程的新手,并寻求一些帮助/指导来纠正我的python代码。

我的查询是。

  1. 我有一个Excel文件,有7个标签。
  2. 我有一个文件夹,其中包含7个不同的文本文件,每个文本文件包含相应的Tab SQL查询,每个文本文件名与Excel文件中提供的选项卡名称相同。
  3. 我写了一个Python代码,逐个循环遍历所有文本文件并执行每个文本文件SQL查询以及输出中输出数据应该转储到相应表单/选项卡中的现有excel文件中的任何数据。我正在使用pandas来做到这一点,但是,代码工作正常但是将数据更新到excel pandas是从文件中删除所有现有工作表并仅将当前输出数据更新为excel文件。

    示例:如果Python代码执行文本文件(Filename:Data),并且在执行此SQL查询后我们获得了一些数据,这些数据应该转储到excel文件中(sheetname:Data)。

    <pre><code>
    import pypyodbc
    import pandas as pd
    import os
    import ctypes
    from pandas import ExcelWriter
    fpath = r"C:\MNaveed\DataScience\Python Practice New\SQL Queries"
    xlfile = r"C:\MNaveed\DataScience\Python Practice New\SQL Queries\Open_Case_Data.xlsx"
    cnxn = pypyodbc.connect('Driver={SQL Server};Server=MyServerName;Database=MyDatabaseName;Trusted_Connection=Yes')
    cursor = cnxn.cursor()
    
    for subdir, dirs, files in os.walk(fpath):
        for file in files:
            #print(os.path.join(subdir,file))
            filepath = os.path.join(subdir,file)
            #print("FilePath: ", filepath)
    
            if filepath.endswith(".txt"):
                if file != "ClosedAging_Cont.txt":
                    txtdata = open(filepath, 'r')
                    script = txtdata.read().strip()
                    txtdata.close()
                    cursor.execute(script)
                    if file == "ClosedAging.txt":
                        txtdata = open(os.path.join(subdir,"ClosedAging_Cont.txt"), 'r')
                        script = txtdata.read().strip()
                        txtdata.close()
                        cursor.execute(script)
    
                    col = [desc[0] for desc in cursor.description]
                    data = cursor.fetchall()
                    df = pd.DataFrame(list(data),columns=col)
    
                    #save_xls(df,xlfile)
    
                    writer = pd.ExcelWriter(xlfile)
                    flnm = file.replace('.txt','').strip()
                    df.to_excel(writer,sheet_name=flnm,index=False)
                    writer.save()
    
                    print(file, " : Successfully Updated.")
                else:
                    print(file, " : Ignoring this File")
            else:
                print(file, " : Ignoring this File")
    
    ctypes.windll.user32.MessageBoxW(0,"Open Case Reporting Data Successfully Updated","Open Case Reporting",1)
    </pre></code>
    

1 个答案:

答案 0 :(得分:2)

通过循环浏览文本文件,每次都会覆盖循环内的Excel文件。而是实例化pd.ExcelWriter(xlfile)并在循环外调用writer.save()。

以下示例改编自xlswriter documentation

您可以在此处找到有关多张表的更多信息:xlswriter documentaion - multiple sheets

import pandas as pd

# Create a Pandas Excel writer using XlsxWriter as the engine outside the loop.
writer = pd.ExcelWriter('pandas_simple.xlsx', engine='xlsxwriter')
# Sample loop, replace with directory browsing loop
for i in range(7):
    # Sample Pandas dataframe. Replace with SQL query and resulting data frame.
    df = pd.DataFrame({'DataFromSQLQuery': ['SQL query result {0}'.format(i)]})
    # Convert the dataframe to an XlsxWriter Excel object.
    df.to_excel(writer, sheet_name='Sheet{0}'.format(i))
# Close the Pandas Excel writer and output the Excel file.
writer.save()

以下代码解决了具体问题,但尚未经过测试。

import pypyodbc
import pandas as pd
import os
import ctypes
from pandas import ExcelWriter

fpath = r"C:\MNaveed\DataScience\Python Practice New\SQL Queries"
xlfile = r"C:\MNaveed\DataScience\Python Practice New\SQL Queries\Open_Case_Data.xlsx"
cnxn = pypyodbc.connect('Driver={SQL Server};Server=MyServerName;Database=MyDatabaseName;Trusted_Connection=Yes')
cursor = cnxn.cursor()

# Create a Pandas Excel writer using XlsxWriter as the engine outside the loop
writer = pd.ExcelWriter('pandas_simple.xlsx', engine='xlsxwriter')

# File loop
for subdir, dirs, files in os.walk(fpath):
    for file in files:
        filepath = os.path.join(subdir,file)
        if filepath.endswith(".txt"):
            if file != "ClosedAging_Cont.txt":
                txtdata = open(filepath, 'r')
                script = txtdata.read().strip()
                txtdata.close()
                cursor.execute(script)
                if file == "ClosedAging.txt":
                    txtdata = open(os.path.join(subdir,"ClosedAging_Cont.txt"), 'r')
                    script = txtdata.read().strip()
                    txtdata.close()
                    cursor.execute(script)

                col = [desc[0] for desc in cursor.description]
                data = cursor.fetchall()

                # Data frame from original question
                df = pd.DataFrame(list(data),columns=col)

                # Convert the dataframe to an XlsxWriter Excel object
                flnm = file.replace('.txt','').strip()
                df.to_excel(writer, sheet_name=flnm, index=False)

                print(file, " : Successfully Updated.")
            else:
                print(file, " : Ignoring this File")
        else:
            print(file, " : Ignoring this File")

# Close the Pandas Excel writer and output the Excel file
writer.save()

ctypes.windll.user32.MessageBoxW(0,"Open Case Reporting Data Successfully Updated","Open Case Reporting",1)