通常在辦公當中,Excel會自動保存以前編輯過的文件,通過“打開”菜單就可以找到最近打開的文件。
這個功能,對于一些記憶不好的人來說,十分有用,因為在電腦里查找一個文件也十分困擾的事情。
如果你常常為了找不到文件而煩惱,那么下面的內容對你一定有幫助。
針對使用過的文件記錄,Excel有一個自己的儲存方式,我們要學習的就是,很好地利用這個方法,把曾經編輯過的文件找出來。
用到兩個對象:RecentFiles和RecentFile
是不是感覺一樣,其實這兩個對象前者是后者的集合。
使用上有些不相同,下圖為具體對象的方法和屬性。
使用方法
Application.RecentFiles
一定要是Application下使用,表示Excel應用下的對象。
如要查看有多少個文件:
Application.RecentFiles.Count
后面加屬性(.Count)即可。
某一個文件用如下代碼:
Application.RecentFiles.Item(1)'代表第一個文件
如果要設置文件數,如下代碼:
Application.RecentFiles.Maximum=8
數字8代表最多可以查看8個曾經打開的文件。
這里根據Excel版本不同數量也不相同,2016版32位最多50個文件。
上圖為一個示例,將以列表形式把最近打開過的Excel文件列出來,雙擊文件名打開文件。
功能上還是可以的,使用起來很方便。
增加一個文本框可以自定義打開的文件數。
顯示文件按鈕代碼
Private Sub CommandButton1_Click()
Dim Fx As Variant
Fx=ActiveSheet.TextBox1.Value'文件數量設置
If VBA.Len(Fx)=0 Then Exit Sub
If VBA.Trim(Fx) <=0 Then Exit Sub
If VBA.Trim(Fx) > 50 Then'設置文件數量最大為50
Fx=50
TextBox1.Value=Fx
End If
If Not VBA.IsNumeric(Fx) Then Exit Sub
Application.RecentFiles.Maximum=Fx
Dim x As Long
x=Application.RecentFiles.Count
Dim xArr
ReDim xArr(0 To x - 1)'定義文件數組
For i=1 To x
xArr(i - 1)=Application.RecentFiles.Item(i).Path'數組賦值
Next i
ActiveSheet.ListBox1.List=xArr'列表框賦值
End Sub
雙擊列表框功能代碼
Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Dim Finx As Long, Fpath As Variant
Finx=ActiveSheet.ListBox1.ListCount
Fpath=ActiveSheet.ListBox1.Value
If Finx=0 Then Exit Sub
Workbooks.Open Fpath'打開文件
End Sub
這個小功能很方便,特別是平時辦公的時候,對于文件打開方式是一個不錯的選擇。
其實這個功能在Excel菜單里就有,但是使用起來可能沒有如此快捷,畢竟Excel設置文件數量固定以后,就是那么多,不能靈活查看更多。
---END---
歡迎關注、收藏
在通常情況下,用戶使用一個軟件的時候,期望保存一些數據狀態,比如窗口的大小和位置,主題,選項,最近操作過的文件等等信息,在下一次啟動軟件的時候就自動加載這些信息,讓軟件恢復到上一次退出時的狀態。在Windows系統中,這些信息通常存儲在系統注冊表中,在macOS和iOS則存儲在屬性列表中。在Unix系統上,在沒有標準情況下,許多應用都使用INI文件來保存配置信息。 QSettings就是圍繞不同的系統做了技術上的抽象,使開發者可以輕松實現在不同系統間可移植的方式來保存和恢復應用程序設置。同時QSetting還可以支持自定義存儲格式來保存和恢復應用程序的設置。
QSettings類提供一種與平臺無關的應用程序設置的保存和恢復技術。可以用下面的方式創建QSettings對象。
方式一: 傳遞給QSettings兩個參數,第一個為公司或者組織的名稱(如MySoft),第二個是應用程序的名稱(如 MyProgram),創建一個QSettings對象:
self.settings=QSettings('MySoft', 'MyProgram')
說明,在Windows下同下,這種方式信息寫在注冊表中。
方式二:指定配置文件名和配置文件格式的方式來創建,如下面的語句將以ini文件的格式創建一個名為config.ini的配置信息文件:
self.settings=QSettings('config.ini', QSettings.IniFormat)
使用函數setValue()來存儲數據,如果已經存在相同的鍵值,那么新設置的值將覆蓋就的設置值。為了保證效率,所做的更改有可能不會馬上存儲到文件中,使用sync()函數可以保證設置同步存儲到文件中。函數 value()返回存儲的鍵值。
鍵(key)可以包含任何Unicode字符。Windows注冊表和INI文件使用不區分大小寫的鍵,而macOS和iOS上的CFPreferences API使用不區分大小寫的鍵。為避免可移植性問題,請遵循以下簡單規則:
可以使用'/'字符作為分隔符來形成分層鍵,類似于Unix文件路徑。例如:
self.settings.setValue("mainwindow/size", self.win.size()
self.settings.setValue("mainwindow/fullScreen", self.win.isFullScreen()
self.settings.setValue("outputpanel/visible", self.panel.isVisible()
如果要保存或者讀取很多具有相同分組的設置,則可以使用beginGroup()指定分組前綴,并在最后調用endGroup()。使用分組機制,演示上面的示例代碼如下:
self.settings.beginGroup("mainwindow");
self.settings.setValue("size", self.win->size())
self.settings.setValue("fullScreen", self.win.isFullScreen())
self.settings.endGroup();
self.settings.beginGroup("outputpanel");
self.settings.setValue("visible", self.panel.isVisible())
self.settings.endGroup()
在前面notepay.py的基礎上,添加了三個函數initRecentFile(), updateRecentFileMneu() 和updateRecentFiles(),演示了使用QSettings為程序添加最近列表的功能。 完整代碼如下:
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import Qt, QSettings
from PyQt5.QtWidgets import (QApplication, QMainWindow, QMenuBar, QMenu,
QAction, QPlainTextEdit, QStyle, QFileDialog,
QMessageBox, QToolBar, QStatusBar, QLabel)
class DemoNotepad(QMainWindow):
def __init__(self, parent=None):
super(DemoNotepad, self).__init__(parent)
# 設置窗口標題
self.setWindowTitle('實戰 Qt for Python: QSettings 演示-記事本')
# 設置窗口大小
self.resize(480, 360)
self.path = None
self.initUi()
def initUi(self):
#設置一個文本編輯器作為中心小部件
self.txtEditor = QPlainTextEdit(self)
self.setCentralWidget(self.txtEditor)
self.initRecentFileList()
#創建菜單條和工具條使用的Action
self.initActions()
#初始化菜單條
self.initMenuBar()
#初始化化工具條
self.initToolBar()
#初始化狀態條
self.initStatusBar()
def initActions(self):
style = QApplication.style()
#新建文件
self.aFileNew = QAction('新建(&N)', self)
#添加一個圖標
self.aFileNew.setIcon(style.standardIcon(QStyle.SP_FileIcon))
#添加快捷鍵
self.aFileNew.setShortcut(Qt.CTRL + Qt.Key_N)
self.aFileNew.setToolTip('新建一個文本文件')
self.aFileNew.triggered.connect(self.onFileNew)
#打開文件
self.aFileOpen = QAction('打開(&O)...', self)
self.aFileOpen.setIcon(style.standardIcon(QStyle.SP_DialogOpenButton))
self.aFileOpen.setShortcut(Qt.CTRL + Qt.Key_O)
self.aFileOpen.setToolTip('打開一個文本文件')
self.aFileOpen.triggered.connect(self.onFileOpen)
#保存
self.aFileSave = QAction('保存(&S)', self)
self.aFileSave.setIcon(style.standardIcon(QStyle.SP_DialogSaveButton))
self.aFileSave.setShortcut(Qt.CTRL + Qt.Key_S)
self.aFileSave.setToolTip('保存文本文件')
self.aFileSave.triggered.connect(self.onFileSave)
#另存為
self.aFileSaveAs = QAction('另存為(&A)...', self)
self.aFileSaveAs.triggered.connect(self.onFileSaveAs)
#退出
self.aFileExit = QAction('退出(&X)', self)
self.aFileExit.triggered.connect(self.close)
#撤銷編輯
self.aEditUndo = QAction('撤銷(&U)',self)
self.aEditUndo.setShortcut(Qt.CTRL + Qt.Key_Z)
self.aEditUndo.triggered.connect(self.txtEditor.undo)
#恢復編輯
self.aEditRedo = QAction('恢復(&R)', self)
self.aEditRedo.setShortcut(Qt.CTRL + Qt.Key_Y)
self.aEditUndo.triggered.connect(self.txtEditor.redo)
#剪切操作
self.aEditCut = QAction('剪切(&T)', self)
self.aEditCut.setShortcut(Qt.CTRL + Qt.Key_X)
self.aEditCut.triggered.connect(self.txtEditor.cut)
#復制操作
self.aEditCopy = QAction('復制(&C)', self)
self.aEditCopy.setShortcut(Qt.CTRL + Qt.Key_C)
self.aEditCopy.triggered.connect(self.txtEditor.copy)
#粘貼操作
self.aEditPaste = QAction('粘貼(&P)', self)
self.aEditPaste.setShortcut(Qt.CTRL + Qt.Key_V)
self.aEditPaste.triggered.connect(self.txtEditor.paste)
#刪除操作
self.aEditDel = QAction('刪除(&L)', self)
self.aEditDel.setShortcut(Qt.Key_Delete)
self.aEditDel.triggered.connect(self.onEditDelete)
#全選操作
self.aEditSelectAll = QAction('全選(&A)', self)
self.aEditSelectAll.setShortcut(Qt.CTRL + Qt.Key_A)
self.aEditSelectAll.triggered.connect(self.txtEditor.selectAll)
self.aFmtAutoLine = QAction('自動換行(&W)', self)
self.aFmtAutoLine.setCheckable(True)
self.aFmtAutoLine.setChecked(True)
self.aFmtAutoLine.triggered[bool].connect(self.onFormatAutoLine)
self.aHelpAbout = QAction('關于(&A)...', self)
self.aHelpAbout.triggered.connect(self.onHelpAbout)
def initMenuBar(self):
menuBar = self.menuBar()
self.fileMenu = menuBar.addMenu('文件(&F)')
editMenu = menuBar.addMenu('編輯(&E)')
formatMenu = menuBar.addMenu('格式(&O)')
helpMenu = menuBar.addMenu('幫助(&H)')
# ==== 文件操作部分 ==== #
self.fileMenu.addAction(self.aFileNew)
self.fileMenu.addAction(self.aFileOpen)
self.fileMenu.addAction(self.aFileSave)
self.fileMenu.addAction(self.aFileSaveAs)
self.fileMenu.addSeparator()
self.fileMenu.addAction(self.aFileExit)
self.updateRecentFileMenu()
# ==== 編輯部分 ==== #
editMenu.addAction(self.aEditUndo)
editMenu.addAction(self.aEditRedo)
editMenu.addSeparator()
editMenu.addAction(self.aEditCut)
editMenu.addAction(self.aEditCopy)
editMenu.addAction(self.aEditPaste)
editMenu.addAction(self.aEditDel)
editMenu.addSeparator()
editMenu.addAction(self.aEditSelectAll)
#當編輯欄的菜單對象被點擊時, 在狀態欄顯示信息
editMenu.triggered[QAction].connect(self.onProcessTrigger)
# ==== 格式設置部分 ==== #
formatMenu.addAction(self.aFmtAutoLine)
# ==== 幫助部分 ==== #
helpMenu.addAction(self.aHelpAbout)
def initToolBar(self):
toolBar = self.addToolBar('')
toolBar.addAction(self.aFileNew)
toolBar.addAction(self.aFileOpen)
toolBar.addAction(self.aFileSave)
def initStatusBar(self):
self.statusBar = QStatusBar(self)
#添加一個顯示永久信息的標簽控件
self.info = QLabel(self)
self.info.setText('實戰 Qt for Python')
self.info.setAlignment(Qt.AlignRight)
self.statusBar.addPermanentWidget(self.info)
self.setStatusBar(self.statusBar)
def msgCritical(self, strInfo):
dlg = QMessageBox(self)
dlg.setIcon(QMessageBox.Critical)
dlg.setText(strInfo)
dlg.show()
def onFileNew(self):
self.txtEditor.clear()
def onFileOpen(self):
path,_ = QFileDialog.getOpenFileName(self, '打開文件', '', '文本文件 (*.txt)')
if path:
if self.loadFile(path):
#添加到最近打開的菜單列表中
self.updateRecentFiles(path)
#加載文件
def loadFile(self, path):
try:
with open(path, 'r') as f:
text = f.read()
except Exception as e:
self.msgCritical(str(e))
return False
else:
self.path = path
self.txtEditor.setPlainText(text)
self.statusBar.showMessage('打開文件 ' + path, 5000)
return True
def onFileSave(self):
if self.path is None:
return self.onFileSaveAs()
self._saveToPath(self.path)
def onFileSaveAs(self):
path,_ = QFileDialog.getSaveFileName(self, '保存文件', '', '文本文件 (*.txt)')
if not path:
return
self._saveToPath(path)
def _saveToPath(self, path):
text = self.txtEditor.toPlainText()
try:
with open(path, 'w') as f:
f.write(text)
except Exception as e:
self.msgCritical(str(e))
else:
self.path = path
def onEditDelete(self):
tc = self.txtEditor.textCursor()
#tc.select(QtGui.QTextCursor.BlockUnderCursor) 這樣刪除一行
tc.removeSelectedText()
def onFormatAutoLine(self, autoLine):
if autoLine:
self.txtEditor.setLineWrapMode(QPlainTextEdit.WidgetWidth)
else:
self.txtEditor.setLineWrapMode(QPlainTextEdit.NoWrap)
def onHelpAbout(self):
QMessageBox.information(self, '實戰 Qt for Python', 'PyQt5實現的文本編輯器演示版')
def onProcessTrigger(self, action):
self.statusBar.showMessage(action.text() + ' 菜單項被點擊了', 3000)
#初始化最近文件列表信息
def initRecentFileList(self):
#創建一個配置對象
#方式一:
#self.settings = QSettings('Qt-for-Python', 'My notePad')
#方式二:
self.settings = QSettings('config.ini', QSettings.IniFormat)
#加載最近文件
self.recentFiles=self.settings.value('FileList/recentFiles') or []
#添加最近文件菜單行為
self.maxNumRecentFiles = 4 #最多四個最近的文件
self.recentFileActions = []
for i in range (self.maxNumRecentFiles):
self.recentFileActions.append(QAction(self))
#更新最近文件列表菜單
def updateRecentFileMenu(self):
#先移除添加的行為
for action in self.recentFileActions:
self.fileMenu.removeAction(action)
#移除退出菜單項
self.fileMenu.removeAction(self.aFileExit)
#移除多余的
#最近文件
for i, fname in enumerate(self.recentFiles):
action = self.recentFileActions[i]
action.setText(fname)
action.setToolTip('最近打開的文件')
action.setData(fname) #保存數據
action.triggered.connect(self.loadRecentFile)
self.fileMenu.addAction(action)
#恢復退出菜單項
self.fileMenu.addSeparator()
self.fileMenu.addAction(self.aFileExit)
#更新最近文件
def updateRecentFiles(self, fname):
if fname not in self.recentFiles:
self.recentFiles.insert(0, fname)
if len(self.recentFiles) > self.maxNumRecentFiles:
self.recentFiles.pop()
#更新菜單
self.updateRecentFileMenu()
#保存更新后最近菜單列表
self.settings.setValue('FileList/recentFiles', self.recentFiles)
def loadRecentFile(self):
sender = self.sender()
if isinstance(sender, QAction):
fname = sender.data() #取出保存的數據
self.loadFile(fname)
if __name__ == '__main__':
app = QApplication(sys.argv)
window = DemoNotepad()
window.show()
sys.exit(app.exec())
演示結果如下圖:
QSettings測試
前一篇:實戰PyQt5: 124-在應用中訪問系統的標準路徑
請多多關注,評論,收藏,點贊,和轉發。