Files
docxmaker/wenzijiaoben/py/xlsx_to_csv.py
2026-06-08 10:49:52 +08:00

105 lines
3.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
xlsx转csv工具
- 将指定目录下所有.xlsx文件转换为.csv格式
- 输出路径D:\15CVS
- 只处理每个xlsx文件的第一个工作表主数据表
- 忽略以~$开头的临时文件
- CSV编码UTF-8 with BOM
- 避免覆盖同名文件(如已存在则跳过并提示)
"""
import os
import sys
import csv
import glob
from openpyxl import load_workbook
def xlsx_to_csv(src_dir, out_dir):
"""将源目录下所有xlsx文件转换为csv格式"""
# 确保输出目录存在
os.makedirs(out_dir, exist_ok=True)
# 统计计数
success_count = 0
skip_count = 0
fail_count = 0
# 遍历源目录下所有xlsx文件不递归子目录
xlsx_files = glob.glob(os.path.join(src_dir, "*.xlsx"))
for xlsx_path in xlsx_files:
filename = os.path.basename(xlsx_path)
# 跳过以~$开头的临时文件
if filename.startswith("~$"):
print(f"[跳过] 临时文件: {filename}")
skip_count += 1
continue
csv_filename = os.path.splitext(filename)[0] + ".csv"
csv_path = os.path.join(out_dir, csv_filename)
# 检查目标文件是否已存在
if os.path.exists(csv_path):
print(f"[跳过] 文件已存在: {csv_filename}")
skip_count += 1
continue
try:
print(f"[转换] {filename} -> {csv_filename}", end=" ... ")
# 读取xlsx文件只读模式提高性能
wb = load_workbook(xlsx_path, read_only=True, data_only=True)
ws = wb.active # 获取第一个工作表
# 写入CSV文件
with open(csv_path, "w", newline="", encoding="utf-8-sig") as f:
writer = csv.writer(f)
for row in ws.iter_rows(values_only=True):
# 将None转为空字符串其他值保持原样
csv_row = [cell if cell is not None else "" for cell in row]
writer.writerow(csv_row)
wb.close()
print("成功")
success_count += 1
except Exception as e:
print(f"失败")
print(f" [错误] {filename}: {e}")
fail_count += 1
# 清理可能生成的不完整文件
if os.path.exists(csv_path):
try:
os.remove(csv_path)
except Exception:
pass
# 打印统计结果
print("\n" + "=" * 50)
print(f"转换完成!")
print(f" 成功: {success_count}")
print(f" 跳过: {skip_count}")
print(f" 失败: {fail_count}")
print(f" 总计: {success_count + skip_count + fail_count}")
print("=" * 50)
if __name__ == "__main__":
src_dir = r"d:\A工作\P-L15_config"
out_dir = r"D:\15CVS"
# 支持命令行参数修改源目录
if len(sys.argv) > 1:
src_dir = sys.argv[1]
if len(sys.argv) > 2:
out_dir = sys.argv[2]
print(f"源目录: {src_dir}")
print(f"输出目录: {out_dir}")
print("-" * 50)
xlsx_to_csv(src_dir, out_dir)