Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 794|回复: 0

excel 转 dbf

[复制链接]

391

主题

1222

帖子

3902

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3902
发表于 2024-12-21 14:52:11 | 显示全部楼层 |阅读模式
import pandas as pd
import dbf

def excel_to_dbf(input_excel_path, sheet_name, output_dbf_path):
    """
    将 Excel 的指定工作表导出为 DBF 文件,保留数据类型和列名格式。

    参数:
        input_excel_path (str): 输入的 Excel 文件路径。
        sheet_name (str): 需要读取的工作表名称。
        output_dbf_path (str): 导出的 DBF 文件路径。
    """
    # 读取 Excel 的指定表
    df = pd.read_excel(input_excel_path, sheet_name=sheet_name)

    # 定义字段字符串列表,根据数据类型进行动态判断
    def get_field_definition(column):
        if df[column].dtype == 'object':  # 字符类型
            return f"{column} C(255)"
        elif pd.api.types.is_integer_dtype(df[column]):  # 整型
            return f"{column} N(20,0)"  # 整型无需小数位,最大宽度20
        elif pd.api.types.is_float_dtype(df[column]):  # 浮点型
            # 判断小数位数
            max_decimal_places = df[column].apply(
                lambda x: len(str(x).split(".")[1]) if pd.notnull(x) and "." in str(x) else 0
            ).max()
            return f"{column} N(18,{min(max_decimal_places, 5)})"  # 浮点型设置小数位,限制最大5位
        elif pd.api.types.is_datetime64_any_dtype(df[column]):  # 日期类型
            return f"{column} D"
        else:
            raise ValueError(f"Unsupported column type for {column}")

    # 生成字段定义,确保列名格式不变
    field_definitions = ";".join([get_field_definition(col) for col in df.columns])
    print(field_definitions)

    # 使用指定编码创建 DBF 表
    table = dbf.Table(output_dbf_path, field_definitions, codepage="cp936")
    table.open(dbf.READ_WRITE)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|DiscuzX

GMT+8, 2025-4-5 04:09 , Processed in 0.037397 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表