鱼C论坛

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

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

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

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

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

x
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[col] = entry

    def save_entry():
        new_data = [labels_entries[col].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()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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
报错后提示
想知道小甲鱼最近在做啥?请访问 -> 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库处理图像的示例代码:
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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-23 04:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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