鱼C论坛

 找回密码
 立即注册
查看: 43|回复: 11

[已解决]复杂的吸收word到excel

[复制链接]
发表于 前天 10:57 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
用tkinter指定一个.doc或者.docx的文件,
再用tkinter指定一个文件夹位置
将.doc或者.docx的文件中所有的表格按以下要求导出数据
1、去除前四行数据
2、去除空行
3、对第8,9,10列含有回车的,做成两行,一行为回车前数据,一行为回车后数据 导出的数据,在指定的文件夹位置新建一个名字为“整理数据.xlsx”,将数据保存到这个excel文件中去,
以上代码按竖行每个代码一行写
最佳答案
前天 13:28
颂风侯 发表于 2024-11-19 13:28
感觉不太对,我没测试,但是这个换行符要在转为datafr ...


明白了,我们可以在从Word文档读取数据时,直接处理换行符并转换为结构化的数据。这样在生成DataFrame之前就已处理好。以下是按您要求的代码逻辑:
import tkinter as tk
from tkinter import filedialog
import pandas as pd
import docx

# 创建并配置窗口
root = tk.Tk()
root.withdraw()

# 文件选择
doc_path = filedialog.askopenfilename(title="选择一个.doc或.docx文件", filetypes=(("Word文件", "*.docx"), ("所有文件", "*.*")))
folder_path = filedialog.askdirectory(title="选择保存目录")

# 读取Word文档
doc = docx.Document(doc_path)

# 创建列表保存新数据
new_data = []

# 处理表格数据
for table in doc.tables:
    for row_idx, row in enumerate(table.rows):
        if row_idx < 4:  # 去除前四行
            continue
        
        row_data = [cell.text.strip() for cell in row.cells]
        
        # 检查第8, 9, 10列是否包含换行符
        split_needed = False
        split_parts = [[] for _ in range(3)]
        
        for i in range(3):
            if '\n' in row_data[7 + i]:
                split_needed = True
                split_parts[i] = row_data[7 + i].split('\n')
            else:
                split_parts[i].append(row_data[7 + i])
        
        if split_needed:
            # 创建新行
            for parts in zip(*split_parts):
                new_row = row_data[:7] + list(parts) + row_data[10:]
                new_data.append(new_row)
        else:
            new_data.append(row_data)

# 创建DataFrame
df = pd.DataFrame(new_data)

# 保存数据到Excel
save_path = f"{folder_path}/整理数据.xlsx"
df.to_excel(save_path, index=False)
print(f"数据已保存到:{save_path}")

关键步骤说明:
1. 在读取Word表格时,根据单元格内容处理换行符,在第8, 9, 10列中识别换行符并拆分数据。
2. 根据拆分后的内容,生成多行数据以确保不同换行段的正确展现。
3. 生成的结构化数据再用作构建DataFrame,最后输出到Excel。

请确保安装了所需的Python库,包括`pandas`和`python-docx`。注意,这个代码假设表格中的换行符只会出现在第8, 9, 10列中。调整列索引可以适配不同结构的Word表格。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 前天 11:03 | 显示全部楼层
以下是简化版的Python代码,使用tkinter选择文件和文件夹,然后处理Word文档中的表格数据并导出到Excel文件。为确保代码可读性,省略了详细错误处理和特定环境配置代码:
import tkinter as tk
from tkinter import filedialog
import pandas as pd
import docx

# 创建并配置窗口
root = tk.Tk()
root.withdraw()

# 打开文件选择对话框,选择Word文件
doc_path = filedialog.askopenfilename(title="选择一个.doc或.docx文件",
                                      filetypes=(("Word文件", "*.docx"), ("所有文件", "*.*")))

# 打开文件夹选择对话框,选择保存目录
folder_path = filedialog.askdirectory(title="选择保存目录")

# 读取Word文档
doc = docx.Document(doc_path)

# 提取所有表格数据
data = []
for table in doc.tables:
    for row in table.rows[4:]:  # 忽略前四行
        new_row = []
        for cell in row.cells:
            new_row.append(cell.text.strip())
        if any(new_row):  # 去掉空行
            data.append(new_row)

# 创建DataFrame
df = pd.DataFrame(data)

# 处理第8,9,10列的回车
for col in [8, 9, 10]:
    df = df.apply(lambda x: x[col].split('\n'), axis=1).explode().reset_index(drop=True)

# 保存到指定目录中的Excel文件
save_path = f"{folder_path}/整理数据.xlsx"
df.to_excel(save_path, index=False)

print(f"数据已保存到:{save_path}")

注意:此代码仅为示例,可能需要根据实际Word文档结构进行调整。例如,确保列索引在数据范围内,并且pandas和python-docx库已经安装。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 前天 12:51 | 显示全部楼层
TypeError: replace_text_in_dxf.<locals>.<lambda>() got an unexpected keyword argument 'axis'
出错了,这个错误提示
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 前天 12:52 | 显示全部楼层
颂风侯 发表于 2024-11-19 12:51
TypeError: replace_text_in_dxf..() got an unexpect ...


这个错误提示表明,在你的代码中调用了一些函数时,传递了一个名为'axis'的关键字参数,但该函数不接受这个参数。这个问题可能出现在以下代码片段中:
df = df.apply(lambda x: x.split('\n'), axis=1).explode().reset_index(drop=True)

在Pandas库中,`apply`方法确实有一个`axis`参数,但是这个用法通常在DataFrame上生效。如果你操作的是DataFrame的特定列(Series),就不需要这个参数。以下是一个可能的解决方案:
for col in [7, 8, 9]:  # 假设第8,9,10列对应的索引是7,8,9
    df.iloc[:, col] = df.iloc[:, col].apply(lambda x: x.split('\n') if isinstance(x, str) else x)
    df = df.explode(df.columns[col]).reset_index(drop=True)

请确保在处理前,你的DataFrame中有正确的列和行索引,并且pandas库已经被正确导入。如果其他部分有问题,您也可以从错误提示中找到具体位置进行查看和修正。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 前天 12:53 | 显示全部楼层
而且这个回车是在word的表格里才有的,读取成dataframe就看不到了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 前天 12:53 | 显示全部楼层
颂风侯 发表于 2024-11-19 12:53
而且这个回车是在word的表格里才有的,读取成datafram ...


理解您的问题,读取Word文档后,某些单元格中的换行可能在DataFrame显示时被忽略。我们需要在读取Word文档时就处理这些换行。在 `docx` 模块中读取内容时,可以先处理换行再存储数据。以下是调整后的代码思路:
import tkinter as tk
from tkinter import filedialog
import pandas as pd
import docx

# 创建并配置窗口
root = tk.Tk()
root.withdraw()

# 打开文件选择对话框,选择Word文件
doc_path = filedialog.askopenfilename(title="选择一个.doc或.docx文件", filetypes=[("Word文件", "*.docx"), ("所有文件", "*.*")])

# 打开文件夹选择对话框,选择保存目录
folder_path = filedialog.askdirectory(title="选择保存目录")

# 读取Word文档
doc = docx.Document(doc_path)

# 提取所有表格数据
data = []
for table in doc.tables:
    for row in table.rows:
        new_row = []
        for cell in row.cells:
            text = cell.text.strip()
            # 将换行符处理为列表中的多项
            if '\n' in text:
                new_row.append(text.split('\n'))
            else:
                new_row.append([text])
        
        # 展开多维列表,形成可处理的DataFrame格式
        new_row = [item for sublist in new_row for item in sublist]
        
        # 只添加非空行并忽略前4行
        if any(new_row) and len(data) >= 4:
            data.append(new_row)

# 创建DataFrame
df = pd.DataFrame(data)

# 保存到指定目录中的Excel文件
save_path = f"{folder_path}/整理数据.xlsx"
df.to_excel(save_path, index=False)

print(f"数据已保存到:{save_path}")

关键步骤:
1. 在读取每个单元格内容时,使用 `cell.text.split('\n')` 将含有换行符的单元格拆分为多个元素。
2. 去除DataFrame中的前四行,确保只保留需要的内容。
3. 在保存至Excel文件前,确保数据结构完整,便于处理各类复杂文本格式。

此代码假定您使用的是 `.docx` 文件格式,并且使用了 `python-docx` 和 `pandas` 库。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 前天 13:17 | 显示全部楼层
测试的结果还是不对,应该是对于8,9,10列里面有换行的,对于该行,复制成两行,第一行是对8,9,10列而言用了换行前的内容,第二行是对8,9,10列而言用了换行后的内容,旧的行不用了,新的两行加入到新的dataframe中去
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 前天 13:17 | 显示全部楼层
颂风侯 发表于 2024-11-19 13:17
测试的结果还是不对,应该是对于8,9,10列里面有换行的 ...


明白了!你希望将8, 9, 10列中有换行符的行,根据换行符拆分成两行。以下是实现这一功能的具体代码:
import tkinter as tk
from tkinter import filedialog
import pandas as pd
import docx

# 创建并配置窗口
root = tk.Tk()
root.withdraw()

# 打开文件选择对话框,选择Word文件
doc_path = filedialog.askopenfilename(title="选择一个.doc或.docx文件", filetypes=(("Word文件", "*.docx"), ("所有文件", "*.*")))

# 打开文件夹选择对话框,选择保存目录
folder_path = filedialog.askdirectory(title="选择保存目录")

# 读取Word文档
doc = docx.Document(doc_path)

# 提取表格数据
data = []
for table in doc.tables:
    for row in table.rows:
        new_row = [cell.text.strip() for cell in row.cells]
        data.append(new_row)

# 创建DataFrame并去掉前四行
df = pd.DataFrame(data[4:])

# 创建新的DataFrame用于存储处理后的数据
new_data = []

# 循环处理每一行
for idx, row in df.iterrows():
    # 分别处理8, 9, 10列
    split_rows = [row]
    
    for col_idx in [7, 8, 9]:  # 对应第8, 9, 10列
        cell_value = row[col_idx]
        if '\n' in cell_value:
            parts = cell_value.split('\n')
            # 创建新行并替换含换行符的列
            for i, part in enumerate(parts):
                if i == 0:
                    split_rows[0][col_idx] = part
                else:
                    new_row = row.copy()
                    new_row[col_idx] = part
                    new_data.append(new_row)

    # 如果该行没有被分割,直接添加
    if len(split_rows) == 1:
        new_data.append(row)

# 保存到指定目录中的Excel文件
final_df = pd.DataFrame(new_data)
save_path = f"{folder_path}/整理数据.xlsx"
final_df.to_excel(save_path, index=False)

print(f"数据已保存到:{save_path}")

此代码的关键点:
1. 使用 `split('\n')` 对含换行符的单元格进行拆分。
2. 如果发现有换行符,则复制该行,并将换行前后的内容分别放入8, 9, 10列的新行中。
3. 每行处理完毕后,结果存入 `new_data` 列表,并最终创建新的 DataFrame 保存到Excel。

请确保安装了 `pandas` 和 `python-docx` 库以支持脚本运行。注意:列索引是从0开始的,所以第8列索引为7,第9列为8,依此类推。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 前天 13:28 | 显示全部楼层
感觉不太对,我没测试,但是这个换行符要在转为dataframe之前判断,转了dataframe就无法判断了,能再转dataframe之前判断分行吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 前天 13:28 | 显示全部楼层    本楼为最佳答案   
颂风侯 发表于 2024-11-19 13:28
感觉不太对,我没测试,但是这个换行符要在转为datafr ...


明白了,我们可以在从Word文档读取数据时,直接处理换行符并转换为结构化的数据。这样在生成DataFrame之前就已处理好。以下是按您要求的代码逻辑:
import tkinter as tk
from tkinter import filedialog
import pandas as pd
import docx

# 创建并配置窗口
root = tk.Tk()
root.withdraw()

# 文件选择
doc_path = filedialog.askopenfilename(title="选择一个.doc或.docx文件", filetypes=(("Word文件", "*.docx"), ("所有文件", "*.*")))
folder_path = filedialog.askdirectory(title="选择保存目录")

# 读取Word文档
doc = docx.Document(doc_path)

# 创建列表保存新数据
new_data = []

# 处理表格数据
for table in doc.tables:
    for row_idx, row in enumerate(table.rows):
        if row_idx < 4:  # 去除前四行
            continue
        
        row_data = [cell.text.strip() for cell in row.cells]
        
        # 检查第8, 9, 10列是否包含换行符
        split_needed = False
        split_parts = [[] for _ in range(3)]
        
        for i in range(3):
            if '\n' in row_data[7 + i]:
                split_needed = True
                split_parts[i] = row_data[7 + i].split('\n')
            else:
                split_parts[i].append(row_data[7 + i])
        
        if split_needed:
            # 创建新行
            for parts in zip(*split_parts):
                new_row = row_data[:7] + list(parts) + row_data[10:]
                new_data.append(new_row)
        else:
            new_data.append(row_data)

# 创建DataFrame
df = pd.DataFrame(new_data)

# 保存数据到Excel
save_path = f"{folder_path}/整理数据.xlsx"
df.to_excel(save_path, index=False)
print(f"数据已保存到:{save_path}")

关键步骤说明:
1. 在读取Word表格时,根据单元格内容处理换行符,在第8, 9, 10列中识别换行符并拆分数据。
2. 根据拆分后的内容,生成多行数据以确保不同换行段的正确展现。
3. 生成的结构化数据再用作构建DataFrame,最后输出到Excel。

请确保安装了所需的Python库,包括`pandas`和`python-docx`。注意,这个代码假设表格中的换行符只会出现在第8, 9, 10列中。调整列索引可以适配不同结构的Word表格。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 前天 14:13 | 显示全部楼层
根据这个自己改了下已经解决了,谢谢AI老师,我表述的还是不清除。搞定了,谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 前天 14:14 | 显示全部楼层
颂风侯 发表于 2024-11-19 14:13
根据这个自己改了下已经解决了,谢谢AI老师,我表述的 ...


不客气,很高兴听到你解决了问题!如果将来还有什么问题或需要帮助,随时可以询问。祝你今后的学习和编程之旅一帆风顺!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-21 17:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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