使用Python对Excel表内容进行中文提取的示例代码

作者:

文章目录
  • 本项目是基于Tkinter的图形界面应用程序,用于从Excel文件中提取符合特定正则表达式模式(默认提取中文)的文本内容,并将结果输出到指定列或新文件中
  • import os import re import tkinter as tk from tkinter import filedialog, messagebox, ttk from openpyxl import load_workbook class ExcelChineseExtractorApp: def __init__(self, root): self.root = root self.root.title(“Excel 中文提取工具”) self.root.geometry(“800×500″) self.default_regex = r”[u4e00-u9fa5]+” self.input_file = tk.StringVar() self.output_dir = tk.StringVar() self.regex_pattern = tk.StringVar(value=self.default_regex) self.input_column = tk.StringVar(value=”A”) self.output_column = tk.StringVar(value=”B”) self.overwrite_mode = tk.BooleanVar(value=False) self.create_widgets() def create_widgets(self): main_frame = tk.Frame(self.root, padx=10, pady=10) main_frame.pack(fill=”both”, expand=True) tk.Label(main_frame, text=”1. 选择 Excel 文件:”, anchor=”w”).pack(fill=”x”, pady=(5, 0)) file_frame = tk.Frame(main_frame) file_frame.pack(fill=”x”, pady=5) tk.Entry(file_frame, textvariable=self.input_file, width=60).pack(side=”left”, expand=True, fill=”x”) tk.Button(file_frame, text=”浏览…”, command=self.browse_input_file).pack(side=”right”, padx=5) tk.Label(main_frame, text=”2. 选择输出目录:”, anchor=”w”).pack(fill=”x”, pady=(5, 0)) output_frame = tk.Frame(main_frame) output_frame.pack(fill=”x”, pady=5) tk.Entry(output_frame, textvariable=self.output_dir, width=60).pack(side=”left”, expand=True, fill=”x”) tk.Button(output_frame, text=”浏览…”, command=self.browse_output_dir).pack(side=”right”, padx=5) tk.Label(main_frame, text=”3. 自定义正则表达式(默认提取中文):”, anchor=”w”).pack(fill=”x”, pady=(5, 0)) regex_frame = tk.Frame(main_frame) regex_frame.pack(fill=”x”, pady=5) tk.Entry(regex_frame, textvariable=self.regex_pattern, width=60).pack(side=”left”, expand=True, fill=”x”) tk.Button(regex_frame, text=”恢复默认”, command=self.reset_regex).pack(side=”right”, padx=5) col_frame = tk.Frame(main_frame) col_frame.pack(fill=”x”, pady=5) tk.Label(col_frame, text=”4. 处理列(如 A):”).pack(side=”left”) tk.Entry(col_frame, textvariable=self.input_column, width=5).pack(side=”left”, padx=5) tk.Label(col_frame, text=”输出列(如 B):”).pack(side=”left”) tk.Entry(col_frame, textvariable=self.output_column, width=5).pack(side=”left”, padx=5) adv_frame = tk.LabelFrame(main_frame, text=”高级选项”, padx=10, pady=10) adv_frame.pack(fill=”x”, pady=10) tk.Checkbutton(adv_frame, text=”覆盖原文件(不创建新文件)”, variable=self.overwrite_mode).pack(anchor=”w”) tk.Button( main_frame, text=”开始提取”, command=self.run_extraction, bg=”#4CAF50″, fg=”white”, height=2, font=(“Arial”, 12, “bold”) ).pack(fill=”x”, pady=10) self.progress = ttk.Progressbar(main_frame, orient=”horizontal”, length=700, mode=”determinate”) self.progress.pack(pady=10) def browse_input_file(self): filepath = filedialog.askopenfilename( title=”选择 Excel 文件”, filetypes=[(“Excel 文件”, “*.xlsx”), (“所有文件”, “*.*”)] ) if filepath: self.input_file.set(filepath) self.output_dir.set(os.path.dirname(filepath)) def browse_output_dir(self): dirpath = filedialog.askdirectory(title=”选择输出目录”) if dirpath: self.output_dir.set(dirpath) def reset_regex(self): self.regex_pattern.set(self.default_regex) def run_extraction(self): input_path = self.input_file.get() output_dir = self.output_dir.get() regex = self.regex_pattern.get() input_col = self.input_column.get().upper() output_col = self.output_column.get().upper() overwrite = self.overwrite_mode.get() if not input_path or not output_dir: messagebox.showwarning(“警告”, “请选择输入文件和输出目录!”) return try: wb = load_workbook(input_path) ws = wb.active total_rows = ws.max_row self.progress[“maximum”] = total_rows self.progress[“value”] = 0 for row in range(2, total_rows + 1): cell_value = str(ws[f”{input_col}{row}”].value) if ws[f”{input_col}{row}”].value else “” matches = re.findall(regex, cell_value) extracted_text = ” “.join(matches) if matches else “” ws[f”{output_col}{row}”].value = extracted_text self.progress[“value”] = row self.root.update() if overwrite: output_path = input_path else: filename = os.path.basename(input_path) output_path = os.path.join(output_dir, f”提取结果_{filename}”) wb.save(output_path) messagebox.showinfo(“成功”, f”提取完成!n结果已保存至:n{output_path}”) except Exception as e: messagebox.showerror(“错误”, f”处理失败:n{str(e)}”) finally: self.progress[“value”] = 0 if __name__ == “__main__”: root = tk.Tk() app = ExcelChineseExtractorApp(root) root.mainloop()
  • 目录
    • 一:效果展示:
    • 二:功能描述:
      • 1. 核心功能
        • (1)中文内容提取
        • (2)文件处理
      • 2. 用户界面功能
        • (1)直观的图形界面
        • (2)主要组件
      • 3. 使用场景
      • 三:完整代码:
        • 四:代码分析:
          • 1. 导入模块
            • 2. 主应用类
              • 3. 界面创建方法
                • 4. 文件浏览方法
                  • 5. 核心提取功能

                  本项目是基于Tkinter的图形界面应用程序,用于从Excel文件中提取符合特定正则表达式模式(默认提取中文)的文本内容,并将结果输出到指定列或新文件中

                  • 默认使用正则表达式 [u4e00-u9fa5]+ 匹配所有中文字符
                  • 可自定义正则表达式模式提取特定内容
                  • 将匹配到的内容从输入列提取到输出列

                  • 支持选择输入 Excel 文件(.xlsx 格式)
                  • 支持选择输出目录
                  • 可选择覆盖原文件或创建新文件(自动在原文件名前添加 “提取结果_” 前缀)

                  • 清晰的输入字段和按钮
                  • 进度条显示处理进度

                  • 文件选择区域:浏览并选择输入 Excel 文件和输出目录
                  • 正则表达式设置:可自定义或恢复默认中文提取模式
                  • 列设置:指定输入列和输出列(默认为 A 列到 B 列)
                  • 高级选项:覆盖模式开关
                  • 按钮——开始处理

                  • 数据清洗: 从混合内容中提取纯中文信息
                  • 文本分析预处理: 为后续的中文自然语言处理准备数据
                  • 内容迁移: 将分散在各处的中文内容集中到特定列
                  • 多语言文档处理: 分离中文和其他语言内容

                  import os
                  import re
                  import tkinter as tk
                  from tkinter import filedialog, messagebox, ttk
                  from openpyxl import load_workbook
                  
                  class ExcelChineseExtractorApp:
                      def __init__(self, root):
                          self.root = root
                          self.root.title("Excel 中文提取工具")
                          self.root.geometry("800x500")
                          self.default_regex = r"[u4e00-u9fa5]+"
                          self.input_file = tk.StringVar()
                          self.output_dir = tk.StringVar()
                          self.regex_pattern = tk.StringVar(value=self.default_regex)
                          self.input_column = tk.StringVar(value="A")
                          self.output_column = tk.StringVar(value="B")
                          self.overwrite_mode = tk.BooleanVar(value=False)
                          self.create_widgets()
                  
                      def create_widgets(self):
                          main_frame = tk.Frame(self.root, padx=10, pady=10)
                          main_frame.pack(fill="both", expand=True)
                  
                          tk.Label(main_frame, text="1. 选择 Excel 文件:", anchor="w").pack(fill="x", pady=(5, 0))
                          file_frame = tk.Frame(main_frame)
                          file_frame.pack(fill="x", pady=5)
                          tk.Entry(file_frame, textvariable=self.input_file, width=60).pack(side="left", expand=True, fill="x")
                          tk.Button(file_frame, text="浏览...", command=self.browse_input_file).pack(side="right", padx=5)
                  
                          tk.Label(main_frame, text="2. 选择输出目录:", anchor="w").pack(fill="x", pady=(5, 0))
                          output_frame = tk.Frame(main_frame)
                          output_frame.pack(fill="x", pady=5)
                          tk.Entry(output_frame, textvariable=self.output_dir, width=60).pack(side="left", expand=True, fill="x")
                          tk.Button(output_frame, text="浏览...", command=self.browse_output_dir).pack(side="right", padx=5)
                  
                          tk.Label(main_frame, text="3. 自定义正则表达式(默认提取中文):", anchor="w").pack(fill="x", pady=(5, 0))
                          regex_frame = tk.Frame(main_frame)
                          regex_frame.pack(fill="x", pady=5)
                          tk.Entry(regex_frame, textvariable=self.regex_pattern, width=60).pack(side="left", expand=True, fill="x")
                          tk.Button(regex_frame, text="恢复默认", command=self.reset_regex).pack(side="right", padx=5)
                  
                          col_frame = tk.Frame(main_frame)
                          col_frame.pack(fill="x", pady=5)
                          tk.Label(col_frame, text="4. 处理列(如 A):").pack(side="left")
                          tk.Entry(col_frame, textvariable=self.input_column, width=5).pack(side="left", padx=5)
                          tk.Label(col_frame, text="输出列(如 B):").pack(side="left")
                          tk.Entry(col_frame, textvariable=self.output_column, width=5).pack(side="left", padx=5)
                  
                          adv_frame = tk.LabelFrame(main_frame, text="高级选项", padx=10, pady=10)
                          adv_frame.pack(fill="x", pady=10)
                          tk.Checkbutton(adv_frame, text="覆盖原文件(不创建新文件)", variable=self.overwrite_mode).pack(anchor="w")
                  
                          tk.Button(
                              main_frame,
                              text="开始提取",
                              command=self.run_extraction,
                              bg="#4CAF50",
                              fg="white",
                              height=2,
                              font=("Arial", 12, "bold")
                          ).pack(fill="x", pady=10)
                  
                          self.progress = ttk.Progressbar(main_frame, orient="horizontal", length=700, mode="determinate")
                          self.progress.pack(pady=10)
                  
                      def browse_input_file(self):
                          filepath = filedialog.askopenfilename(
                              title="选择 Excel 文件",
                              filetypes=[("Excel 文件", "*.xlsx"), ("所有文件", "*.*")]
                          )
                          if filepath:
                              self.input_file.set(filepath)
                              self.output_dir.set(os.path.dirname(filepath))
                  
                      def browse_output_dir(self):
                          dirpath = filedialog.askdirectory(title="选择输出目录")
                          if dirpath:
                              self.output_dir.set(dirpath)
                  
                      def reset_regex(self):
                          self.regex_pattern.set(self.default_regex)
                  
                      def run_extraction(self):
                          input_path = self.input_file.get()
                          output_dir = self.output_dir.get()
                          regex = self.regex_pattern.get()
                          input_col = self.input_column.get().upper()
                          output_col = self.output_column.get().upper()
                          overwrite = self.overwrite_mode.get()
                  
                          if not input_path or not output_dir:
                              messagebox.showwarning("警告", "请选择输入文件和输出目录!")
                              return
                  
                          try:
                              wb = load_workbook(input_path)
                              ws = wb.active
                  
                              total_rows = ws.max_row
                              self.progress["maximum"] = total_rows
                              self.progress["value"] = 0
                  
                              for row in range(2, total_rows + 1):
                                  cell_value = str(ws[f"{input_col}{row}"].value) if ws[f"{input_col}{row}"].value else ""
                                  matches = re.findall(regex, cell_value)
                                  extracted_text = " ".join(matches) if matches else ""
                                  ws[f"{output_col}{row}"].value = extracted_text
                                  self.progress["value"] = row
                                  self.root.update()
                  
                              if overwrite:
                                  output_path = input_path
                              else:
                                  filename = os.path.basename(input_path)
                                  output_path = os.path.join(output_dir, f"提取结果_{filename}")
                  
                              wb.save(output_path)
                              messagebox.showinfo("成功", f"提取完成!n结果已保存至:n{output_path}")
                  
                          except Exception as e:
                              messagebox.showerror("错误", f"处理失败:n{str(e)}")
                          finally:
                              self.progress["value"] = 0
                  
                  if __name__ == "__main__":
                      root = tk.Tk()
                      app = ExcelChineseExtractorApp(root)
                      root.mainloop()
                  

                  # os: 用于文件路径操作
                  import os
                  
                  # re: 用于正则表达式匹配
                  import re
                  
                  # tkinter及相关模块: 创建图形用户界面
                  import tkinter as tk
                  from tkinter import filedialog, messagebox, ttk
                  
                  # openpyxl: 处理Excel文件
                  from openpyxl import load_workbook
                  

                  class ExcelChineseExtractorApp:
                      def __init__(self, root):
                          self.root = root
                          self.root.title("Excel 中文提取工具")
                          self.root.geometry("800x500")
                          
                          # 默认正则表达式(匹配中文字符)
                          self.default_regex = r"[u4e00-u9fa5]+"
                          
                          # 界面控件绑定的变量
                          self.input_file = tk.StringVar()  # 输入文件路径
                          self.output_dir = tk.StringVar()  # 输出目录
                          self.regex_pattern = tk.StringVar(value=self.default_regex)  # 正则表达式
                          self.input_column = tk.StringVar(value="A")  # 输入列
                          self.output_column = tk.StringVar(value="B")  # 输出列
                          self.overwrite_mode = tk.BooleanVar(value=False)  # 是否覆盖原文件
                          
                          self.create_widgets()  # 创建界面控件
                  

                  def create_widgets(self):
                      # 主框架
                      main_frame = tk.Frame(self.root, padx=10, pady=10)
                      main_frame.pack(fill="both", expand=True)
                  
                      # 输入文件选择部分
                      tk.Label(main_frame, text="1. 选择 Excel 文件:", anchor="w").pack(fill="x", pady=(5, 0))
                      file_frame = tk.Frame(main_frame)
                      file_frame.pack(fill="x", pady=5)
                      tk.Entry(file_frame, textvariable=self.input_file, width=60).pack(side="left", expand=True, fill="x")
                      tk.Button(file_frame, text="浏览...", command=self.browse_input_file).pack(side="right", padx=5)
                  
                      # 输出目录选择部分
                      tk.Label(main_frame, text="2. 选择输出目录:", anchor="w").pack(fill="x", pady=(5, 0))
                      output_frame = tk.Frame(main_frame)
                      output_frame.pack(fill="x", pady=5)
                      tk.Entry(output_frame, textvariable=self.output_dir, width=60).pack(side="left", expand=True, fill="x")
                      tk.Button(output_frame, text="浏览...", command=self.browse_output_dir).pack(side="right", padx=5)
                  
                      # 正则表达式设置部分
                      tk.Label(main_frame, text="3. 自定义正则表达式(默认提取中文):", anchor="w").pack(fill="x", pady=(5, 0))
                      regex_frame = tk.Frame(main_frame)
                      regex_frame.pack(fill="x", pady=5)
                      tk.Entry(regex_frame, textvariable=self.regex_pattern, width=60).pack(side="left", expand=True, fill="x")
                      tk.Button(regex_frame, text="恢复默认", command=self.reset_regex).pack(side="right", padx=5)
                  
                      # 列设置部分
                      col_frame = tk.Frame(main_frame)
                      col_frame.pack(fill="x", pady=5)
                      tk.Label(col_frame, text="4. 处理列(如 A):").pack(side="left")
                      tk.Entry(col_frame, textvariable=self.input_column, width=5).pack(side="left", padx=5)
                      tk.Label(col_frame, text="输出列(如 B):").pack(side="left")
                      tk.Entry(col_frame, textvariable=self.output_column, width=5).pack(side="left", padx=5)
                  
                      # 高级选项部分
                      adv_frame = tk.LabelFrame(main_frame, text="高级选项", padx=10, pady=10)
                      adv_frame.pack(fill="x", pady=10)
                      tk.Checkbutton(adv_frame, text="覆盖原文件(不创建新文件)", variable=self.overwrite_mode).pack(anchor="w")
                  
                      # 开始按钮
                      tk.Button(
                          main_frame,
                          text="开始提取",
                          command=self.run_extraction,
                          bg="#4CAF50",
                          fg="white",
                          height=2,
                          font=("Arial", 12, "bold")
                      ).pack(fill="x", pady=10)
                  
                      # 进度条
                      self.progress = ttk.Progressbar(main_frame, orient="horizontal", length=700, mode="determinate")
                      self.progress.pack(pady=10)
                  

                  def browse_input_file(self):
                      
                      """打开文件对话框选择输入Excel文件"""
                      filepath = filedialog.askopenfilename(
                          title="选择 Excel 文件",
                          filetypes=[("Excel 文件", "*.xlsx"), ("所有文件", "*.*")]
                      )
                      if filepath:
                          self.input_file.set(filepath)
                          # 默认设置输出目录为输入文件所在目录
                          self.output_dir.set(os.path.dirname(filepath))
                  
                  def browse_output_dir(self):
                      
                      """打开目录对话框选择输出目录"""
                      dirpath = filedialog.askdirectory(title="选择输出目录")
                      if dirpath:
                          self.output_dir.set(dirpath)
                  
                  def reset_regex(self):
                      
                      """重置正则表达式为默认值"""
                      self.regex_pattern.set(self.default_regex)
                  

                  def run_extraction(self):
                      
                      """执行文本提取的主要逻辑"""
                      # 获取用户输入参数
                      input_path = self.input_file.get()
                      output_dir = self.output_dir.get()
                      regex = self.regex_pattern.get()
                      input_col = self.input_column.get().upper()
                      output_col = self.output_column.get().upper()
                      overwrite = self.overwrite_mode.get()
                  
                      # 验证必要参数
                      if not input_path or not output_dir:
                          messagebox.showwarning("警告", "请选择输入文件和输出目录!")
                          return
                  
                      try:
                          # 加载Excel文件
                          wb = load_workbook(input_path)
                          ws = wb.active
                  
                          # 设置进度条最大值
                          total_rows = ws.max_row
                          self.progress["maximum"] = total_rows
                          self.progress["value"] = 0
                  
                          # 处理每一行数据(从第2行开始,假设第1行是标题)
                          for row in range(2, total_rows + 1):
                              # 获取输入单元格的值
                              cell_value = str(ws[f"{input_col}{row}"].value) if ws[f"{input_col}{row}"].value else ""
                              
                              # 使用正则表达式提取匹配内容
                              matches = re.findall(regex, cell_value)
                              extracted_text = " ".join(matches) if matches else ""
                              
                              # 将结果写入输出列
                              ws[f"{output_col}{row}"].value = extracted_text
                              
                              # 更新进度条
                              self.progress["value"] = row
                              self.root.update()  # 保持界面响应
                  
                          # 确定输出文件路径
                          if overwrite:
                              output_path = input_path  # 覆盖原文件
                          else:
                              filename = os.path.basename(input_path)
                              output_path = os.path.join(output_dir, f"提取结果_{filename}")  # 创建新文件
                  
                          # 保存结果
                          wb.save(output_path)
                          messagebox.showinfo("成功", f"提取完成!n结果已保存至:n{output_path}")
                  
                      except Exception as e:
                          # 错误处理
                          messagebox.showerror("错误", f"处理失败:n{str(e)}")
                      finally:
                          # 重置进度条
                          self.progress["value"] = 0
                  

                  以上就是使用Python对Excel表内容进行中文提取的示例代码的详细内容,更多关于Python Excel表内容中文提取的资料请关注风君子博客其它相关文章!

                  您可能感兴趣的文章:

                  • Python xlrd实现从读取Excel到高效数据提取的全面指南
                  • Python一站式进行提取文档内容(Word、Excel、PDF 和PPT)
                  • Python实现pdf电子发票信息提取到excel表格
                  • Python实现提取Excel嵌入图片并重命名
                  • Python如何使用Pandas库从Excel文件中提取数据

                  站内搜索