鱼C论坛

 找回密码
 立即注册
查看: 1096|回复: 3

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

[复制链接]
发表于 2024-1-24 23:11:59 | 显示全部楼层 |阅读模式

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

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

x
  1. import tkinter as tk
  2. from tkinter import ttk, filedialog, messagebox
  3. import openpyxl
  4. from openpyxl.styles import Font, Alignment
  5. import os
  6. import warnings

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


  10. def import_from_excel(treeview, file_path):
  11.     if file_path:
  12.         try:
  13.             workbook = openpyxl.load_workbook(file_path)
  14.             sheet = workbook.active

  15.             treeview.delete(*treeview.get_children())

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


  20. def export_to_excel(treeview, file_path):
  21.     if not file_path:
  22.         return

  23.     try:
  24.         workbook = openpyxl.Workbook()
  25.         sheet = workbook.active

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

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

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

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


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

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

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


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

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

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

  65.         entry = ttk.Entry(frame)
  66.         entry.grid(row=i, column=1, columnspan=3, padx=5, pady=5, sticky='w')
  67.         labels_entries[col] = entry

  68.     def save_entry():
  69.         new_data = [labels_entries[col].get() for col in COLUMNS]
  70.         treeview.insert('', tk.END, values=new_data)
  71.         sort_treeview(treeview)
  72.         entry_window.destroy()

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

  75.     entry_window.wait_window()


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  112.     root.mainloop()


  113. if __name__ == '__main__':
  114.     open_labor_department()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-1-24 23:14:53 | 显示全部楼层
您好!要在文件名中输入中文,可以使用以下方法:

  1. from tkinter import Tk
  2. from tkinter.filedialog import asksaveasfilename

  3. Tk().withdraw()
  4. file_path = asksaveasfilename(defaultextension=".xlsx", filetypes=(("Excel files", "*.xlsx"), ("All files", "*.*")))
复制代码


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

修改 `export_to_excel` 函数如下:

  1. def export_to_excel(treeview):
  2.     try:
  3.         workbook = openpyxl.Workbook()
  4.         sheet = workbook.active

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

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

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

  19.         if full_file_path:
  20.             workbook.save(full_file_path)
  21.             messagebox.showinfo("成功", "导出Excel成功!")
  22.     except Exception as e:
  23.         messagebox.showerror("错误", f"导出Excel时发生错误:{e}")
复制代码


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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-1-24 23:23:12 | 显示全部楼层
FishC 发表于 2024-1-24 23:14
您好!要在文件名中输入中文,可以使用以下方法:
  1. libpng warning: iCCP: known incorrect sRGB profile
  2. libpng warning: iCCP: known incorrect sRGB profile
复制代码

报错后提示
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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库处理图像的示例代码:

  1. from PIL import Image

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

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

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

  9. print("图像处理完成!")
复制代码


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

希望这能帮到您!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-21 05:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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