一、概要
DBF文件是一种数据库文件格式,通常用于存储表格数据。这种文件格式曾经被广泛使用,尤其是在一些较旧的数据库系统中。然而,随着时间的推移,其他更现代的文件格式,如XLS(Excel)、CSV、DOCX(Word文档)和TXT(文本文件)变得越来越流行。转换成这些现代文件格式的主要优势包括:
1、兼容性:这些格式被更广泛的软件支持,包括Microsoft Office套件和其他许多现代的数据分析工具;(主要是用DBF的软件需要付费阅读)
2、可读性:这些格式更容易被人类读取和理解。例如,CSV和TXT文件是纯文本文件,可以用任何文本编辑器打开。而XLS和DOCX文件则可以用Microsoft Office或类似的软件打开,这些软件提供了丰富的用户界面和数据分析工具;
3、数据处理:转换成CSV或XLS格式可以使数据更容易被导入到数据分析工具或电子表格软件中,从而进行更高级的数据处理和分析;
4、共享和发布:这些现代文件格式更适合于共享和发布数据。例如,如果你有一个数据集并希望其他人能够查看或分析,将其转换为CSV或XLS格式可能会更加方便。
因此,将DBF文件转换为这些现代文件格式可以提高数据的可用性、可读性和可处理性。
二、使用说明
1、在“DBF文件路径“中输入DBF文件路径;
2、在“存储路径”中输入要存储的路径;
3、选择要生成的文件格式,默认“EXCEL”;
4、点击“运行”即可生成。
三、完整代码
代码的整体架构比较清晰,阅读以下代码中的注释即理解。
源文件下载请点击这里【DBF格式转换器.zip】
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2023-08-27 14:11
# @Author : Leuanghing Chen
# @Blog : https://blog.csdn.net/weixin_46153372?spm=1010.2135.3001.5421
# @File : DBF格式转换器.py
# @Software : PyCharm
# pyinstaller --exclude-module EXCLUDES --onefile -F -w --icon F:\python_demo\1、pyqt5_projects\25_读取dbf文件\format_conversion.ico F:\python_demo\1、pyqt5_projects\25_读取dbf文件\DBF格式转换器.py
import sys
import dbfread
import pandas as pd
from openpyxl import Workbook
from docx import Document # 导入docx包
from docx.shared import Pt, RGBColor, Cm # 设置字体大小、颜色、页面边距
from docx.oxml.ns import qn # 中文字体
from docx.enum.table import WD_CELL_VERTICAL_ALIGNMENT # 导入单元格垂直对齐
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT # 导入段落对齐
from PyQt5.QtCore import QSize, QTimer
from PyQt5.QtGui import QIcon, QPixmap, QFont
from PyQt5.QtWidgets import QFileDialog, QMainWindow, QDialog, QSizePolicy, QGridLayout, QTextEdit, QWidget, QLineEdit, QLabel, QToolButton
from PyQt5 import QtCore, QtGui, QtWidgets
# 使用说明对话框
class Instructions_Dialog(QDialog):
def __init__(self, parent=None):
super().__init__(parent)
self.setWindowTitle("使用说明")
self.resize(420, 270)
sizePolicy = QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.sizePolicy().hasHeightForWidth())
self.setSizePolicy(sizePolicy)
self.setMinimumSize(QSize(420, 270))
self.setMaximumSize(QSize(420, 270))
self.icon = QIcon()
self.icon.addPixmap(QPixmap(r"F:\python_demo\1、pyqt5_projects\25_读取dbf文件\illustrate.ico"), QIcon.Normal, QIcon.Off)
self.setWindowIcon(self.icon)
self.gridLayout = QGridLayout(self)
self.textEdit = QTextEdit(self)
sizePolicy = QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.textEdit.sizePolicy().hasHeightForWidth())
self.textEdit.setSizePolicy(sizePolicy)
self.textEdit.setMinimumSize(QSize(400, 250))
self.textEdit.setMaximumSize(QSize(400, 250))
self.textEdit.setFont(QFont("Times New Roman", 12))
self.textEdit.setStyleSheet("font: 12pt \"Times New Roman\";")
self.textEdit.insertHtml(
"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
"p, li { white-space: pre-wrap; }\n"
"</style></head><body style=\" font-family:\'Times New Roman\'; font-size:12pt; font-weight:400; font-style:normal;\">\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'SimSun\';\">1</span><span style=\" font-family:\'宋体\';\">、在“新</span><span style=\" font-family:\'SimSun\';\">BOM</span><span style=\" font-family:\'宋体\';\">路径“中输入新</span><span style=\" font-family:\'SimSun\';\">BOM</span><span style=\" font-family:\'宋体\';\">表所在的文件夹路径;</span><span style=\" font-family:\'SimSun\';\"> </span></p>\n"
"<p style=\" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'SimSun\';\">2</span><span style=\" font-family:\'宋体\';\">、在“存储路径”中输入公司统一整理的</span><span style=\" font-family:\'SimSun\';\">BOM</span><span style=\" font-family:\'宋体\';\">文件夹,其中记录了新旧</span><span style=\" font-family:\'SimSun\';\">BOM</span><span style=\" font-family:\'宋体\';\">表;</span><span style=\" font-family:\'SimSun\';\"> </span></p>\n"
"<p style=\" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'SimSun\';\">3</span><span style=\" font-family:\'宋体\';\">、点击“</span><span style=\" font-family:\'SimSun\';\">create</span><span style=\" font-family:\'宋体\';\">”即可将新</span><span style=\" font-family:\'SimSun\';\">BOM</span><span style=\" font-family:\'宋体\';\">表放入指定的文件夹:新</span><span style=\" font-family:\'SimSun\';\">BOM</span><span style=\" font-family:\'宋体\';\">表会移至“可编辑</span><span style=\" font-family:\'SimSun\';\">EXCEL</span><span style=\" font-family:\'宋体\';\">版本”和“最新版本”两个文件夹中,原在这两个文件夹的文件会移至“旧版本”文件夹,用于留档记录。</span><span style=\" font-family:\'SimSun\';\"> </span></p></body></html>")
self.gridLayout.addWidget(self.textEdit, 0, 0, 1, 1)
# 版本对话框
class version_Dialog(QDialog):
def __init__(self, parent=None):
super().__init__(parent)
self.setObjectName("Dialog")
self.icon = QtGui.QIcon()
self.icon.addPixmap(
QtGui.QPixmap(r"F:\python_demo\1、pyqt5_projects\25_读取dbf文件\version.ico"),
QtGui.QIcon.Normal, QtGui.QIcon.Off)
self.setWindowIcon(self.icon)
self.resize(420, 270)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.sizePolicy().hasHeightForWidth())
self.setSizePolicy(sizePolicy)
self.setMinimumSize(QtCore.QSize(420, 270))
self.setMaximumSize(QtCore.QSize(420, 270))
self.gridLayout = QtWidgets.QGridLayout(self)
self.gridLayout.setObjectName("gridLayout")
self.version_textEdit = QtWidgets.QTextEdit(self)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.version_textEdit.sizePolicy().hasHeightForWidth())
self.version_textEdit.setSizePolicy(sizePolicy)
self.version_textEdit.setMinimumSize(QtCore.QSize(400, 250))
self.version_textEdit.setMaximumSize(QtCore.QSize(400, 250))
font = QtGui.QFont()
font.setFamily("Times New Roman")
font.setPointSize(12)
self.version_textEdit.setFont(font)
self.version_textEdit.setStyleSheet("font: 12pt \"Times New Roman\";")
self.version_textEdit.setObjectName("version_textEdit")
self.version_textEdit.setReadOnly(True) # 禁止编辑version_textEdit
self.gridLayout.addWidget(self.version_textEdit)
_translate = QtCore.QCoreApplication.translate
self.setWindowTitle(_translate("Dialog", "版本"))
self.version_textEdit.setHtml(_translate("Dialog",
"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
"p, li { white-space: pre-wrap; }\n"
"</style></head><body style=\" font-family:\'Times New Roman\'; font-size:12pt; font-weight:400; font-style:normal;\">\n"
"<p align=\"justify\" style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'SimSun\';\">Version:V1.0.20230902</span></p>\n"
"<p align=\"justify\" style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'SimSun\';\">Author:Leuanghing Chen</span></p>\n"
"<p align=\"justify\" style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'SimSun\';\">Blog:https://blog.csdn.net/weixin_46153372?spm=1010.2135.3001.5421</span></p></body></html>"))
# 主界面
class Ui_MainWindow(object):
savepath_lineEdit: QLineEdit
dbfpath_toolButton: QToolButton
savepath_label: QLabel
dbfpath_label: QLabel
dbfpath_lineEdit: QLineEdit
gridLayout: QGridLayout
gridLayout_2: QGridLayout
centralwidget: QWidget
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(750, 405)
font = QtGui.QFont()
font.setFamily("楷体")
font.setPointSize(14)
MainWindow.setFont(font)
icon = QtGui.QIcon()
icon.addPixmap(QtGui.QPixmap("format_conversion.ico"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
MainWindow.setWindowIcon(icon)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.gridLayout_2 = QtWidgets.QGridLayout(self.centralwidget)
self.gridLayout_2.setObjectName("gridLayout_2")
self.gridLayout = QtWidgets.QGridLayout()
self.gridLayout.setObjectName("gridLayout")
self.dbfpath_label = QtWidgets.QLabel(self.centralwidget)
self.dbfpath_label.setMinimumSize(QtCore.QSize(150, 30))
self.dbfpath_label.setMaximumSize(QtCore.QSize(150, 30))
font = QtGui.QFont()
font.setFamily("楷体")
font.setPointSize(14)
font.setBold(True)
font.setWeight<