在多个工作簿之间复制数据,并使用 xlwings 追加到下一个空白行

Copying data between multiple workbooks, and appending to next blank row using xlwings

我正在创建一个程序,将 excel 个工作簿添加到队列并使用 xlwings 打开每个工作簿并复制数据,然后粘贴到特定的工作簿。

我目前有一个工作程序,但我想将复制的数据附加到特定工作簿的下一个空白行,而不是手动输入范围。这能做到吗?

以下程序对我有用,但我必须在追加中手动指定范围 sheet。

import sys,os,threading,traceback,os
import xlwings as xw
from queue import *
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import Qt, pyqtSlot
from PyQt5.QtGui import QIcon, QPixmap
from PyQt5.QtWidgets import QApplication, QMainWindow, QAction, QProgressBar, QFileDialog,QTableWidgetItem,QHeaderView

#Directory to where excel sheets are located
Directory = ["C:\Users\{0}\Desktop".format(os.getlogin()]
#Specific file to be written to 
GSS_Excel = ['Append.xls']

class Ui_QueueWindow(object):
    def setupUi(self, QueueWindow):
        QueueWindow.setObjectName("QueueWindow")
        QueueWindow.resize(430, 250)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(QueueWindow.sizePolicy().hasHeightForWidth())
        QueueWindow.setSizePolicy(sizePolicy)
        QueueWindow.setMinimumSize(QtCore.QSize(430, 250))
        QueueWindow.setMaximumSize(QtCore.QSize(430, 250))
        self.centralwidget = QtWidgets.QWidget(QueueWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
        self.gridLayout.setObjectName("gridLayout")
        self.verticalLayout = QtWidgets.QVBoxLayout()
        self.verticalLayout.setObjectName("verticalLayout")
        self.QueueTable = QtWidgets.QTableWidget(self.centralwidget)
        self.QueueTable.setObjectName("QueueTable")
        self.QueueTable.setColumnCount(2)
        self.QueueTable.setRowCount(0)
        self.QueueTable.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustToContents)
        item = QtWidgets.QTableWidgetItem()
        self.QueueTable.setHorizontalHeaderItem(0, item)
        item = QtWidgets.QTableWidgetItem()
        self.QueueTable.setHorizontalHeaderItem(1, item)
        self.verticalLayout.addWidget(self.QueueTable)
        self.horizontalLayout = QtWidgets.QHBoxLayout()
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.add_queue = QtWidgets.QPushButton(self.centralwidget)
        self.add_queue.setObjectName("add_queue")
        self.horizontalLayout.addWidget(self.add_queue)
        self.run_queue = QtWidgets.QPushButton(self.centralwidget)
        self.run_queue.setObjectName("run_queue")
        self.horizontalLayout.addWidget(self.run_queue)
        self.verticalLayout.addLayout(self.horizontalLayout)
        self.gridLayout.addLayout(self.verticalLayout, 0, 0, 1, 1)
        QueueWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtWidgets.QStatusBar(QueueWindow)
        self.statusbar.setObjectName("statusbar")
        QueueWindow.setStatusBar(self.statusbar)

        self.retranslateUi(QueueWindow)
        QtCore.QMetaObject.connectSlotsByName(QueueWindow)

    def retranslateUi(self, QueueWindow):
        _translate = QtCore.QCoreApplication.translate
        QueueWindow.setWindowTitle(_translate("QueueWindow", "Global Shop Program"))
        item = self.QueueTable.horizontalHeaderItem(0)
        item.setText(_translate("QueueWindow", "File Name"))
        self.add_queue.setText(_translate("QueueWindow", "Add"))
        self.run_queue.setText(_translate("QueueWindow", "Run"))

class QueueWindow(QMainWindow,Ui_QueueWindow):
    def __init__(self,parent = None):
        super().__init__(parent)
        self.setupUi(self)
        self.add_queue.clicked.connect(self.add)
        self.run_queue.clicked.connect(self.run)
        self.queue = Queue(15)

    def add(self):
        filter = "Excel(*.xlsx)"
        fileToAdd = QFileDialog.getOpenFileName(self, "Select File", "C:\Users\{0}\Desktop\".format(os.getlogin()), filter)
        fileToAdd = fileToAdd[0]
        rowPosition = self.QueueTable.rowCount()
        self.QueueTable.insertRow(rowPosition)
        self.QueueTable.setItem(rowPosition , 0, QTableWidgetItem("{0}".format(fileToAdd)))
        self.QueueTable.resizeColumnsToContents()
        self.queue.put(fileToAdd)

    def run(self):
        try:
            while True:
                app = xw.App(visible=False)
                #specific file to write to
                appendWorkbook = xw.Book(r'{0}\{1}'.format(Directory[0],GSS_Excel[2]))
                appendSheet = appendWorkbook.sheets['Sheet1']
                app1 = xw.App(visible=False)
                #files used from queue
                GSS_EIS = xw.Book(r'{0}'.format(self.queue.get()))
                GSS_Sheet1 = GSS_EIS.sheets['Sheet1']
                ##Copies data from GSS_Sheet1 and pastes to appendSheet
                appendSheet.range('A2:A6').value = GSS_Sheet1 .range('A1:A6').options(ndim=2).value  # I'd like to not have to specify range in appendSheet and instead find the next blank row to append to and paste data there.
                self.queue.task_done()
                appendWorkbook.save(r'{0}\{1}'.format(Directory[0],GSS_Excel[2]))
                app.kill()
                app1.kill()
                self.QueueTable.removeRow(self.QueueTable.rowCount()-1)
                if self.queue.empty():
                    break
        except:
            print(traceback.format_exc())


def main():
    app = QApplication(sys.argv)
    window = QueueWindow()
    window.show()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()


寻找类似的东西;

    def run(self):
        try:
            while True:
                app = xw.App(visible=False)
                appendWorkbook = xw.Book(r'{0}\{1}'.format(Directory[0],GSS_Excel[2]))
                Sheet1 = appendWorkbook.sheets['Sheet1']
                app1 = xw.App(visible=False)
                GSS_EIS = xw.Book(r'{0}'.format(self.queue.get()))
                GSS_Sheet1 = GSS_EIS.sheets['GSS Data']
                for row in range(1,10):
                    for col in range(1,10):
                        if Sheet1.range((row,col)).value == "":
                            Sheet1.range((row,col)).value = GSS_Sheet1.range('A15:D15').options(ndim=2).value 
                self.queue.task_done()
                appendWorkbook.save(r'{0}\{1}'.format(Directory[0],GSS_Excel[2]))
                app.kill()
                app1.kill()
                self.QueueTable.removeRow(self.QueueTable.rowCount()-1)
                if self.queue.empty():
                    break
        except:
            print(traceback.format_exc())

示例:

Excel 个工作簿在队列中:

  1. IS_1.xlsx

  2. IS_2.xlsx

  3. IS_3.xlsx

要将数据添加到的特定工作簿:

Append.xlsx

如图所示,我想附加到 A7:F7 - 无需手动指定行。我正在寻找某种类型的 xlwings 代码,它在 excel sheet 中搜索下一个空白行,然后粘贴到它。

Append.xlsx:

使用以下信息解决:

def run(self):
    try:
        while True:
            app = xw.App(visible=False)
            appendWorkbook = xw.Book(r'{0}\{1}'.format(Directory[0],GSS_Excel[2]))
            Sheet1 = appendWorkbook.sheets['Sheet1']
            app1 = xw.App(visible=False)
            GSS_EIS = xw.Book(r'{0}'.format(self.queue.get()))
            GSS_Sheet1 = GSS_EIS.sheets['GSS Data']
            var = Sheet1.range('A' + str(Sheet1.cells.last_cell.row)).end('up').row + 1
            Sheet1.range((var,1)).value = GSS_Sheet1.range('A15:D15').options(ndim=2).value 
            self.queue.task_done()
            appendWorkbook.save(r'{0}\{1}'.format(Directory[0],GSS_Excel[2]))
            app.kill()
            app1.kill()
            self.QueueTable.removeRow(self.QueueTable.rowCount()-1)
            if self.queue.empty():
                break
    except:
        print(traceback.format_exc())

搜索最后一行数据然后添加 + 1 得到空白行