excel合并

1. url问题

你遇到的这个警告信息是来自 xlsxwriter 库的一个提示,它与你在使用 pandas.to_excel()
 保存 Excel 文件时有关。

🚨 警告内容解析

Anaconda3_202105\envs\py38\lib\site-packages\xlsxwriter\worksheet.py:1179: UserWarning: 
Ignoring URL 'https://tos-prod.com/mp3-003-001/a-163830606-P6-T3-M3-C64332788-1775742124494-1775752727.mp3' since it exceeds Excel's limit of 65,530 URLS per worksheet.

含义:
xlsxwriter 是 pandas 在保存 .xlsx 文件时默认使用的库之一(尤其在使用 to_excel() 时)。

Excel 对单个工作表中能插入的 超链接数量有限制:最多 65,530 个。

如果你的 DataFrame 中包含大量 URL 字段(例如每行一个),并且这些 URL 被自动识别为超链接(hyperlink),那么当总数超过限制时,就会出现这个警告。

系统会自动忽略超出的部分 URL,不将其作为超链接插入。
✅ 为什么会触发这个警告?

这通常是因为你的数据中有如下情况:

某列字段全是 URL(如 
"http://..."
 或 
"https://..."
);

并且该列被 Excel 自动识别为超链接;

数据量很大,导致 URL 数量超过 Excel 的限制(65,530 个)。

2. 分析问题

🔧 解决方案

✅ 方法一:关闭自动识别 URL 为超链接

你可以通过设置参数来告诉 Excel 不要将 URL 自动识别为超链接。但 Pandas 本身没有直接提供这个选项,你需要手动操作。

使用 openpyxl 引擎写入 Excel(推荐)

merged_df.to_excel(output_file_path, index=False, engine='openpyxl')
✅ openpyxl 不会自动将 URL 识别为超链接,因此不会触发这个警告。


✅ 方法二:预处理数据,将 URL 改为非链接格式

如果你希望保留 URL 内容,但不想让它们变成超链接,可以将 URL 列中的值前面加上 ' 符号,这样 Excel 会把它当作文本处理。


merged_df['url_column'] = merged_df['url_column'].apply(lambda x: f"'{x}")


✅ 方法三:分片写入多个工作表(如果数据量极大)

如果你的数据非常大,也可以考虑将数据拆分成多个 sheet 写入,避免单个 sheet 超出限制:


with pd.ExcelWriter(output_file_path, engine='openpyxl') as writer:
    for i in range(0, len(merged_df), 65000):  # 每个工作表不超过65000行
        chunk = merged_df[i:i+65000]
        chunk.to_excel(writer, sheet_name=f"Sheet_{i//65000}", index=False)

3. 合并excel

3.1 方法一

import os
import glob
import pandas as pd

# 获取所有要合并的Excel文件
input_folder = r'D:\Data\to_merge'  # 更改为你的输入文件夹路径
output_folder = r'D:\Data\to_merge_output'   # 更改为你的输出文件夹路径
output_file_name = 'merged_80w.xlsx'  # 更改为你的输出文件名

all_files = glob.glob(os.path.join(input_folder, "*.xlsx"))

if os.path.exists(output_folder) is False:
    os.makedirs(output_folder)

# 读取并合并所有Excel文件
dfs = []
for file in all_files:
    print(f"正在合并 {file}")
    df = pd.read_excel(file,  engine='xlrd')
    dfs.append(df)

merged_df = pd.concat(dfs, ignore_index=True)

# 将合并后的数据保存到另一个文件夹
output_file_path = os.path.join(output_folder, output_file_name)
# merged_df.to_excel(output_file_path, index=False)
merged_df.to_excel(output_file_path, index=False, engine='openpyxl')

print(f"合并后的Excel文件已保存到 {output_file_path}")

3.2 方法二

# ============================
# -*- coding: utf-8 -*-
# @Time: 2026/4/15 14:41
# ============================
import os
import glob
import pandas as pd
from openpyxl import Workbook
from openpyxl.utils.dataframe import dataframe_to_rows

def get_files_list(input_dir):
    file_path_list = []
    print(input_dir)
    for dirpath,dirnames,filenames in os.walk(input_dir):
        for filename in filenames:
            if filename.startswith('~'):
                continue
            file_path = os.path.join(dirpath, filename)
            file_path_list.append(file_path)
    print(file_path_list)
    return file_path_list

def write_data_to_file(df, output_path, file_type='csv', chunk_size=10000):
    """
    将 DataFrame 分块写入 CSV 或 Excel 文件,并每写入 1 万行打印一次进度。

    :param df: DataFrame 数据
    :param output_path: 输出文件路径(带后缀)
    :param file_type: 'csv' 或 'excel'
    :param chunk_size: 每块大小,默认 10000 行
    """

    # 清洗掉 Unnamed 列
    df = df.loc[:, ~df.columns.str.contains('^Unnamed')]

    if not os.path.exists(os.path.dirname(output_path)):
        os.makedirs(os.path.dirname(output_path))

    print(f"开始写入 {file_type.upper()} 文件到 {output_path}...")

    if file_type == 'csv':
        # 写入 CSV 格式
        for i in range(0, len(df), chunk_size):
            chunk = df[i:i + chunk_size]
            chunk.to_csv(
                output_path,
                mode='a',
                header=(i == 0),
                index=False,
                encoding='utf-8-sig'
            )
            print(f"✅ 已写入 {i + len(chunk)} 行")
        print("✔️ CSV 写入完成。")

    elif file_type == 'excel':
        # 使用 openpyxl 写入 Excel 格式
        wb = Workbook()
        ws = wb.active

        header_written = False
        for i in range(0, len(df), chunk_size):
            chunk = df[i:i + chunk_size]
            for row in dataframe_to_rows(chunk, index=False, header=not header_written):
                ws.append(row)
            header_written = True
            print(f"✅ 已写入 {i + len(chunk)} 行")

        wb.save(output_path)
        print("✔️ Excel 写入完成。")

    else:
        raise ValueError("不支持的文件类型,请选择 'csv' 或 'excel'。")


# === 主程序入口 ===
if __name__ == '__main__':
    # 获取所有要合并的Excel和CSV文件
    input_folder = r'D:\Data\test'  # 更改为你的输入文件夹路径
    output_folder = r'D:\Data\test_merge_output'  # 更改为你的输出文件夹路径
    output_file_name = 'merged_40w.xlsx'  # 更改为你的输出文件名
    # 将合并后的数据保存到另一个文件夹
    output_file_path = os.path.join(output_folder, output_file_name)

    # 匹配所有 .csv 和 .xlsx 文件
    # all_files = glob.glob(os.path.join(input_folder, "*.csv")) + \
    #             glob.glob(os.path.join(input_folder, "*.xlsx"))

    # 示例数据(你可以替换为你的 merged_df)
    all_files = get_files_list(input_dir=input_folder)

    if not os.path.exists(output_folder):
        os.makedirs(output_folder)

    # 读取并合并所有文件
    dfs = []
    for input_file_path in all_files:
        print(f"正在合并 {input_file_path}")
        # if file.endswith('.csv'):
        #     df = pd.read_csv(file, on_bad_lines='skip', sep=',', engine='python')
        # else:
        #     df = pd.read_excel(file, engine='openpyxl')  # 推荐使用 openpyxl 读取 .xlsx

        encodings = ['gbk', 'utf-8', 'utf-8-sig', 'GB2312', 'gb18030', ]
        for e in encodings:
            try:
                if ".csv" in input_file_path:
                    # df = pd.read_csv(input_file_path, encoding=e)
                    # df = pd.read_csv(input_file_path, sep=None, encoding=e, engine='python')
                    df = pd.read_csv(input_file_path, encoding=e, error_bad_lines=False, engine='python')
                else:
                    df = pd.read_excel(input_file_path)
                # df = pd.read_csv(input_file_path, encoding=e)
                # df = df.drop_duplicates()
                print('|> right read encoding: ', e)
                break
            except:
                print('read error:', e)
                pass
        dfs.append(df)

    merged_df = pd.concat(dfs, ignore_index=True)

    # 可选:手动指定写入格式(也可以通过 input 让用户输入)
    file_type = 'excel'  # 或 'csv'

    # 执行写入
    write_data_to_file(merged_df, output_file_path, file_type=file_type)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值