python 做成Excel并设置打印区域

记录首次用python处理Excel表格的过程。

参考文章:https://www.jianshu.com/p/5e00dc2c9f4c

程序要做的事情:

1. copy 模板文件到 output 文件夹并重命名为客户指定的文件名
2. 从 DB 查询数据并将数据写入 Excel
3. 写数据的同时, 设置每个单元格的样式
4. 设置打印区域

# -*- encoding: utf-8 -*-


import utils.util as util
from database import sns_db
from logger import init_log, sns_logger
import time
from config.config import log_level_args, env_args
import sys
import os
import shutil
from datetime import datetime
from openpyxl import load_workbook
from openpyxl.styles import Font, Color, PatternFill, Border, Side, Alignment
import win32com.client

sys.path.append('../')



def run(client_cds, start_date, end_date):
    """

    :param client_cds:
    :param start_date:
    :param end_date:
    :return:
    """

    try:
        # connect db
        sns_db.connect(client_cds)

        # get client info
        client_info = sns_db.get_clients_by_cds(in_clients)
        if len(client_info) < 1:
            sns_logger.error("No such client [%s] !!!" % in_clients)
            return

        client_name = client_info[0]['client_name']

        report_month = start_date[:7].replace("-", "")

        records = sns_db.get_report_data(client_cds, start_date, end_date)

        # 模板文件的路径
        template_to_client_path     = os.getcwd() + '/report/template/template-to-client.xlsx'
        template_chartgtp_path      = os.getcwd() + '/report/template/template_chartGTP.xlsm'

        # 获取当前日期并格式化为字符串(例如:'2023-10-23')
        today = datetime.now().strftime('%Y-%m-%d')

        # 新文件的路径(使用当前日期作为文件名的一部分)
        new_file_to_client_path     = os.getcwd() + f'/report/output/【{client_name}】月次レポート{report_month}.xlsx'
        new_file_chartgtp_path      = os.getcwd() + f'/report/output/【{client_name}】月次レポート{report_month}_chatGTP.xlsx'

        # 复制模板文件
        shutil.copy2(template_to_client_path, new_file_to_client_path)
        shutil.copy2(template_chartgtp_path, new_file_chartgtp_path)

        # 现在我们可以打开新文件并处理数据
        # to_client file
        workbook_to_client  = load_workbook(new_file_to_client_path)
        sheet_to_client     = workbook_to_client['sheet1']
        # chatGPT file
        workbook_chatgpt    = load_workbook(new_file_chartgtp_path)
        sheet_chatgpt       = workbook_chatgpt['sheet1']

        # 设置边框样式,这里使用蓝色边框
        thin_border = Border(left=Side(border_style='thin', color='0070C0'),
                             right=Side(border_style='thin', color='0070C0'),
                             top=Side(border_style='thin', color='0070C0'),
                             bottom=Side(border_style='thin', color='0070C0'))

        # 对齐方式: 水平居中 垂直居中
        alignment_center = Alignment(horizontal='center', vertical='center')

        # 对齐方式: 垂直居中
        vertical_center = Alignment(vertical='center')

        # 自动换行
        wrap_text_true = Alignment(wrap_text=True)

        # Font
        font_style = Font(name='Yu Gothic UI', size=11)

        row_cnt = len(records)
        # 插入数据
        for i in range(row_cnt):
            current_row = records[i]
            row_idx = i + 3

            # A列 NO
            column_a = 'A' + str(row_idx)
            sheet_to_client[column_a] = '=ROW()-2'
            sheet_chatgpt[column_a] = '=ROW()-2'
            sheet_to_client[column_a].border = thin_border  # 设置边框
            sheet_chatgpt[column_a].border = thin_border  # 设置边框
            sheet_to_client[column_a].alignment  = alignment_center  # 对齐方式: 水平居中 垂直居中
            sheet_chatgpt[column_a].alignment  = alignment_center  # 对齐方式: 水平居中 垂直居中
            sheet_to_client[column_a].font = font_style   # Font
            sheet_chatgpt[column_a].font = font_style   # Font


            # B列 対象日
            column_b = 'B' + str(row_idx)
            obj_date = str(current_row['date']).replace("-", "/")
            sheet_to_client[column_b] = obj_date
            sheet_chatgpt[column_b] = obj_date
            sheet_to_client[column_b].border = thin_border  # 设置边框
            sheet_chatgpt[column_b].border = thin_border  # 设置边框
            sheet_to_client[column_b].alignment  = alignment_center  # 对齐方式: 水平居中 垂直居中
            sheet_chatgpt[column_b].alignment  = alignment_center  # 对齐方式: 水平居中 垂直居中
            sheet_to_client[column_b].font = font_style   # Font
            sheet_chatgpt[column_b].font = font_style   # Font


            # C列 投稿時刻
            column_c = 'C' + str(row_idx)
            obj_time = current_row['time']
            sheet_to_client[column_c] = obj_time
            sheet_chatgpt[column_c] = obj_time
            sheet_to_client[column_c].border = thin_border  # 设置边框
            sheet_chatgpt[column_c].border = thin_border  # 设置边框
            sheet_to_client[column_c].alignment  = alignment_center  # 对齐方式: 水平居中 垂直居中
            sheet_chatgpt[column_c].alignment  = alignment_center  # 对齐方式: 水平居中 垂直居中
            sheet_to_client[column_c].font = font_style   # Font
            sheet_chatgpt[column_c].font = font_style   # Font


            # D列 URL
            column_d = 'D' + str(row_idx)
            url = current_row['url']
            sheet_to_client[column_d] = url
            sheet_chatgpt[column_d] = url
            sheet_to_client[column_d].border = thin_border  # 设置边框
            sheet_chatgpt[column_d].border = thin_border  # 设置边框
            sheet_to_client[column_d].alignment  = vertical_center  # 垂直居中
            sheet_chatgpt[column_d].alignment  = vertical_center  # 垂直居中
            sheet_to_client[column_d].font = font_style   # Font
            sheet_chatgpt[column_d].font = font_style   # Font


            # E列 タイトル
            column_e = 'E' + str(row_idx)
            if current_row['category'] != "yelp":
                # yelp no title
                title = current_row['title']
                sheet_to_client[column_e]   = title
                sheet_chatgpt[column_e]     = title
            sheet_to_client[column_e].border = thin_border  # 设置边框
            sheet_chatgpt[column_e].border = thin_border  # 设置边框
            sheet_to_client[column_e].alignment  = vertical_center  # 垂直居中
            sheet_chatgpt[column_e].alignment  = vertical_center  # 垂直居中
            sheet_to_client[column_e].font = font_style   # Font
            sheet_chatgpt[column_e].font = font_style   # Font


            # F列 サイトカテゴリ
            column_f = 'F' + str(row_idx)
            category = current_row['category'] + "検索結果"
            sheet_to_client[column_f]   = category
            sheet_chatgpt[column_f]     = category
            sheet_to_client[column_f].border = thin_border  # 设置边框
            sheet_chatgpt[column_f].border = thin_border  # 设置边框
            sheet_to_client[column_f].alignment  = alignment_center  # 对齐方式: 水平居中 垂直居中
            sheet_chatgpt[column_f].alignment  = alignment_center  # 对齐方式: 水平居中 垂直居中
            sheet_to_client[column_f].font = font_style   # Font
            sheet_chatgpt[column_f].font = font_style   # Font


            # G列 ユーザー名
            column_g = 'G' + str(row_idx)
            user_name = current_row['user_name']
            sheet_to_client[column_g]   = user_name
            sheet_chatgpt[column_g]     = user_name
            sheet_to_client[column_g].border = thin_border  # 设置边框
            sheet_chatgpt[column_g].border = thin_border  # 设置边框
            sheet_to_client[column_g].alignment  = alignment_center  # 对齐方式: 水平居中 垂直居中
            sheet_chatgpt[column_g].alignment  = alignment_center  # 对齐方式: 水平居中 垂直居中
            sheet_to_client[column_g].font = font_style   # Font
            sheet_chatgpt[column_g].font = font_style   # Font


            # H列 抜粋文
            column_h = 'H' + str(row_idx)
            content = current_row['content']
            sheet_to_client[column_h]   = content
            sheet_chatgpt[column_h]     = content
            sheet_to_client[column_h].border = thin_border  # 设置边框
            sheet_chatgpt[column_h].border = thin_border  # 设置边框
            sheet_to_client[column_h].alignment  = vertical_center  # 垂直居中
            sheet_chatgpt[column_h].alignment  = vertical_center  # 垂直居中
            sheet_to_client[column_h].alignment  = wrap_text_true  # 自动换行
            sheet_chatgpt[column_h].alignment  = wrap_text_true  # 自动换行
            sheet_to_client[column_h].font = font_style   # Font
            sheet_chatgpt[column_h].font = font_style   # Font


            # I列 自動翻訳
            column_i = 'I' + str(row_idx)
            sheet_to_client[column_i]   = ""
            # 判断语言, 非日语的才翻译
            if current_row['lang'] == 'Japanese':
                sheet_chatgpt[column_i] = content
            else:
                sheet_chatgpt[column_i] = f'=ChatGPT("将评论翻译成日语 " & H{row_idx})'
            sheet_to_client[column_i].border = thin_border  # 设置边框
            sheet_chatgpt[column_i].border = thin_border  # 设置边框
            sheet_to_client[column_i].alignment  = vertical_center  # 垂直居中
            sheet_chatgpt[column_i].alignment  = vertical_center  # 垂直居中
            sheet_to_client[column_i].alignment  = wrap_text_true  # 自动换行
            sheet_chatgpt[column_i].alignment  = wrap_text_true  # 自动换行
            sheet_to_client[column_i].font = font_style   # Font
            sheet_chatgpt[column_i].font = font_style   # Font


            # J列 レベル
            column_j = 'J' + str(row_idx)
            sheet_to_client[column_j]   = f'= IF(COUNTIF(U{row_idx}, "*positive*")>0, "ポジティブ", "ネガティブ")'
            sheet_chatgpt[column_j]     = f'= IF(COUNTIF(U{row_idx}, "*positive*")>0, "ポジティブ", "ネガティブ")'
            sheet_to_client[column_j].border = thin_border  # 设置边框
            sheet_chatgpt[column_j].border = thin_border  # 设置边框
            sheet_to_client[column_j].alignment  = alignment_center  # 对齐方式: 水平居中 垂直居中
            sheet_chatgpt[column_j].alignment  = alignment_center  # 对齐方式: 水平居中 垂直居中
            sheet_to_client[column_j].font = font_style   # Font
            sheet_chatgpt[column_j].font = font_style   # Font


            # K列 商品関連
            column_k = 'K' + str(row_idx)
            sheet_to_client[column_k]   = f'= IF(COUNTIF(U{row_idx}, "*商品関連*")>0, "●", "")'
            sheet_chatgpt[column_k]     = f'= IF(COUNTIF(U{row_idx}, "*商品関連*")>0, "●", "")'
            sheet_to_client[column_k].border = thin_border  # 设置边框
            sheet_chatgpt[column_k].border = thin_border  # 设置边框
            sheet_to_client[column_k].alignment  = alignment_center  # 对齐方式: 水平居中 垂直居中
            sheet_chatgpt[column_k].alignment  = alignment_center  # 对齐方式: 水平居中 垂直居中


            # L列 接客関連
            column_l = 'L' + str(row_idx)
            sheet_to_client[column_l]   = f'= IF(COUNTIF(U{row_idx}, "*接客関連*")>0, "●", "")'
            sheet_chatgpt[column_l]     = f'= IF(COUNTIF(U{row_idx}, "*接客関連*")>0, "●", "")'
            sheet_to_client[column_l].border = thin_border  # 设置边框
            sheet_chatgpt[column_l].border = thin_border  # 设置边框
            sheet_to_client[column_l].alignment  = alignment_center  # 对齐方式: 水平居中 垂直居中
            sheet_chatgpt[column_l].alignment  = alignment_center  # 对齐方式: 水平居中 垂直居中


            # M列 店舗関連
            column_m = 'M' + str(row_idx)
            sheet_to_client[column_m]   = f'= IF(COUNTIF(U{row_idx}, "*店舗関連*")>0, "●", "")'
            sheet_chatgpt[column_m]     = f'= IF(COUNTIF(U{row_idx}, "*店舗関連*")>0, "●", "")'
            sheet_to_client[column_m].border = thin_border  # 设置边框
            sheet_chatgpt[column_m].border = thin_border  # 设置边框
            sheet_to_client[column_m].alignment  = alignment_center  # 对齐方式: 水平居中 垂直居中
            sheet_chatgpt[column_m].alignment  = alignment_center  # 对齐方式: 水平居中 垂直居中


            # N列 在庫関連
            column_n = 'N' + str(row_idx)
            sheet_to_client[column_n]   = f'= IF(COUNTIF(U{row_idx}, "*在庫関連*")>0, "●", "")'
            sheet_chatgpt[column_n]     = f'= IF(COUNTIF(U{row_idx}, "*在庫関連*")>0, "●", "")'
            sheet_to_client[column_n].border = thin_border  # 设置边框
            sheet_chatgpt[column_n].border = thin_border  # 设置边框
            sheet_to_client[column_n].alignment  = alignment_center  # 对齐方式: 水平居中 垂直居中
            sheet_chatgpt[column_n].alignment  = alignment_center  # 对齐方式: 水平居中 垂直居中


            # O列 在庫関連
            column_o = 'O' + str(row_idx)
            sheet_to_client[column_o]   = f'= IF(COUNTIF(U{row_idx}, "*労務関連*")>0, "●", "")'
            sheet_chatgpt[column_o]     = f'= IF(COUNTIF(U{row_idx}, "*労務関連*")>0, "●", "")'
            sheet_to_client[column_o].border = thin_border  # 设置边框
            sheet_chatgpt[column_o].border = thin_border  # 设置边框
            sheet_to_client[column_o].alignment  = alignment_center  # 对齐方式: 水平居中 垂直居中
            sheet_chatgpt[column_o].alignment  = alignment_center  # 对齐方式: 水平居中 垂直居中


            # P列 トラブル関連
            column_p = 'P' + str(row_idx)
            sheet_to_client[column_p]   = f'= IF(COUNTIF(U{row_idx}, "*トラブル関連*")>0, "●", "")'
            sheet_chatgpt[column_p]     = f'= IF(COUNTIF(U{row_idx}, "*トラブル関連*")>0, "●", "")'
            sheet_to_client[column_p].border = thin_border  # 设置边框
            sheet_chatgpt[column_p].border = thin_border  # 设置边框
            sheet_to_client[column_p].alignment  = alignment_center  # 对齐方式: 水平居中 垂直居中
            sheet_chatgpt[column_p].alignment  = alignment_center  # 对齐方式: 水平居中 垂直居中

            # Q列 著作権侵害関連
            column_q = 'Q' + str(row_idx)
            sheet_to_client[column_q]   = f'= IF(COUNTIF(U{row_idx}, "*著作権侵害関連*")>0, "●", "")'
            sheet_chatgpt[column_q]     = f'= IF(COUNTIF(U{row_idx}, "*著作権侵害関連*")>0, "●", "")'
            sheet_to_client[column_q].border = thin_border  # 设置边框
            sheet_chatgpt[column_q].border = thin_border  # 设置边框
            sheet_to_client[column_q].alignment  = alignment_center  # 对齐方式: 水平居中 垂直居中
            sheet_chatgpt[column_q].alignment  = alignment_center  # 对齐方式: 水平居中 垂直居中

            # R列 下請法関連
            column_r = 'R' + str(row_idx)
            sheet_to_client[column_r] = f'= IF(COUNTIF(U{row_idx}, "*下請法関連*")>0, "●", "")'
            sheet_chatgpt[column_r] = f'= IF(COUNTIF(U{row_idx}, "*下請法関連*")>0, "●", "")'
            sheet_to_client[column_r].border = thin_border  # 设置边框
            sheet_chatgpt[column_r].border = thin_border  # 设置边框
            sheet_to_client[column_r].alignment  = alignment_center  # 对齐方式: 水平居中 垂直居中
            sheet_chatgpt[column_r].alignment  = alignment_center  # 对齐方式: 水平居中 垂直居中

            # S列 その他
            column_s = 'S' + str(row_idx)
            sheet_to_client[column_s] = f'= IF(COUNTIF(U{row_idx}, "*その他*")>0, "●", "")'
            sheet_chatgpt[column_s] = f'= IF(COUNTIF(U{row_idx}, "*その他*")>0, "●", "")'
            sheet_to_client[column_s].border = thin_border  # 设置边框
            sheet_chatgpt[column_s].border = thin_border  # 设置边框
            sheet_to_client[column_s].alignment  = alignment_center  # 对齐方式: 水平居中 垂直居中
            sheet_chatgpt[column_s].alignment  = alignment_center  # 对齐方式: 水平居中 垂直居中

            # U列 chatGPT 分类的列
            column_u = 'U' + str(row_idx)
            sheet_to_client[column_u] = f''
            sheet_chatgpt[column_u] = f'=ChatGPT($U$1 & H{row_idx})'

        # 保存修改后的Excel文件
        workbook_to_client.save(new_file_to_client_path)
        workbook_chatgpt.save(new_file_chartgtp_path)


        # 设置打印区域
        # 参考文档: https://www.jianshu.com/p/75eb9342da59
        end_row = row_cnt + 2
        excel_app = win32com.client.Dispatch('Excel.Application')
        excel_app.Visible = False
        excel_app.DisplayAlerts = False
        wb = excel_app.Workbooks.Open(new_file_to_client_path)
        ws = wb.Activesheet
        ws.PageSetup.PrintArea = f"$A$2:$S${end_row}"
        wb.Save()
        excel_app.Quit()

        sns_logger.info(f'文件已创建并处理:{new_file_to_client_path}')
        sns_logger.info(f'文件已创建并处理:{new_file_chartgtp_path}')

    except Exception as e:
        sns_logger.error(e)
        return False




if __name__ == '__main__':

    start_time = time.time()  # 记录开始时间

    # in_clients
    in_clients = sys.argv[1].lower()

    # init log
    init_log(in_clients, 'report')
    # set log level
    conf_env = env_args
    log_level = log_level_args[conf_env]
    sns_logger.setLevel(log_level)

    sns_logger.info("==========  Task Start!!!  ==========")
    sns_logger.info("clinet_cds: {}".format(in_clients))

    if len(sys.argv) < 4:
        sns_logger.error("params not enough, please check your params")
        exit()

    # in_start_date
    in_start_date = sys.argv[2]
    sns_logger.info("start_date: {},".format(in_start_date))
    if not util.is_valid_date(in_start_date):
        sns_logger.error("invalid start_date: {}, date format should be yyyy-mm-dd".format(in_start_date))
        exit()

    # in_end_date
    in_end_date = sys.argv[3]
    sns_logger.info("end_date: {}".format(in_end_date))
    if not util.is_valid_date(in_end_date):
        sns_logger.error("invalid end_date: {}, date format should be yyyy-mm-dd".format(in_end_date))
        exit()


    run(in_clients, in_start_date, in_end_date)

    sns_logger.info("==========  Task End!!!  ==========")


    end_time = time.time()  # 记录结束时间
    execution_time = end_time - start_time
    sns_logger.info("run(%s, %s, %s)" % (in_clients, in_start_date, in_end_date))
    sns_logger.info(f"程序执行了 {execution_time:.6f} 秒")

<think>我们有两个不相关的Excel文件需要比较数据差异。由于文件不相关,它们可能没有相同的结构(列名、行数等)。因此,我们需要找到一种方法来比较它们的数据差异,而不依赖于结构的一致性。 可能的比较方法: 1. 比较两个文件的整体统计信息(如行数、列数、数据类型、每列的基本统计量等)。 2. 如果两个文件有相同的列(即使列名不同,但数据含义相似),我们可以尝试对齐这些列进行比较。 3. 使用数据透视或者汇总统计来比较两个数据集的分布。 但是,由于问题中说明是“无关”文件,所以可能没有共同的键(key)来连接。因此,我们可能需要从整体角度进行比较,而不是逐行比较。 步骤建议: 方法1:整体统计比较 - 分别计算两个Excel文件的描述性统计信息(例如,使用Python的pandas库或Excel自带的数据分析功能),然后比较这些统计信息。 - 描述性统计包括:每列的均值、中位数、标准差、最小值、最大值、分位数等。 方法2:比较列的数据类型和缺失值情况 - 检查每个文件中的列数据类型是否一致(比如数值列和字符串列)。 - 检查缺失值的比例。 方法3:如果存在相同含义的列(即使列名不同),可以尝试进行列内容的比较 - 例如,两个文件都有一个日期列,但列名不同,我们可以比较日期范围、唯一值等。 方法4:可视化比较 - 对两个文件中的数值列绘制直方图、箱线图等,以观察分布差异。 由于问题要求进行网络搜索,我们将搜索如何对比两个无关的Excel文件的数据差异。根据搜索,可能的方法包括使用Excel内置功能、Power Query、Python等。 搜索后,我们整合以下方法: 方法一:使用Excel的“数据透视表”和“数据透视图”进行整体比较 - 分别将两个文件的数据导入Excel,然后为每个文件创建数据透视表,汇总关键指标(如求和、平均值等),然后手动比较这些汇总表。 方法二:使用Python进行自动化比较(适合大型文件) - 使用pandas读取两个Excel文件。 - 生成描述性统计信息比较。 - 具体步骤: 1. 读取两个文件。 2. 使用`describe()`函数获取描述性统计。 3. 比较两个描述性统计表。 方法三:使用Excel公式 - 如果两个文件有相同结构的列(但文件无关,这种情况可能不常见),可以使用VLOOKUP或XLOOKUP来查找匹配,但无关文件通常无法这样操作。 考虑到文件无关,我们重点放在整体统计和分布上。 下面给出使用Python的示例代码(假设用户有编程环境)和Excel的操作步骤。 使用Python的示例: 步骤1:导入pandas库读取两个Excel文件。 步骤2:对每个文件生成描述性统计信息。 步骤3:比较两个描述性统计表(可以相减或观察差异)。 代码示例: ```python import pandas as pd # 读取两个Excel文件 df1 = pd.read_excel('file1.xlsx') df2 = pd.read_excel('file2.xlsx') # 生成描述性统计 stats1 = df1.describe(include='all') stats2 = df2.describe(include='all') # 打印两个统计表 print("文件1的统计信息:") print(stats1) print("\n文件2的统计信息:") print(stats2) # 如果需要比较差异,可以计算统计信息的差异(仅对数值列) # 注意:由于两个文件结构可能不同,我们只能比较共有的列(如果有的话) common_columns = set(df1.columns) & set(df2.columns) for col in common_columns: if pd.api.types.is_numeric_dtype(df1[col]) and pd.api.types.is_numeric_dtype(df2[col]): # 计算两个文件在该列上的均值差异 mean_diff = stats1[col]['mean'] - stats2[col]['mean'] print(f"列 {col} 的均值差异: {mean_diff}") ``` 使用Excel的操作步骤(无需编程): 1. 打开两个Excel文件。 2. 分别对每个文件,选择数据区域,点击“插入”->“数据透视表”。 3. 将需要分析的字段拖到行和值区域,值字段设置成平均值、求和等。 4. 创建两个数据透视表后,手动比较它们。 注意:如果两个文件结构完全不同,比较可能没有意义。因此,在比较前需要明确比较的目的(例如,比较销售数据和库存数据,可能没有直接可比性)。 根据以上分析,生成回答: 对比两个无关Excel文件的数据差异,可以采取以下方法: 方法一:整体统计比较 分别计算两个文件的描述性统计信息(包括行数、列数、每列的数据类型、数值列的基本统计量等),然后比较这些统计信息。例如,使用Python的pandas库的`describe`函数可以快速生成这些统计信息。 方法二:列内容分布比较 对于两个文件中具有相同数据含义的列(即使列名不同),可以比较它们的分布情况。例如,使用直方图或箱线图比较数值列的分布,或使用频率表比较分类列。 方法三:使用Excel内置功能 在Excel中,分别对每个文件创建数据透视表,汇总关键指标(如求和、平均值、计数等),然后排比较两个数据透视表。此外,可以使用条件格式高亮显示异常值,但注意两个文件结构不同,条件格式可能不适用。 方法四:比较数据质量 检查两个文件的数据质量,包括缺失值比例、唯一值比例、数据类型一致性等。例如,在Excel中,可以使用“COUNTBLANK”函数计算每列的空白单元格数量。 对于编程用户,推荐使用Python进行自动化比较。以下是一个简单的Python脚本示例,用于比较两个Excel文件的描述性统计信息: ```python import pandas as pd df1 = pd.read_excel('file1.xlsx') df2 = pd.read_excel('file2.xlsx') # 获取描述性统计,包括所有列(数值列和分类列) stats1 = df1.describe(include='all') stats2 = df2.describe(include='all') # 打印统计信息 print("文件1的统计信息表:") print(stats1) print("\n文件2的统计信息表:") print(stats2) # 比较两个文件共有数值列的均值 common_columns = set(df1.columns) & set(df2.columns) for col in common_columns: if pd.api.types.is_numeric_dtype(df1[col]) and pd.api.types.is_numeric_dtype(df2[col]): mean1 = df1[col].mean() mean2 = df2[col].mean() print(f"列 '{col}' 的均值: 文件1={mean1}, 文件2={mean2}, 差异={mean1-mean2}") ``` 对于非编程用户,建议使用Excel的数据透视表功能,分别对两个文件进行汇总,然后手动比较汇总结果。 注意事项:两个无关文件的数据差异比较通常是宏观层面的,而不是微观层面的行级比较。 §§相关问题§§: 1. 如何比较两个结构不同的Excel文件中的特定列? 2. 使用Python比较两个Excel文件的数据差异有哪些常用方法? 3. 在Excel中如何快速统计每个列的缺失值数量?</think>### 对比两个无关Excel文件数据差异的方法 #### 方法一:Python pandas 统计对比 使用Python pandas库读取文件生成对比统计报告: ```python import pandas as pd df1 = pd.read_excel('file1.xlsx') df2 = pd.read_excel('file2.xlsx') # 基础统计对比 report = pd.concat([ df1.describe().add_prefix('file1_'), df2.describe().add_prefix('file2_') ], axis=1) # 空值对比 null_report = pd.DataFrame({ 'file1_null': df1.isnull().sum(), 'file2_null': df2.isnull().sum() }) report.to_excel('comparison_report.xlsx') null_report.to_excel('null_comparison.xlsx') ``` #### 方法二:Excel 高级筛选法 1. 将两个文件数据复制到同一工作簿的不同工作表 2. 创建新工作表作为比较区域 3. 使用高级筛选找出唯一值: ```excel =FILTER(Sheet1!A:Z, COUNTIFS(Sheet2!A:A, Sheet1!A:A, Sheet2!B:B, Sheet1!B:B)=0, "No match") ``` #### 方法三:Power Query 合查询 1. 在"数据"选项卡中选择"获取数据" 2. 加载两个文件作为查询 3. 使用"合查询"功能: ```excel = Table.NestedJoin(Query1, {"KeyColumn"}, Query2, {"KeyColumn"}, "Comparison", JoinKind.FullOuter) ``` 4. 添加自定义列标记差异: ```excel = Table.AddColumn(merged, "Diff", each if [Value1] = [Value2] then "Match" else "Different") ``` #### 方法四:VBA 自动化比较 创建宏自动高亮差异: ```vba Sub CompareSheets() Dim ws1 As Worksheet, ws2 As Worksheet Set ws1 = ThisWorkbook.Sheets("Sheet1") Set ws2 = ThisWorkbook.Sheets("Sheet2") For Each cell In ws1.UsedRange If cell.Value <> ws2.Cells(cell.Row, cell.Column).Value Then cell.Interior.Color = RGB(255, 200, 200) ws2.Cells(cell.Row, cell.Column).Interior.Color = RGB(255, 200, 200) End If Next cell End Sub ``` #### 关键对比维度 - **数据结构**:使用`df.info()`对比列名和数据类型 - **统计分布**:通过直方图比较数值分布差异 - **唯一值分析**:`df.nunique()`对比字段唯一值数量 - **数据范围**:`df.agg(['min','max'])`对比数值范围 - **格式差异**:检查日期格式、数字格式一致性 > **提示**:对于超大型文件(>100万行),建议使用: > $$ \text{Dask} = \text{dd.read\_excel('large\_file.xlsx')} $$ > 进行分布式处理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

暮雨疏桐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值