鱼C论坛

 找回密码
 立即注册
查看: 951|回复: 29

Txt求教~~

[复制链接]
发表于 2024-4-2 12:01:06 | 显示全部楼层 |阅读模式

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

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

x
我换个思路重新问:

请问能否用PySide6实现:

首先让用户选择一路径并储存为“file_Path",然后读取此路径下所有"xls"(或者xlsx)工作簿名称并储存为‘file_List';


然后从‘file_List’中读取‘999.xls’(或者999.xlsx)工作簿并打开(注意用xls和xlsx要用不同的命令打开),读取所有sheet名称(如sheet1、sheet2......sheetN);


然后建立一个self.text_edit = QTextEdit(),在此self.text_edit = QTextEdit()中

第1行写入“sheet1行1:”


第3行写入“sheet1列1:”


第5行写入“sheet1行2:”


第7行写入“sheet1列2:”

....

第1N行写入“sheetN行1:”


第3N行写入“sheetN列1:”


第5N写入“sheetN行2:”


第7N行写入“sheetN列2:”


然后在file_Path路径下新建一123.txt,  将此self.text_edit = QTextEdit()中内容储存到123.txt中备用。

回复请注意python格式。

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-4-2 12:01:29 | 显示全部楼层
当然可以使用PySide6来实现这个功能。以下是一个示例代码,按照您的需求进行了实现:
import sys
from PySide6.QtWidgets import QApplication, QMainWindow, QTextEdit, QFileDialog
from PySide6.QtCore import QFile

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.file_path = ""
        self.file_list = []
        self.text_edit = QTextEdit()

        self.init_ui()

    def init_ui(self):
        self.setWindowTitle("Excel Sheet Reader")
        self.setGeometry(300, 300, 400, 300)

        # 创建菜单栏
        menu_bar = self.menuBar()
        file_menu = menu_bar.addMenu("文件")

        # 创建打开文件动作
        open_action = file_menu.addAction("打开")
        open_action.triggered.connect(self.open_file_dialog)

        # 在主窗口中添加文本编辑框
        self.setCentralWidget(self.text_edit)

    def open_file_dialog(self):
        file_dialog = QFileDialog()
        file_dialog.setFileMode(QFileDialog.DirectoryOnly)  # 只允许选择目录
        if file_dialog.exec():
            self.file_path = file_dialog.selectedFiles()[0]

            # 获取目录下的所有 xls 或 xlsx 文件
            for file in QFile(self.file_path).entryList(["*.xls", "*.xlsx"], QFile.Files):
                self.file_list.append(file)

            # 打开特定的工作簿文件
            specific_file = "999.xls"  # 或者 "999.xlsx"
            if specific_file in self.file_list:
                # 打开工作簿文件并读取sheet名称
                sheets = self.read_sheets(specific_file)
                self.generate_text_edit_content(sheets)
                self.save_to_file()

    def read_sheets(self, file_name):
        # 根据文件类型选择不同的库来处理
        if file_name.endswith(".xls"):
            # 处理xls文件的代码
            pass
        elif file_name.endswith(".xlsx"):
            # 处理xlsx文件的代码
            pass

        # 假设这里返回了一个sheets列表
        sheets = ["sheet1", "sheet2", "sheet3"]
        return sheets

    def generate_text_edit_content(self, sheets):
        content = ""
        for sheet in sheets:
            content += f"{sheet}行1:\n"
            content += f"{sheet}列1:\n"
            content += f"{sheet}行2:\n"
            content += f"{sheet}列2:\n\n"

        self.text_edit.setPlainText(content)

    def save_to_file(self):
        file_name = f"{self.file_path}/123.txt"
        with open(file_name, "w") as file:
            file.write(self.text_edit.toPlainText())

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec())

这段代码创建了一个具有菜单栏和文本编辑框的主窗口,用户可以通过菜单栏选择要打开的文件路径。然后根据文件类型读取工作簿的名称,最后在文本编辑框中生成内容并保存到指定路径的123.txt文件中。

请注意,根据您的需求,代码中的文件读写和处理 excel 文件的部分需要您自行实现。这里代码只提供了一个示例框架。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-4-2 16:44:16 | 显示全部楼层
FishC 发表于 2024-4-2 12:01
当然可以使用PySide6来实现这个功能。以下是一个示例代码,按照您的需求进行了实现:

Traceback (most recent call last):
  line 1860, in data_summary
    Temp_sheet = wb_target.get_sheet(sheet_name)
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   line 698, in get_sheet
    raise XLRDError("Can't load sheets after releasing resources.")
xlrd.biffh.XLRDError: Can't load sheets after releasing resources.

请问这问题要怎么解决?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-2 16:44:29 | 显示全部楼层
凊风 发表于 2024-04-02 16:44
Traceback (most recent call last):
  line 1860, i ...


这个错误是由于在使用xlrd库的过程中多次打开和关闭同一个Excel文件导致的。xlrd库在打开Excel文件后会释放资源,如果再次尝试使用已经释放的资源,就会出现这个错误。

解决这个问题的方法是,在打开Excel文件后,不要在使用完之前关闭它,确保所有需要的数据都被读取完成后再关闭文件。

以下是一个示例代码,展示了如何正确地打开和关闭Excel文件:
import xlrd

file_path = "your_file_path.xls"

try:
    workbook = xlrd.open_workbook(file_path)
    # 处理 Excel 文件,读取数据
    sheet = workbook.sheet_by_index(0)
    # 获取数据等操作

finally:
    workbook.release_resources()
    del workbook

在这个示例中,我们使用了`try-finally`结构来确保文件的释放。在`try`块内,我们打开并处理了Excel文件,然后在`finally`块中释放资源,并使用`del`语句删除了 workbook 对象。

请根据您的实际需求修改代码,并确保在所有需要使用Excel文件的操作完成后再关闭它。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-4-2 17:21:32 | 显示全部楼层
FishC 发表于 2024-4-2 16:44
这个错误是由于在使用xlrd库的过程中多次打开和关闭同一个Excel文件导致的。xlrd库在打开Excel文件后会 ...

请问这个又要怎么解决?
Traceback (most recent call last):
  line 1842, in data_summary
    print(Source_workbook)
  line 1246, in write
    self.widget.insertPlainText(text)
RuntimeError: Internal C++ object (PySide6.QtWidgets.QPlainTextEdit) already deleted.

我好像没有销毁QPlainTextEdit啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-2 17:21:49 | 显示全部楼层
凊风 发表于 2024-04-02 17:21
请问这个又要怎么解决?
Traceback (most recent cal ...


这个错误是由于在访问已经被销毁的QPlainTextEdit对象时引起的。可能是因为在运行期间某个地方不小心删除了该对象。

为了解决这个问题,可以先检查一下代码中可能导致QPlainTextEdit对象被删除的地方。例如,确保没有意外的删除操作,也要注意是否在使用完QPlainTextEdit对象后正确地释放资源。

另外,如果您创建了名为self.text_edit的QPlainTextEdit对象,并且在其他方法中调用了它,那么请确保该对象的生命周期与所属的类实例的生命周期一致。避免在实例还存在时访问已经被销毁的对象。

最后,建议在访问QPlainTextEdit对象之前,先进行一个存在性检查,以确保它尚未被删除。例如,在使用print语句之前,可以添加如下代码:

if self.text_edit is not None:
    print(self.text_edit)

通过这种方式,可以避免在对象已经被删除的情况下对其进行访问,从而避免上述错误的发生。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-4-2 17:34:46 | 显示全部楼层
FishC 发表于 2024-4-2 17:21
这个错误是由于在访问已经被销毁的QPlainTextEdit对象时引起的。可能是因为在运行期间某个地方不小心删 ...

现有代码段如下:

    def data_summary(self, data_summary):
        
        for file in self.File_List:
            if file.endswith('.xls') and file != self.Base_Workbook:
                file_path1 = os.path.join(self.File_Path, file)
                Source_workbook = xlrd.open_workbook(file_path1)

                file_path2 = os.path.join(self.File_Path, '汇总表.xls')
                Target_workbook = xlrd.open_workbook(file_path2, formatting_info=True)
           

            # 遍历源工作簿中的每个sheet
            for sheet_name in Source_workbook.sheet_names():
                # 读取sheet_name工作表
                ws_target = Target_workbook.sheet_by_name(sheet_name)
                # 判断目标文件是否存在同名sheet
                if sheet_name in Target_workbook.sheet_names():
                    # 复制目标工作簿
                    wb_target = copy(Target_workbook)
                    # 读取源工作簿下的sheet_name工作表
                    Temp_sheet = wb_target.get_sheet(sheet_name)

然后报错:
Traceback (most recent call last):
  line 1860, in data_summary
    Temp_sheet = wb_target.get_sheet(sheet_name)
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   line 698, in get_sheet
    raise XLRDError("Can't load sheets after releasing resources.")
xlrd.biffh.XLRDError: Can't load sheets after releasing resources.

请问这个要怎么解决?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-2 17:35:11 | 显示全部楼层
凊风 发表于 2024-04-02 17:34
现有代码段如下:

    def data_summary(self, dat ...


这个错误是由于在释放资源之后尝试加载工作表导致的。`xlrd`库在调用`open_workbook`函数之后会立即释放相应的资源,所以在使用`copy`函数时会出现问题。为了解决这个问题,可以使用`xlutils`库来实现复制工作簿的操作。

首先,确保已经安装了`xlutils`库。您可以通过以下命令进行安装:
pip install xlutils

然后,在代码中引入`xlutils`库,并使用`copy`函数来复制工作簿。修改后的代码如下:
import os
import xlrd
from xlutils.copy import copy

def data_summary(self, data_summary):
    for file in self.File_List:
        if file.endswith('.xls') and file != self.Base_Workbook:
            file_path1 = os.path.join(self.File_Path, file)
            Source_workbook = xlrd.open_workbook(file_path1, formatting_info=True)
            
            file_path2 = os.path.join(self.File_Path, '汇总表.xls')
            Target_workbook = copy(xlrd.open_workbook(file_path2, formatting_info=True))

            # 遍历源工作簿中的每个sheet
            for sheet_name in Source_workbook.sheet_names():
                # 判断目标文件是否存在同名sheet
                if sheet_name in Target_workbook.sheet_names():
                    # 复制目标工作簿
                    wb_target = copy(Target_workbook)
                    # 读取源工作簿下的sheet_name工作表
                    Temp_sheet = wb_target.get_sheet(sheet_name)

在这个修改后的代码中,我们使用`copy`函数将`Target_workbook`复制为新的工作簿对象`wb_target`,然后使用`get_sheet`方法获取工作表。这样就可以避免`xlrd`库释放资源导致的错误。

请注意,修改后的代码仅涉及到`copy`函数和`get_sheet`方法的更改,其他部分可能需要根据您的具体需求进行调整。同时,也建议在处理完工作表后手动释放资源,以免出现潜在的资源泄漏。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-4-2 17:45:31 | 显示全部楼层
FishC 发表于 2024-4-2 17:35
这个错误是由于在释放资源之后尝试加载工作表导致的。`xlrd`库在调用`open_workbook`函数之后会立即释 ...

ws_target = Target_workbook.sheet_by_name(sheet_name)   这句为什么删除了呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-2 17:45:48 | 显示全部楼层
凊风 发表于 2024-04-02 17:45
ws_target = Target_workbook.sheet_by_name(sheet_na ...


对不起,我删除那句代码是因为在使用`xlutils.copy`库时,我们只能通过复制整个工作簿来获取工作表对象,而不能直接使用`sheet_by_name`方法来获取工作表。您可以使用以下代码修改:import osimport xlrdfrom xlutils.copy import copydef data_summary(self, data_summary):    for file in self.File_List:        if file.endswith('.xls') and file != self.Base_Workbook:            file_path1 = os.path.join(self.File_Path, file)            Source_workbook = xlrd.open_workbook(file_path1, formatting_info=True)                        file_path2 = os.path.join(self.File_Path, '汇总表.xls')            Target_workbook = xlrd.open_workbook(file_path2, formatting_info=True)            wb_target = copy(Target_workbook)  # 复制目标工作簿            for sheet_name in Source_workbook.sheet_names():                # 判断目标文件是否存在同名sheet                if sheet_name in Target_workbook.sheet_names():                    # 读取源工作簿下的sheet_name工作表                    source_sheet = Source_workbook.sheet_by_name(sheet_name)                    target_sheet = wb_target.get_sheet(sheet_name)                    # 处理工作表数据                    # ...在这里添加您的处理代码...            wb_target.save(file_path2)在修改后的代码中,我们通过使用`source_sheet`对象和`target_sheet`对象来引用源工作簿和目标工作簿的工作表。然后,您可以在处理工作表数据的部分编写您自己的处理代码。最后,使用`wb_target.save(file_path2)`将更改保存到目标工作簿文件中。请注意,这只是一个示例,您需要根据您的具体需求来进行适当的修改和完善。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-4-2 17:46:50 | 显示全部楼层
FishC 发表于 2024-4-2 17:45
对不起,我删除那句代码是因为在使用`xlutils.copy`库时,我们只能通过复制整个工作簿来获取工作表对象 ...

回复请注意python格式
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-2 17:47:13 | 显示全部楼层
凊风 发表于 2024-04-02 17:46
回复请注意python格式


很抱歉,我之前的回答中确实存在缩进问题,请参考以下修正后的代码:
import os
import xlrd
from xlutils.copy import copy

def data_summary(self, data_summary):
    for file in self.File_List:
        if file.endswith('.xls') and file != self.Base_Workbook:
            file_path1 = os.path.join(self.File_Path, file)
            Source_workbook = xlrd.open_workbook(file_path1, formatting_info=True)
            
            file_path2 = os.path.join(self.File_Path, '汇总表.xls')
            Target_workbook = xlrd.open_workbook(file_path2, formatting_info=True)
            
            wb_target = copy(Target_workbook)  # 复制目标工作簿
            
            for sheet_name in Source_workbook.sheet_names():
                # 判断目标文件是否存在同名sheet
                if sheet_name in Target_workbook.sheet_names():
                    # 读取源工作簿下的sheet_name工作表
                    source_sheet = Source_workbook.sheet_by_name(sheet_name)
                    target_sheet = wb_target.get_sheet(sheet_name)
                    
                    # 处理工作表数据
                    # ...在这里添加您的处理代码...
            
            wb_target.save(file_path2)

感谢您的指正,希望这次回答能更符合Python的格式要求。如有任何其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-4-3 08:44:28 | 显示全部楼层
FishC 发表于 2024-4-2 17:47
很抱歉,我之前的回答中确实存在缩进问题,请参考以下修正后的代码:

请问这又是什么报错:
Traceback (most recent call last):
line 1854, in data_summary
    for sheet_name in Source_workbook.sheet_names():
                      ^^^^^^^^^^^^^^^
UnboundLocalError: cannot access local variable 'Source_workbook' where it is not associated with a value

回复请注意Python格式
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-3 08:44:49 | 显示全部楼层
凊风 发表于 2024-04-03 08:44
请问这又是什么报错:
Traceback (most recent call  ...


非常抱歉,我之前的代码示例中确实存在错误。请参考以下修正后的代码,解决了UnboundLocalError的问题:


import os
import xlrd
from xlutils.copy import copy

def data_summary(self):
    for file in self.file_list:
        if file.endswith('.xls') and file != '999.xls':
            file_path1 = os.path.join(self.file_path, file)
            source_workbook = xlrd.open_workbook(file_path1, formatting_info=True)

            file_path2 = os.path.join(self.file_path, '123.txt')
            target_workbook = copy(source_workbook)  # 复制源工作簿

            for sheet_name in source_workbook.sheet_names():
                # 读取源工作簿下的sheet_name工作表
                source_sheet = source_workbook.sheet_by_name(sheet_name)
                target_sheet = target_workbook.add_sheet(sheet_name)

                # 处理工作表数据
                # ...在这里添加您的处理代码...

            target_workbook.save(file_path2)
            

这次修正后的代码中,修复了变量命名的问题,并且使用`copy()`方法进行工作簿的复制,然后使用`add_sheet()`方法添加新的工作表。

如果还有其他问题,请随时提问。非常感谢您的指正,希望这次回答能更符合Python的格式要求。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-4-3 08:46:28 | 显示全部楼层
FishC 发表于 2024-4-3 08:44
非常抱歉,我之前的代码示例中确实存在错误。请参考以下修正后的代码,解决了UnboundLocalError的问题 ...

错了错了,源簿和目标簿是不同的工作簿(数据不相同的),不能 target_workbook = copy(source_workbook)  # 复制源工作簿
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-3 08:46:44 | 显示全部楼层
凊风 发表于 2024-04-03 08:46
错了错了,源簿和目标簿是不同的工作簿(数据不相同的 ...


非常抱歉,我之前的回答有误。在这种情况下,我们可以直接创建一个新的目标工作簿,并将源工作簿的数据逐行逐列地复制到目标工作簿中。以下是修正后的代码示例:
import os
import xlrd
from xlutils.copy import copy

def data_summary(self):
    for file in self.file_list:
        if file.endswith('.xls') and file != '999.xls':
            file_path1 = os.path.join(self.file_path, file)
            source_workbook = xlrd.open_workbook(file_path1)

            # 创建新的目标工作簿
            target_workbook = xlwt.Workbook()

            for sheet_name in source_workbook.sheet_names():
                # 读取源工作簿下的sheet_name工作表
                source_sheet = source_workbook.sheet_by_name(sheet_name)
                target_sheet = target_workbook.add_sheet(sheet_name)

                # 复制数据到新的工作簿
                for row in range(source_sheet.nrows):
                    for col in range(source_sheet.ncols):
                        cell_value = source_sheet.cell(row, col).value
                        target_sheet.write(row, col, cell_value)

            file_path2 = os.path.join(self.file_path, '123.txt')
            target_workbook.save(file_path2)

这次代码修正了目标工作簿的创建方式,并通过遍历逐个复制源工作簿的单元格数据到目标工作簿中。请确保您已经安装了`xlwt`库来处理Excel文件的写操作。

非常抱歉给您带来困扰,请尽量参考上述修正后的代码。如有任何问题,请随时追问。感谢您的理解!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-4-3 08:52:50 | 显示全部楼层
FishC 发表于 2024-4-3 08:46
非常抱歉,我之前的回答有误。在这种情况下,我们可以直接创建一个新的目标工作簿,并将源工作簿的数据 ...

可能我昨天没有讲清楚...

现有代码是这样的:

   def data_summary(self, data_summary):
        ### 找到需要表内平衡验证的工作簿
        for file in self.File_List:
            if file.endswith('.xls') and file != self.Base_Workbook and file != '汇总表.xls':
                file_path1 = os.path.join(self.File_Path, file)
                Source_workbook = xlrd.open_workbook(file_path1, formatting_info=True)
                file_path2 = os.path.join(self.File_Path, '汇总表.xls')
                Target_workbook = xlrd.open_workbook(file_path2, formatting_info=True)
               
            elif file.endswith('.xlsx') and file != self.Base_Workbook and file != '汇总表.xlsx':
                file_path1 = os.path.join(self.File_Path, file)
                Source_workbook = load_workbook(file_path1)
                file_path2 = os.path.join(self.File_Path, '汇总表.xlsx')
                Target_workbook = load_workbook(file_path2, formatting_info=True)

            # 遍历源簿中sheet
            for sheet_name in Source_workbook.sheet_names():
                ## 读取目标簿sheet_name工作表
                ws_target.sheet = Target_workbook.sheet_by_name(sheet_name)
                # 判断目标簿是否存在同名sheet
                if sheet_name in Target_workbook.sheet_names():
                    # 复制目标工作簿
                    wb_target = copy(Target_workbook)
                    # 读取源工作簿下的sheet_name工作表
                    Temp_sheet = wb_target.get_sheet(sheet_name)
                    
                    self.plainTextEdit.ensureCursorVisible()
                    
                    SourceSheet = Source_workbook.sheet_by_name(sheet_name)

                    Rows = SourceSheet.nrows
                    Cols = SourceSheet.ncols                    
                    

                    ### 应用行(列)排除规则
                    for row_num in range(Rows):
                        if row_num not in exclude_rows:
                            row_add = row_num
                            for col_num in range(Cols):
                                if col_num not in exclude_cols:
                                    col_add = col_num
                                    ### 获取目标文件中指定单元格的值
                                    value1 = ws_target.cell(row_add, col_add).value
                                    
                                    ### 获取源文件中指定单元格的值
                                    value2 = SourceSheet.cell(row_add, col_add).value
                                    
                                    ### 判断俩单元格值的类型并相加
                                    if isinstance(value1, (int, float)) and isinstance(value2, (int, float)):
                                        # 如果两个值都是数值类型
                                        value1 = value1 + value2
                                    elif isinstance(value1, (int, float)) or isinstance(value2, (int, float)):
                                        # 如果只有一个值是数值类型
                                        if isinstance(value1, (int, float)):
                                            value1 = value1
                                        else:
                                            value1 = value2
                                    else:
                                        # 如果两个值都不是数值类型
                                        value1 = ' '
                                    ### 更新目标文件中指定单元格的值
                                    Temp_sheet.write(row_add, col_add, value1)
                                    
                    ###保存目标文件
                    wb_target.save('汇总表.xls')

然后报错:
Traceback (most recent call last):
line 1854, in data_summary
    for sheet_name in Source_workbook.sheet_names():
                      ^^^^^^^^^^^^^^^
UnboundLocalError: cannot access local variable 'Source_workbook' where it is not associated with a value

回复请注意Python格式
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-3 08:53:16 | 显示全部楼层
凊风 发表于 2024-04-03 08:52
可能我昨天没有讲清楚...

现有代码是这样的:

  ...


根据您提供的代码,出现错误的原因是在`for file in self.File_List:`之后没有正确处理文件路径和工作簿对象的赋值。以下是修正后的代码示例:import osimport xlrdfrom xlutils.copy import copyfrom openpyxl import load_workbookdef data_summary(self):    # 找到需要表内平衡验证的工作簿    for file in self.file_list:        if file.endswith('.xls') and file != self.base_workbook and file != '汇总表.xls':            file_path1 = os.path.join(self.file_path, file)            source_workbook = xlrd.open_workbook(file_path1, formatting_info=True)            file_path2 = os.path.join(self.file_path, '汇总表.xls')            target_workbook = xlrd.open_workbook(file_path2, formatting_info=True)        elif file.endswith('.xlsx') and file != self.base_workbook and file != '汇总表.xlsx':            file_path1 = os.path.join(self.file_path, file)            source_workbook = load_workbook(file_path1)            file_path2 = os.path.join(self.file_path, '汇总表.xlsx')            target_workbook = load_workbook(file_path2, formatting_info=True)        # 遍历源簿中sheet        for sheet_name in source_workbook.sheet_names():            # 读取目标簿sheet_name工作表            ws_target_sheet = target_workbook[sheet_name]            # 判断目标簿是否存在同名sheet            if sheet_name in target_workbook.sheetnames:                # 复制目标工作簿                wb_target = copy(target_workbook)                # 读取源工作簿下的sheet_name工作表                temp_sheet = wb_target.get_sheet(sheet_name)                self.plainTextEdit.ensureCursorVisible()                source_sheet = source_workbook[sheet_name]                rows = source_sheet.nrows                cols = source_sheet.ncols                ### 应用行(列)排除规则                for row_num in range(rows):                    if row_num not in exclude_rows:                        row_add = row_num                        for col_num in range(cols):                            if col_num not in exclude_cols:                                col_add = col_num                                # 获取目标文件中指定单元格的值                                value1 = ws_target_sheet.cell(row=row_add+1, column=col_add+1).value                                # 获取源文件中指定单元格的值                                value2 = source_sheet.cell(row=row_add, column=col_add).value                                # 判断两个单元格值的类型并相加                                if isinstance(value1, (int, float)) and isinstance(value2, (int, float)):                                    # 如果两个值都是数值类型                                    value1 = value1 + value2                                elif isinstance(value1, (int, float)) or isinstance(value2, (int, float)):                                    # 如果只有一个值是数值类型                                    if isinstance(value1, (int, float)):                                        value1 = value1                                    else:                                        value1 = value2                                else:                                    # 如果两个值都不是数值类型                                    value1 = ''                                # 更新目标文件中指定单元格的值                                temp_sheet.write(row_add, col_add, value1)                ###保存目标文件                wb_target.save('汇总表.xls')在修正后的代码中,我修改了一些变量名称以符合 Python 的命名约定。另外,我还修复了`ws_target_sheet = target_workbook[sheet_name]`这行代码中的bug,并将`ws_target.cell`修改为`ws_target_sheet.cell`。请注意,上述代码示例仅供参考,您可能需要根据实际需求进行进一步调整。如果您还有其他问题,请随时追问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-4-3 08:53:44 | 显示全部楼层
FishC 发表于 2024-4-3 08:53
根据您提供的代码,出现错误的原因是在`for file in self.File_List:`之后没有正确处理文件路径和工作 ...

回复请注意Python格式
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-3 08:54:08 | 显示全部楼层
凊风 发表于 2024-04-03 08:53
回复请注意Python格式


非常抱歉,我没有按照Python的格式进行回复。以下是按照Python格式修正后的代码示例:
import os
import xlrd
from xlutils.copy import copy
from openpyxl import load_workbook

def data_summary(self):
    # 找到需要表内平衡验证的工作簿
    for file in self.file_list:
        if file.endswith('.xls') and file != self.base_workbook and file != '汇总表.xls':
            file_path1 = os.path.join(self.file_path, file)
            source_workbook = xlrd.open_workbook(file_path1, formatting_info=True)
            file_path2 = os.path.join(self.file_path, '汇总表.xls')
            target_workbook = xlrd.open_workbook(file_path2, formatting_info=True)
        elif file.endswith('.xlsx') and file != self.base_workbook and file != '汇总表.xlsx':
            file_path1 = os.path.join(self.file_path, file)
            source_workbook = load_workbook(file_path1)
            file_path2 = os.path.join(self.file_path, '汇总表.xlsx')
            target_workbook = load_workbook(file_path2, formatting_info=True)
        
        # 遍历源簿中sheet
        for sheet_name in source_workbook.sheet_names():
            # 读取目标簿sheet_name工作表
            ws_target_sheet = target_workbook.sheet_by_name(sheet_name)
            
            # 判断目标簿是否存在同名sheet
            if sheet_name in target_workbook.sheet_names():
                # 复制目标工作簿
                wb_target = copy(target_workbook)
                # 读取源工作簿下的sheet_name工作表
                temp_sheet = wb_target.get_sheet(sheet_name)
                self.plainTextEdit.ensureCursorVisible()
                source_sheet = source_workbook.sheet_by_name(sheet_name)
                rows = source_sheet.nrows
                cols = source_sheet.ncols
                
                ### 应用行(列)排除规则
                for row_num in range(rows):
                    if row_num not in exclude_rows:
                        row_add = row_num
                        for col_num in range(cols):
                            if col_num not in exclude_cols:
                                col_add = col_num
                                # 获取目标文件中指定单元格的值
                                value1 = ws_target_sheet.cell(row_add, col_add).value
                                # 获取源文件中指定单元格的值
                                value2 = source_sheet.cell(row_add, col_add).value
                                
                                # 判断两个单元格值的类型并相加
                                if isinstance(value1, (int, float)) and isinstance(value2, (int, float)):
                                    # 如果两个值都是数值类型
                                    value1 = value1 + value2
                                elif isinstance(value1, (int, float)) or isinstance(value2, (int, float)):
                                    # 如果只有一个值是数值类型
                                    if isinstance(value1, (int, float)):
                                        value1 = value1
                                    else:
                                        value1 = value2
                                else:
                                    # 如果两个值都不是数值类型
                                    value1 = ''
                                
                                # 更新目标文件中指定单元格的值
                                temp_sheet.write(row_add, col_add, value1)
                
                # 保存目标文件
                wb_target.save('汇总表.xls')

非常抱歉给您带来的困扰,希望以上修正后的代码符合您的需求。如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-15 13:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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