千羽丶 发表于 2024-1-24 23:11:59

导出excel文件,无法在文件名输入中文

import tkinter as tk
from tkinter import ttk, filedialog, messagebox
import openpyxl
from openpyxl.styles import Font, Alignment
import os
import warnings

# 常量
COLUMNS = ('序号', '部门', '班级', '姓名', '本人手机号', '班主任', '手机号', '备注')
FILE_NAME = "学生会某部成员信息.xlsx"


def import_from_excel(treeview, file_path):
    if file_path:
      try:
            workbook = openpyxl.load_workbook(file_path)
            sheet = workbook.active

            treeview.delete(*treeview.get_children())

            for row in sheet.iter_rows(values_only=True):
                treeview.insert('', tk.END, values=row)
      except Exception as e:
            messagebox.showerror("错误", f"导入Excel时发生错误:{e}")


def export_to_excel(treeview, file_path):
    if not file_path:
      return

    try:
      workbook = openpyxl.Workbook()
      sheet = workbook.active

      # 合并 A1 到 F1 单元格
      sheet.merge_cells('A1:F1')
      title_cell = sheet['A1']
      title_cell.value = "学生会某部成员信息"
      title_cell.font = Font(name='黑体', size=20, bold=True)
      title_cell.alignment = Alignment(horizontal='center', vertical='center')

      for child in treeview.get_children():
            row_data = treeview.item(child)['values']
            sheet.append(row_data)

      # 获取目录和文件名
      initial_dir = os.getcwd()
      full_file_path = filedialog.asksaveasfilename(
            initialdir=initial_dir,
            initialfile=FILE_NAME,
            defaultextension=".xlsx",
            filetypes=[("Excel files", "*.xlsx")],
            encoding='utf-8',
            title="保存文件"
      )

      if full_file_path:
            workbook.save(full_file_path)
            messagebox.showinfo("成功", "导出Excel成功!")
    except Exception as e:
      messagebox.showerror("错误", f"导出Excel时发生错误:{e}")


def sort_treeview(treeview, col='序号', reverse=False):
    l = [(treeview.set(k, col), k) for k in treeview.get_children('')]
    l.sort(reverse=reverse)

    for index, (val, k) in enumerate(l):
      treeview.move(k, '', index)

    treeview.heading(col, command=lambda: sort_treeview(treeview, col, not reverse))


def add_person(treeview):
    entry_window = tk.Toplevel()
    entry_window.title("督察部录入")

    frame = ttk.Frame(entry_window)
    frame.pack(padx=10, pady=10)

    labels_entries = {}
    for i, col in enumerate(COLUMNS):
      label = ttk.Label(frame, text=f"{col}:")
      label.grid(row=i, column=0, padx=5, pady=5, sticky='e')

      entry = ttk.Entry(frame)
      entry.grid(row=i, column=1, columnspan=3, padx=5, pady=5, sticky='w')
      labels_entries = entry

    def save_entry():
      new_data = .get() for col in COLUMNS]
      treeview.insert('', tk.END, values=new_data)
      sort_treeview(treeview)
      entry_window.destroy()

    save_btn = ttk.Button(frame, text="保存", command=save_entry)
    save_btn.grid(row=len(COLUMNS) + 1, columnspan=4, pady=10)

    entry_window.wait_window()


def open_labor_department():
    warnings.filterwarnings("ignore", category=UserWarning)

    root = tk.Tk()
    root.withdraw()

    labor_window = tk.Toplevel(root)
    labor_window.title("劳动部")

    label = tk.Label(labor_window, text="欢迎进入劳动部")
    label.pack(pady=20)

    treeview = ttk.Treeview(labor_window)
    treeview['columns'] = COLUMNS

    treeview.column('#0', width=0, stretch=tk.NO)
    for col in treeview['columns']:
      treeview.column(col, anchor=tk.CENTER, width=80)

    treeview.heading('#0', text='', anchor=tk.CENTER)
    for col in treeview['columns']:
      treeview.heading(col, text=col, anchor=tk.CENTER)

    treeview.pack(side=tk.TOP, fill=tk.X)

    btn_frame = tk.Frame(labor_window)
    btn_frame.pack(fill=tk.X, ipady=5)

    import_btn = ttk.Button(btn_frame, text="导入Excel", command=lambda: import_from_excel(treeview,
                                                                                       filedialog.askopenfilename(
                                                                                           filetypes=[("Excel files", "*.xlsx")])))
    import_btn.pack(side=tk.LEFT, padx=(10, 0), expand=True)

    export_btn = ttk.Button(btn_frame, text="导出Excel", command=lambda: export_to_excel(treeview,
                                                                                     filedialog.asksaveasfilename(
                                                                                       defaultextension=".xlsx")))
    export_btn.pack(side=tk.LEFT, padx=(10, 0), expand=True)

    add_btn = ttk.Button(btn_frame, text="录入人员", command=lambda: add_person(treeview))
    add_btn.pack(side=tk.LEFT, padx=(10, 0), expand=True)

    # 窗口关闭时停止主循环
    labor_window.protocol("WM_DELETE_WINDOW", root.destroy)

    screen_width = labor_window.winfo_screenwidth()
    screen_height = labor_window.winfo_screenheight()

    x = (screen_width // 2) - (300 // 2)
    y = (screen_height // 2) - (200 // 2)
    labor_window.geometry(f"600x400+{x}+{y}")

    root.mainloop()


if __name__ == '__main__':
    open_labor_department()

FishC 发表于 2024-1-24 23:14:53

您好!要在文件名中输入中文,可以使用以下方法:

from tkinter import Tk
from tkinter.filedialog import asksaveasfilename

Tk().withdraw()
file_path = asksaveasfilename(defaultextension=".xlsx", filetypes=(("Excel files", "*.xlsx"), ("All files", "*.*")))

`Tk().withdraw()`用于创建一个临时的Tk对象,并隐藏它,以便在后台运行。然后,`asksaveasfilename`对话框会弹出,允许您选择保存文件的位置和名称,并返回选择的文件路径。

修改 `export_to_excel` 函数如下:

def export_to_excel(treeview):
    try:
      workbook = openpyxl.Workbook()
      sheet = workbook.active

      # 合并 A1 到 F1 单元格
      sheet.merge_cells('A1:F1')
      title_cell = sheet
      title_cell.value = "学生会某部成员信息"
      title_cell.font = Font(name='黑体', size=20, bold=True)
      title_cell.alignment = Alignment(horizontal='center', vertical='center')

      for child in treeview.get_children():
            row_data = treeview.item(child)
            sheet.append(row_data)

      # 获取目录和文件名
      full_file_path = asksaveasfilename(
            defaultextension=".xlsx",
            filetypes=(("Excel files", "*.xlsx"), ("All files", "*.*"))
      )

      if full_file_path:
            workbook.save(full_file_path)
            messagebox.showinfo("成功", "导出Excel成功!")
    except Exception as e:
      messagebox.showerror("错误", f"导出Excel时发生错误:{e}")

现在您就可以在导出Excel时输入中文文件名了。希望对您有所帮助!

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

千羽丶 发表于 2024-1-24 23:23:12

FishC 发表于 2024-1-24 23:14
您好!要在文件名中输入中文,可以使用以下方法:




libpng warning: iCCP: known incorrect sRGB profile
libpng warning: iCCP: known incorrect sRGB profile
报错后提示

FishC 发表于 2024-1-24 23:24:02

千羽丶 发表于 2024-01-24 23:23
libpng warning: iCCP: known incorrect sRGB profile ...

这个报错是由于libpng库检测到图像的sRGB配置文件不正确而引起的。sRGB是一种广泛使用的标准色彩空间配置文件,用于确保图像在不同设备上显示的一致性。

虽然这个报错不会影响程序的正常运行,但如果您想消除这个警告,可以尝试通过以下方法解决:

1. 使用其他图像处理工具重新生成图像,确保正确设置了sRGB配置文件。
2. 使用Pillow库进行图像处理,它已经集成了libpng和zlib库,并且通常能够避免这个警告。

以下是一个使用Pillow库处理图像的示例代码:

from PIL import Image

image_path = 'your_image.png'
output_path = 'output_image.png'

with Image.open(image_path) as img:
    # 执行一些图像处理操作,例如调整大小、裁剪等
    # ...

    # 保存处理后的图像
    img.save(output_path)

print("图像处理完成!")

确保在使用之前已经安装了Pillow库(`pip install pillow`),然后将上述代码中的`your_image.png`替换为您要处理的图像路径,`output_image.png`替换为输出图像的路径。在执行该代码后,应该不再看到libpng的警告。

希望这能帮到您!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 导出excel文件,无法在文件名输入中文