最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python批量讀取Word表格的常用方法匯總

 更新時間:2026年05月26日 09:17:53   作者:夢因you而美  
在日常辦公和數(shù)據(jù)處理中,經(jīng)常需要將Word文檔中的表格提取為DataFrame進(jìn)行后續(xù)分析,但Word表格的格式復(fù)雜,常規(guī)讀取方式容易丟失格式或出現(xiàn)內(nèi)容為空的問題,本文將從基礎(chǔ)到終極,提供5個版本的可直接運行代碼,覆蓋所有Word表格場景,需要的朋友可以參考下

引言

在日常辦公和數(shù)據(jù)處理中,經(jīng)常需要將Word文檔中的表格提取為DataFrame進(jìn)行后續(xù)分析,但Word表格的格式復(fù)雜(如上下標(biāo)、內(nèi)置公式、字體樣式、單元格合并等),常規(guī)讀取方式容易丟失格式或出現(xiàn)內(nèi)容為空的問題。

本文將從基礎(chǔ)到終極,按“基礎(chǔ)讀取→上下標(biāo)識別→公式解析→全格式兼容→終極優(yōu)化”的遞進(jìn)邏輯,提供5個版本的可直接運行代碼,覆蓋所有Word表格場景,新手也能快速上手,按需選用。

核心依賴庫:python-docx(讀取Word文檔)、pandas(數(shù)據(jù)整理),安裝命令:

pip install python-docx pandas

本文以以下表格(test.docx)內(nèi)容為例:

一、基礎(chǔ)版:讀取Word所有表格(無格式)

適用于簡單表格(僅純文本,無上下標(biāo)、公式、特殊樣式),核心功能是批量讀取Word中的所有表格,轉(zhuǎn)換為DataFrame,支持單獨返回或合并表格,搭建基礎(chǔ)讀取框架。

from docx import Document
import pandas as pd


def read_word_tables(word_path: str, merge: bool = False):
    """
    讀取Word文檔中的所有表格,轉(zhuǎn)換為DataFrame
    :param word_path: Word文件路徑(.docx)
    :param merge: 是否合并所有表格(True=合并,F(xiàn)alse=單獨返回)
    :return: 單個DataFrame 或 DataFrame列表
    """
    # 打開Word文檔
    doc = Document(word_path)
    # 存儲所有表格的DataFrame
    df_list = []

    # 遍歷文檔中的每一個表格
    for table_idx, table in enumerate(doc.tables):
        # 存儲當(dāng)前表格的所有行數(shù)據(jù)
        table_data = []
        # 遍歷表格的每一行
        for row in table.rows:
            # 提取當(dāng)前行所有單元格的文本(去除空字符)
            row_data = [cell.text.strip() for cell in row.cells]
            table_data.append(row_data)

        # 轉(zhuǎn)換為DataFrame(默認(rèn)第一行為表頭,無表頭則手動設(shè)置)
        if len(table_data) > 0:
            # 方案:第一行作為列名,剩余行作為數(shù)據(jù)
            df = pd.DataFrame(table_data[1:], columns=table_data[0])
            df_list.append(df)
            print(f"? 已讀取第 {table_idx + 1} 個表格,形狀:{df.shape}")

    # 合并所有表格(僅當(dāng)所有表格列名一致時生效)
    if merge and len(df_list) > 0:
        return pd.concat(df_list, ignore_index=True)

    # 返回所有表格的DataFrame列表
    return df_list


# ------------------- 調(diào)用示例 -------------------
if __name__ == '__main__':
    # 1. 替換為你的Word文件路徑(Windows用/,或雙斜杠\\)
    WORD_FILE = "test.docx"

    # 2. 讀取所有表格(單獨返回)
    all_dfs = read_word_tables(WORD_FILE)

    # 3. 查看結(jié)果(遍歷所有DataFrame)
    for i, df in enumerate(all_dfs):
        print(f"\n===== 第 {i+1} 個表格數(shù)據(jù) =====")
        print(df)

運行結(jié)果:

基礎(chǔ)版說明

  • 核心邏輯:遍歷Word中的每一個表格、每一行、每一個單元格,提取純文本并整理為DataFrame,搭建最基礎(chǔ)的表格讀取流程。
  • 局限性:無法識別上下標(biāo)、公式、字體樣式(如加粗、斜體),會丟失這類格式信息,僅能提取純文本數(shù)據(jù)。
  • 適用場景:純文本表格,僅需要提取數(shù)據(jù)內(nèi)容,不關(guān)注任何格式細(xì)節(jié)。

二、升級版本:識別上下標(biāo)字體格式

在基礎(chǔ)版的基礎(chǔ)上,針對性解決“上下標(biāo)格式丟失”問題,通過解析Word中的Run對象(文本片段),判斷上下標(biāo)格式,并用統(tǒng)一標(biāo)記(上標(biāo)^()、下標(biāo)_())保留格式,避免化學(xué)公式、數(shù)學(xué)數(shù)值等內(nèi)容失真。

from docx import Document
import pandas as pd


def get_cell_formatted_text(cell):
    """
    【核心函數(shù)】提取單元格內(nèi)帶上下標(biāo)的文本(保留格式)
    規(guī)則:上標(biāo)用 ^() 包裹,下標(biāo)用 _() 包裹,普通文本直接顯示
    例:H?O → H_(2)O,92??·3 → 92^(+0.3)
    """
    full_text = ""
    # 遍歷單元格所有段落
    for paragraph in cell.paragraphs:
        # 遍歷段落內(nèi)所有文本片段(關(guān)鍵:只有Run能讀取上下標(biāo)格式)
        for run in paragraph.runs:
            text = run.text.strip()
            if not text:
                continue

            # 判斷格式:上標(biāo) / 下標(biāo) / 普通文本
            if run.font.superscript:
                full_text += f"^({text})"  # 上標(biāo)標(biāo)記
            elif run.font.subscript:
                full_text += f"_({text})"  # 下標(biāo)標(biāo)記
            else:
                full_text += text  # 普通文本
    return full_text.strip()


def read_word_tables_with_format(word_path: str, merge: bool = False):
    """
    讀取Word表格(支持上下標(biāo)),轉(zhuǎn)換為DataFrame
    :param word_path: docx文件路徑
    :param merge: 是否合并表格
    :return: DataFrame列表 / 合并后的DataFrame
    """
    doc = Document(word_path)
    df_list = []

    for table_idx, table in enumerate(doc.tables):
        table_data = []
        # 遍歷表格行
        for row in table.rows:
            # 【替換】用自定義函數(shù)讀取帶上下標(biāo)的文本
            row_data = [get_cell_formatted_text(cell) for cell in row.cells]
            table_data.append(row_data)

        if table_data:
            # 第一行作為表頭,生成DataFrame
            df = pd.DataFrame(table_data[1:], columns=table_data[0])
            df_list.append(df)
            print(f"? 第{table_idx+1}個表格讀取完成(含上下標(biāo)),形狀:{df.shape}")

    # 結(jié)構(gòu)一致時合并表格
    if merge and df_list:
        return pd.concat(df_list, ignore_index=True)
    return df_list


# ------------------- 調(diào)用示例 -------------------
if __name__ == '__main__':
    # 替換為你的Word文件路徑
    WORD_FILE = "test.docx"

    # 讀取所有表格(保留上下標(biāo))
    all_dfs = read_word_tables_with_format(WORD_FILE)

    # 打印結(jié)果
    for i, df in enumerate(all_dfs):
        print(f"\n===== 第{i+1}個表格(帶上下標(biāo))=====")
        print(df.to_string(index=False))  # 完整打印,不換行

運行結(jié)果:

升級版本說明

  • 核心改進(jìn):新增get_cell_formatted_text函數(shù),通過Run對象的font.superscriptfont.subscript屬性,精準(zhǔn)判斷上下標(biāo)格式。
  • 格式標(biāo)記規(guī)則(易讀易解析,不影響后續(xù)數(shù)據(jù)處理):
    • 上標(biāo):用^()包裹,如92??·³ → 92^(+0.3)
    • 下標(biāo):用_()包裹,如H?O → H_(2)O
    • 局限性:仍無法識別Word內(nèi)置公式,公式會被當(dāng)作普通文本或空值處理,未支持字體樣式。
    • 適用場景:含上下標(biāo)的表格(如化學(xué)公式、數(shù)學(xué)數(shù)值、學(xué)術(shù)表格),僅需保留上下標(biāo),無需處理公式。

三、進(jìn)階版本:識別Word內(nèi)置公式

在升級版本的基礎(chǔ)上,解決“Word內(nèi)置公式讀取為空”的核心痛點,通過解析公式的XML結(jié)構(gòu)(OMML格式),提取公式文本,并用專屬標(biāo)記區(qū)分,同時兼容上下標(biāo)格式,滿足學(xué)術(shù)、技術(shù)表格的核心需求。

from docx import Document
from docx.oxml.ns import qn
import pandas as pd


# ===================== 核心:解析 Word 內(nèi)置公式(解決公式為空) =====================
def parse_omath_text(omath_node):
    """遞歸解析 OMML 公式 XML,提取純文本(解決公式為空問題)"""
    text = ""
    # 遍歷公式所有子節(jié)點
    for child in omath_node.iter():
        # 提取文字節(jié)點
        if child.tag == qn("m:t"):
            if child.text:
                text += child.text
        # 提取上下標(biāo)/分?jǐn)?shù)等符號
        elif child.tag == qn("m:sup"):
            text += "^"
        elif child.tag == qn("m:sub"):
            text += "_"
        elif child.tag == qn("m:f"):
            text += "/"
    return text.strip()


# ===================== 提取單元格完整內(nèi)容(文本+上下標(biāo)+公式) =====================
def extract_cell_content(cell):
    """提取單個單元格的所有內(nèi)容,完美兼容三種格式"""
    content = ""
    # 遍歷單元格內(nèi)的所有段落
    for paragraph in cell.paragraphs:
        para_elem = paragraph._element

        # 1. 優(yōu)先檢測:段落中是否包含 Word 內(nèi)置公式(oMath)
        omath_nodes = para_elem.findall('.//m:oMath', namespaces=para_elem.nsmap)
        if omath_nodes:
            for omath in omath_nodes:
                formula_text = parse_omath_text(omath)
                content += f"【公式】{formula_text} "
            continue

        # 2. 無公式:解析普通文本 + 字體上下標(biāo)
        for run in paragraph.runs:
            run_text = run.text.strip()
            if not run_text:
                continue

            # 判斷上下標(biāo)格式
            if run.font.superscript:
                content += f"^({run_text})"
            elif run.font.subscript:
                content += f"_({run_text})"
            else:
                content += run_text

    return content.strip()


# ===================== 讀取 Word 所有表格 → DataFrame =====================
def read_word_tables_final(word_path: str, merge=False):
    """讀取文檔所有表格,生成DataFrame"""
    doc = Document(word_path)
    df_list = []

    for table_idx, table in enumerate(doc.tables):
        table_data = []
        # 遍歷表格每一行
        for row in table.rows:
            row_data = [extract_cell_content(cell) for cell in row.cells]
            table_data.append(row_data)

        # 生成DataFrame(第一行作為表頭)
        if table_data:
            df = pd.DataFrame(table_data[1:], columns=table_data[0])
            df_list.append(df)
            print(f"? 第 {table_idx+1} 個表格讀取完成 | 數(shù)據(jù)形狀:{df.shape}")

    # 合并表格(結(jié)構(gòu)一致時使用)
    if merge and df_list:
        return pd.concat(df_list, ignore_index=True)
    return df_list


# ===================== 調(diào)用測試 =====================
if __name__ == '__main__':
    # 替換為你的 Word 文件路徑
    WORD_PATH = "test.docx"

    # 讀取所有表格
    all_dataframes = read_word_tables_final(WORD_PATH)

    # 打印結(jié)果
    for i, df in enumerate(all_dataframes):
        print(f"\n" + "=" * 50)
        print(f"?? 第 {i+1} 個表格完整數(shù)據(jù)")
        print("=" * 50)
        print(df.to_string(index=False))

運行結(jié)果:

進(jìn)階版本說明

  • 核心突破:新增parse_omath_text函數(shù),遞歸解析Word公式的XML結(jié)構(gòu)(OMML格式),提取公式文本,徹底解決“公式讀取為空”的問題。
  • 優(yōu)先級邏輯:先檢測公式,再解析文本和上下標(biāo),避免公式被當(dāng)作普通文本處理,確保格式準(zhǔn)確性。
  • 公式標(biāo)記:用「【公式】」前綴標(biāo)記公式內(nèi)容,便于后續(xù)區(qū)分和單獨提取公式。
  • 局限性:未識別字體樣式(如加粗、斜體、刪除線),不支持多段落單元格和特殊符號(如制表符)。
  • 適用場景:含公式、上下標(biāo)的學(xué)術(shù)表格、技術(shù)表格,無需處理復(fù)雜字體樣式。

四、終極版本:全格式兼容(推薦使用)

整合基礎(chǔ)、升級、進(jìn)階三個版本的核心功能,實現(xiàn)「全格式兼容」,支持純文本、上下標(biāo)、Word內(nèi)置公式、字體樣式(加粗/斜體/下劃線等)、多段落單元格、制表符/手動換行,覆蓋99%的常規(guī)Word表格場景。

from docx import Document
from docx.oxml.ns import qn
import pandas as pd


# ===================== 核心1:完整解析 Word 內(nèi)置公式(OMML) =====================
def parse_omath_text(omath_node):
    """遞歸解析所有公式結(jié)構(gòu):文本、上下標(biāo)、分?jǐn)?shù)、符號等,無空值"""
    text = ""
    for child in omath_node.iter():
        # 提取公式文字
        if child.tag == qn("m:t") and child.text:
            text += child.text
        # 公式結(jié)構(gòu)標(biāo)記(上標(biāo)/下標(biāo)/分?jǐn)?shù))
        elif child.tag == qn("m:sup"):
            text += "^"
        elif child.tag == qn("m:sub"):
            text += "_"
        elif child.tag == qn("m:f"):
            text += "/"
    return text.strip()


# ===================== 核心2:全格式提取單元格內(nèi)容(100%兼容) =====================
def extract_cell_full_content(cell):
    """
    終極全兼容:提取單元格所有內(nèi)容,覆蓋所有格式/元素
    輸出:帶簡潔格式標(biāo)記的純文本,無內(nèi)容丟失
    """
    full_content = []

    # 遍歷單元格內(nèi) 所有段落(支持多段落單元格)
    for para in cell.paragraphs:
        para_elem = para._element
        para_text = ""

        # 1. 檢測并提取 Word 內(nèi)置公式(優(yōu)先級最高)
        omath_nodes = para_elem.findall('.//m:oMath', namespaces=para_elem.nsmap)
        if omath_nodes:
            for omath in omath_nodes:
                formula = parse_omath_text(omath)
                para_text += f"[公式]{formula}"
            full_content.append(para_text)
            continue

        # 2. 無公式:提取 文本+所有字體樣式+格式符號
        for run in para.runs:
            # 基礎(chǔ)文本(保留所有字符:特殊符號、空格、制表符)
            text = run.text
            if not text:
                continue

            # ---------------- 格式標(biāo)記(簡潔不冗余,不影響DataFrame使用) ----------------
            style_tags = []
            if run.font.bold:  # 加粗
                style_tags.append("粗")
            if run.font.italic:  # 斜體
                style_tags.append("斜")
            if run.font.underline:  # 下劃線
                style_tags.append("下劃")
            if run.font.strike:  # 刪除線
                style_tags.append("刪")
            if run.font.hidden:  # 隱藏文本
                style_tags.append("隱藏")
            if run.font.superscript:  # 上標(biāo)
                text = f"^({text})"
            if run.font.subscript:  # 下標(biāo)
                text = f"_({text})"

            # 拼接格式+文本
            if style_tags:
                para_text += f"[{','.join(style_tags)}]{text}"
            else:
                para_text += text

        # 清理多余空白,保留有效格式
        para_text = para_text.replace("\t", "[制表符]").replace("\n", "[換行]").strip()
        if para_text:
            full_content.append(para_text)

    # 單元格多段落用分隔符連接,保證數(shù)據(jù)完整性
    return " | ".join(full_content) if full_content else ""


# ===================== 讀取 Word 所有表格 → DataFrame =====================
def read_word_tables_ultimate(word_path: str, merge=False):
    """全兼容讀取Word表格,生成DataFrame"""
    doc = Document(word_path)
    df_list = []

    for table_idx, table in enumerate(doc.tables):
        table_data = []
        for row in table.rows:
            # 全格式提取每個單元格
            row_data = [extract_cell_full_content(cell) for cell in row.cells]
            table_data.append(row_data)

        if table_data:
            # 第一行作為表頭,無表頭可改為 pd.DataFrame(table_data)
            df = pd.DataFrame(table_data[1:], columns=table_data[0])
            df_list.append(df)
            print(f"? 第 {table_idx+1} 個表格讀取完成 | 形狀:{df.shape}")

    return pd.concat(df_list, ignore_index=True) if merge and df_list else df_list


# ===================== 調(diào)用測試 =====================
if __name__ == '__main__':
    # 替換為你的Word文件路徑
    WORD_FILE = "test.docx"

    # 讀取所有表格(全格式兼容)
    all_dfs = read_word_tables_ultimate(WORD_FILE)

    # 打印完整結(jié)果
    for i, df in enumerate(all_dfs):
        print(f"\n{'='*60}")
        print(f"?? 第 {i+1} 個表格(全格式兼容版)")
        print(f"{'='*60}")
        print(df.to_string(index=False))

運行結(jié)果:

全格式標(biāo)記說明

為了兼顧“格式保留”和“DataFrame可讀性”,采用簡潔的標(biāo)記規(guī)則,所有標(biāo)記不影響后續(xù)數(shù)據(jù)處理,可通過字符串替換批量去除:

格式類型輸出標(biāo)記示例
上標(biāo)^(文本)92??·³ → 92^(+0.3)
下標(biāo)_(文本)H?O → H_(2)O
內(nèi)置公式[公式]內(nèi)容[公式]92+0.3+0.3
加粗[粗][粗]測試
斜體+下劃線[斜,下劃][斜,下劃]測試
手動換行[換行]第一行 [換行] 第二行
制表符(Tab)[制表符]名稱 [制表符] 數(shù)值

五、終極優(yōu)化(無敵版):處理合并單元格+全格式兼容

在終極版本的基礎(chǔ)上,新增“合并單元格處理”功能,解決實際辦公中跨行/跨列合并單元格導(dǎo)致的數(shù)據(jù)重復(fù)、缺失問題,實現(xiàn)“全格式+合并單元格”雙兼容,覆蓋所有Word表格場景,真正做到無敵適配。

from docx import Document
from docx.oxml.ns import qn
import pandas as pd


# ===================== 新增:處理合并單元格(核心函數(shù)) =====================
def get_merged_cell_text(table, row_idx, col_idx):
    """
    讀取合并單元格的完整文本(解決合并單元格數(shù)據(jù)重復(fù)/缺失問題)
    :param table: 當(dāng)前表格對象
    :param row_idx: 行索引(從0開始)
    :param col_idx: 列索引(從0開始)
    :return: 合并單元格的完整文本
    """
    cell = table.cell(row_idx, col_idx)
    # 檢查單元格是否被合并(通過XML屬性判斷)
    cell_elem = cell._element
    # 跨列合并(horizontal merge)
    h_merge = cell_elem.xpath('.//w:hMerge')
    # 跨行合并(vertical merge)
    v_merge = cell_elem.xpath('.//w:vMerge')

    # 1. 若為合并單元格的“起始單元格”(包含完整文本),直接返回文本
    if (h_merge and h_merge[0].attrib.get(qn('w:val')) == 'restart') or \
       (v_merge and v_merge[0].attrib.get(qn('w:val')) == 'restart'):
        return extract_cell_full_content(cell)
    # 2. 若為合并單元格的“后續(xù)單元格”(無文本),向上/向左查找起始單元格
    elif h_merge:
        # 跨列合并:向左查找起始單元格
        return get_merged_cell_text(table, row_idx, col_idx - 1)
    elif v_merge:
        # 跨行合并:向上查找起始單元格
        return get_merged_cell_text(table, row_idx - 1, col_idx)
    # 3. 非合并單元格,直接返回文本
    else:
        return extract_cell_full_content(cell)


# ===================== 核心1:完整解析 Word 內(nèi)置公式(OMML) =====================
def parse_omath_text(omath_node):
    """遞歸解析所有公式結(jié)構(gòu):文本、上下標(biāo)、分?jǐn)?shù)、符號等,無空值"""
    text = ""
    for child in omath_node.iter():
        # 提取公式文字
        if child.tag == qn("m:t") and child.text:
            text += child.text
        # 公式結(jié)構(gòu)標(biāo)記(上標(biāo)/下標(biāo)/分?jǐn)?shù))
        elif child.tag == qn("m:sup"):
            text += "^"
        elif child.tag == qn("m:sub"):
            text += "_"
        elif child.tag == qn("m:f"):
            text += "/"
    return text.strip()


# ===================== 核心2:全格式提取單元格內(nèi)容(100%兼容) =====================
def extract_cell_full_content(cell):
    """
    終極全兼容:提取單元格所有內(nèi)容,覆蓋所有格式/元素
    輸出:帶簡潔格式標(biāo)記的純文本,無內(nèi)容丟失
    """
    full_content = []

    # 遍歷單元格內(nèi) 所有段落(支持多段落單元格)
    for para in cell.paragraphs:
        para_elem = para._element
        para_text = ""

        # 1. 檢測并提取 Word 內(nèi)置公式(優(yōu)先級最高)
        omath_nodes = para_elem.findall('.//m:oMath', namespaces=para_elem.nsmap)
        if omath_nodes:
            for omath in omath_nodes:
                formula = parse_omath_text(omath)
                para_text += f"[公式]{formula}"
            full_content.append(para_text)
            continue

        # 2. 無公式:提取 文本+所有字體樣式+格式符號
        for run in para.runs:
            # 基礎(chǔ)文本(保留所有字符:特殊符號、空格、制表符)
            text = run.text
            if not text:
                continue

            # ---------------- 格式標(biāo)記(簡潔不冗余,不影響DataFrame使用) ----------------
            style_tags = []
            if run.font.bold:  # 加粗
                style_tags.append("粗")
            if run.font.italic:  # 斜體
                style_tags.append("斜")
            if run.font.underline:  # 下劃線
                style_tags.append("下劃")
            if run.font.strike:  # 刪除線
                style_tags.append("刪")
            if run.font.hidden:  # 隱藏文本
                style_tags.append("隱藏")
            if run.font.superscript:  # 上標(biāo)
                text = f"^({text})"
            if run.font.subscript:  # 下標(biāo)
                text = f"_({text})"

            # 拼接格式+文本
            if style_tags:
                para_text += f"[{','.join(style_tags)}]{text}"
            else:
                para_text += text

        # 清理多余空白,保留有效格式
        para_text = para_text.replace("\t", "[制表符]").replace("\n", "[換行]").strip()
        if para_text:
            full_content.append(para_text)

    # 單元格多段落用分隔符連接,保證數(shù)據(jù)完整性
    return " | ".join(full_content) if full_content else ""


# ===================== 全兼容讀?。ê喜卧瘢?=====================
def read_word_tables_ultimate_with_merge(word_path: str, merge=False):
    """全兼容讀取Word表格(支持合并單元格+所有格式),生成DataFrame"""
    doc = Document(word_path)
    df_list = []

    for table_idx, table in enumerate(doc.tables):
        table_data = []
        # 獲取表格總行數(shù)和總列數(shù)
        row_count = len(table.rows)
        col_count = len(table.columns)

        # 遍歷表格每一行、每一列,處理合并單元格
        for row_idx in range(row_count):
            row_data = []
            for col_idx in range(col_count):
                # 讀取合并單元格的完整文本
                cell_text = get_merged_cell_text(table, row_idx, col_idx)
                row_data.append(cell_text)
            table_data.append(row_data)

        if table_data:
            # 第一行作為表頭,無表頭可改為 pd.DataFrame(table_data)
            df = pd.DataFrame(table_data[1:], columns=table_data[0])
            df_list.append(df)
            print(f"? 第 {table_idx+1} 個表格讀取完成(含合并單元格),形狀:{df.shape}")

    return pd.concat(df_list, ignore_index=True) if merge and df_list else df_list


# ===================== 調(diào)用測試(含合并單元格) =====================
if __name__ == '__main__':
    # 替換為你的Word文件路徑
    WORD_FILE = "test.docx"

    # 讀取所有表格(全格式+合并單元格兼容)
    all_dfs = read_word_tables_ultimate_with_merge(WORD_FILE)

    # 打印完整結(jié)果
    for i, df in enumerate(all_dfs):
        print(f"\n{'='*60}")
        print(f"?? 第 {i+1} 個表格(全格式+合并單元格版)")
        print(f"{'='*60}")
        print(df.to_string(index=False))

運行結(jié)果:

無敵版說明

  • 核心優(yōu)化:新增get_cell_formatted_text函數(shù),通過解析Word表格的XML屬性(w:hMerge、w:vMerge),自動識別跨行、跨列合并單元格,避免數(shù)據(jù)重復(fù)或缺失。
  • 功能整合:完全繼承終極版本的全格式兼容能力,同時新增合并單元格處理,實現(xiàn)“格式無丟失+合并單元格無異常”雙保障。
  • 使用便捷:無需手動修改代碼,替換終極版本的調(diào)用函數(shù)即可,自動適配所有表格場景,新手也能直接使用。
  • 適用場景:所有Word表格(含合并單元格、公式、上下標(biāo)、字體樣式等),尤其適合復(fù)雜辦公表格、學(xué)術(shù)表格、技術(shù)表格。

六、五個版本對比與選擇建議

為方便大家按需選用,整理5個版本的核心差異、優(yōu)缺點及適用場景,一目了然:

版本核心功能適用場景優(yōu)點缺點
基礎(chǔ)版純文本表格讀取簡單純文本表格代碼簡潔,運行快不支持任何格式
升級版本支持上下標(biāo)含上下標(biāo)的表格保留上下標(biāo),標(biāo)記清晰不支持公式、字體樣式
進(jìn)階版本支持上下標(biāo)+公式學(xué)術(shù)/技術(shù)表格(含公式)解決公式為空問題不支持字體樣式、多段落
終極版本全格式兼容(無合并單元格)無合并單元格的復(fù)雜表格格式無丟失,兼容性強合并單元格支持不友好
無敵版全格式+合并單元格所有場景(推薦)全場景適配,無短板代碼稍復(fù)雜,運行略慢

七、注意事項(必看)

  • 文件格式:僅支持 .docx 格式,.doc 格式需先轉(zhuǎn)換為 .docx(可通過Word另存為實現(xiàn)),否則會報錯。
  • 文件路徑:Windows系統(tǒng)路徑需用 / 或雙斜杠 \\(如 "C:/test.docx""C:\\test.docx"),避免路徑錯誤導(dǎo)致讀取失敗。
  • 表格結(jié)構(gòu):默認(rèn)第一行為表頭,若表格無表頭,需修改代碼中的 pd.DataFrame 部分(刪除table_data[1:]columns=table_data[0])。
  • 公式兼容性:僅支持Word內(nèi)置公式(OMML格式),不支持插入的圖片公式(圖片公式需額外結(jié)合OCR識別工具)。
  • 合并表格:僅當(dāng)所有表格的列名完全一致時,合并功能(merge=True)才有效,否則會出現(xiàn)列名錯亂、數(shù)據(jù)錯位。
  • 合并單元格:無敵版僅支持Word原生合并單元格,不支持手動繪制的合并效果(手動繪制表格需先轉(zhuǎn)為原生表格)。

八、總結(jié)

本文按“基礎(chǔ)→升級→進(jìn)階→終極→無敵”的遞進(jìn)邏輯,提供了5個可直接運行的Python讀取Word表格版本,從簡單純文本到復(fù)雜全格式+合并單元格,逐步解決實際應(yīng)用中的痛點:

  • 簡單需求:基礎(chǔ)版(純文本讀取,快速高效)
  • 含上下標(biāo):升級版本(保留上下標(biāo),適配化學(xué)/數(shù)學(xué)表格)
  • 含公式:進(jìn)階版本(解決公式為空,適配學(xué)術(shù)表格)
  • 復(fù)雜格式:終極版本(全格式兼容,無合并單元格場景)
  • 萬能適配:無敵版(全格式+合并單元格,覆蓋所有場景,優(yōu)先推薦)

所有代碼均可直接復(fù)制運行,只需替換WORD_FILE 為自己的Word文件路徑即可。

以上就是Python批量讀取Word表格的常用方法匯總的詳細(xì)內(nèi)容,更多關(guān)于Python批量讀取Word表格的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • python SQLAlchemy的Mapping與Declarative詳解

    python SQLAlchemy的Mapping與Declarative詳解

    這篇文章主要介紹了python SQLAlchemy的Mapping與Declarative詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-07-07
  • Python使用Beautiful Soup包編寫爬蟲時的一些關(guān)鍵點

    Python使用Beautiful Soup包編寫爬蟲時的一些關(guān)鍵點

    這篇文章主要介紹了Python使用Beautiful Soup包編寫爬蟲時的一些關(guān)鍵點,文中講到了parent屬性的使用以及soup的編碼問題,需要的朋友可以參考下
    2016-01-01
  • python基礎(chǔ)之變量和數(shù)據(jù)類型

    python基礎(chǔ)之變量和數(shù)據(jù)類型

    這篇文章主要介紹了python的變量和數(shù)據(jù)類型,實例分析了Python中返回一個返回值與多個返回值的方法,需要的朋友可以參考下
    2021-10-10
  • Python入門經(jīng)典題目實戰(zhàn)應(yīng)用指南

    Python入門經(jīng)典題目實戰(zhàn)應(yīng)用指南

    Python作為一門易學(xué)且功能強大的編程語言,是初學(xué)者入門編程的理想選擇,通過解決實際問題,我們可以更好地理解和掌握Python的基礎(chǔ)知識,這篇文章主要介紹了Python入門經(jīng)典題目實戰(zhàn)應(yīng)用的相關(guān)資料,需要的朋友可以參考下
    2025-10-10
  • python 如何比較兩集合的大小關(guān)系

    python 如何比較兩集合的大小關(guān)系

    這篇文章主要介紹了python 比較兩集合的大小關(guān)系操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • python excel轉(zhuǎn)換csv代碼實例

    python excel轉(zhuǎn)換csv代碼實例

    這篇文章主要介紹了python excel轉(zhuǎn)換csv代碼實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-08-08
  • python中使用matplotlib繪制熱力圖

    python中使用matplotlib繪制熱力圖

    熱力圖,是一種通過對色塊著色來顯示數(shù)據(jù)的統(tǒng)計圖表,它通過使用顏色編碼來表示數(shù)據(jù)的值,并在二維平面上呈現(xiàn)出來,本文就給大家介紹一下python使用matplotlib繪制熱力圖的方法,需要的朋友可以參考下
    2023-08-08
  • Python實現(xiàn)讀取大量Excel文件并跨文件批量計算平均值

    Python實現(xiàn)讀取大量Excel文件并跨文件批量計算平均值

    這篇文章主要為大家詳細(xì)介紹了如何利用Python語言,實現(xiàn)對多個不同Excel文件進(jìn)行數(shù)據(jù)讀取與平均值計算的方法,感興趣的可以了解一下
    2023-02-02
  • Python高光譜遙感影像處理問題詳細(xì)分析講解

    Python高光譜遙感影像處理問題詳細(xì)分析講解

    這篇文章主要介紹了Python高光譜遙感影像處理問題,總的來說這并不是一道難題,那為什么要拿出這道題介紹?拿出這道題真正想要傳達(dá)的是解題的思路,以及不斷優(yōu)化探尋最優(yōu)解的過程。希望通過這道題能給你帶來一種解題優(yōu)化的思路
    2023-01-01
  • python如何實現(xiàn)排序,并標(biāo)上序號

    python如何實現(xiàn)排序,并標(biāo)上序號

    這篇文章主要介紹了python如何實現(xiàn)排序,并標(biāo)上序號,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06

最新評論

海宁市| 兴隆县| 高雄县| 江都市| 永新县| 江陵县| 韶关市| 河南省| 宁化县| 巴东县| 福鼎市| 明水县| 广灵县| 台北市| 泸水县| 高州市| 阜南县| 新乐市| 三穗县| 安宁市| 芦溪县| 枞阳县| 芒康县| 京山县| 石林| 罗定市| 文昌市| 图们市| 前郭尔| 三亚市| 平山县| 郸城县| 三原县| 大石桥市| 皮山县| 武夷山市| 类乌齐县| 永吉县| 佛山市| 隆子县| 马公市|