当前位置: 首页 > news >正文

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)
http://www.jsqmd.com/news/700262/

相关文章:

  • Phi-mini-MoE-instruct多场景:代码审查、算法解释、面试题生成一体化
  • DeepSeek V4论文降AI率横评,2026年4月嘎嘎降AI第一 - 我要发一区
  • DeepSeek V4内容AI痕迹太重怎么办?2026年4月3步搞定 - 我要发一区
  • 800V高压锂电池生产厂家推荐(工业级与特种定制方案解析)【浩博电池】
  • 结婚如何使用手机进行现场录礼,请人收礼?
  • sb-KafkaListener 20260425
  • Hexo+Qexo全自动化博客搭建教程
  • HTD——基于触觉预测的人形行走-操作框架:融合视觉、本体感知、力反馈、触觉,同时预测动作、未来手部关节受力、由EMA目标编码器监督的未来触觉潜变量
  • openwrt路由器lan口莫名其妙断网的补丁式解决方案
  • Open XML SDK 完全指南:告别手动处理Office文档的烦恼
  • 西恩士行业黑马 液冷阀门清洁度污染物分析系统 - 工业设备研究社
  • LFM2.5-VL-1.6B惊艳案例:老旧文档扫描件OCR+结构化摘要生成效果对比
  • 2026雅思机构实测|零基础必看:多次元、新东方、新航道、环球怎么选 - 速递信息
  • mysql如何防止用户通过子查询窃取权限_MySQL安全参数设置
  • Qwen3.5-2B中小企业AI落地方案:低成本GPU算力适配图文智能客服
  • 全网都追捧的 Kaparthy LLM Wiki 我自己实现了一个
  • DeepSeek V4降AI痕迹完整流程,2026年4月7步走通 - 我要发一区
  • 华为OD机试真题 新系统 2026-04-19 C语言 实现【8位LED控制器】
  • keysight N9040B是德 UXA 频谱分析仪 2 Hz 至 50 GHz
  • 基于倒排索引的 Java 文档搜索引擎(三)
  • 短期备考雅思必看|1-3个月冲刺选机构实测:5家对比,多次元凭什么稳赢 - 速递信息
  • Xiaomi MiMo-V2.5 系列大模型开启公测
  • Hydra:面向超级个体的分布式操作系统基座设计与实战
  • 028、工程化进阶:容错、重试与降级策略
  • JavaScript 循环机制深度解析
  • 是德科技Keysight(Agilent) N9030A PXA 信号分析仪
  • 知识库上线后检索静默失效:一次从监控盲区到分层治理的RAG故障复盘
  • 汉字转拼音工具,即输即转可多格式导出
  • 高效实现分组内跨行时间戳匹配:为每组生成布尔标记列 user_rejects
  • VSCode 2026车载调试爆发式升级:5大原生支持新特性(Adaptive AUTOSAR调试器、UDS over DoIP直连、时间敏感网络TSN时序可视化)你还没用?