颂风侯 发表于 2024-11-19 10:57:36

复杂的吸收word到excel

用tkinter指定一个.doc或者.docx的文件,
再用tkinter指定一个文件夹位置
将.doc或者.docx的文件中所有的表格按以下要求导出数据
1、去除前四行数据
2、去除空行
3、对第8,9,10列含有回车的,做成两行,一行为回车前数据,一行为回车后数据 导出的数据,在指定的文件夹位置新建一个名字为“整理数据.xlsx”,将数据保存到这个excel文件中去,
以上代码按竖行每个代码一行写

FishC 发表于 2024-11-19 11:03:02

以下是简化版的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:# 忽略前四行
      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 :
    df = df.apply(lambda x: x.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 小助理,如未能正确解答您的问题,请继续追问。

颂风侯 发表于 2024-11-19 12:51:56

TypeError: replace_text_in_dxf.<locals>.<lambda>() got an unexpected keyword argument 'axis'
出错了,这个错误提示

FishC 发表于 2024-11-19 12:52:07

颂风侯 发表于 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 :# 假设第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).reset_index(drop=True)

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

颂风侯 发表于 2024-11-19 12:53:46

而且这个回车是在word的表格里才有的,读取成dataframe就看不到了

FishC 发表于 2024-11-19 12:53:56

颂风侯 发表于 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()
      
      # 展开多维列表,形成可处理的DataFrame格式
      new_row =
      
      # 只添加非空行并忽略前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 小助理,如未能正确解答您的问题,请继续追问。

颂风侯 发表于 2024-11-19 13:17:06

测试的结果还是不对,应该是对于8,9,10列里面有换行的,对于该行,复制成两行,第一行是对8,9,10列而言用了换行前的内容,第二行是对8,9,10列而言用了换行后的内容,旧的行不用了,新的两行加入到新的dataframe中去

FishC 发表于 2024-11-19 13:17:16

颂风侯 发表于 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 =
      data.append(new_row)

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

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

# 循环处理每一行
for idx, row in df.iterrows():
    # 分别处理8, 9, 10列
    split_rows =
   
    for col_idx in :# 对应第8, 9, 10列
      cell_value = row
      if '\n' in cell_value:
            parts = cell_value.split('\n')
            # 创建新行并替换含换行符的列
            for i, part in enumerate(parts):
                if i == 0:
                  split_rows = part
                else:
                  new_row = row.copy()
                  new_row = 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 小助理,如未能正确解答您的问题,请继续追问。

颂风侯 发表于 2024-11-19 13:28:37

感觉不太对,我没测试,但是这个换行符要在转为dataframe之前判断,转了dataframe就无法判断了,能再转dataframe之前判断分行吗

FishC 发表于 2024-11-19 13:28:46

颂风侯 发表于 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 =
      
      # 检查第8, 9, 10列是否包含换行符
      split_needed = False
      split_parts = [[] for _ in range(3)]
      
      for i in range(3):
            if '\n' in row_data:
                split_needed = True
                split_parts = row_data.split('\n')
            else:
                split_parts.append(row_data)
      
      if split_needed:
            # 创建新行
            for parts in zip(*split_parts):
                new_row = row_data[:7] + list(parts) + row_data
                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 小助理,如未能正确解答您的问题,请继续追问。

颂风侯 发表于 2024-11-19 14:13:28

根据这个自己改了下已经解决了,谢谢AI老师,我表述的还是不清除。搞定了,谢谢

FishC 发表于 2024-11-19 14:14:35

颂风侯 发表于 2024-11-19 14:13
根据这个自己改了下已经解决了,谢谢AI老师,我表述的 ...

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 复杂的吸收word到excel