MySQL表結構導出(Excel)

???????

目錄

一、java實現MySQL表結構導出(Excel)

二、python實現MySQL表結構導出(Excel)


????????又到了寫畢設的時候了,計算機專業在寫論文第四章系統設計的時候肯定會遇到和我一樣的難題——要在論文中將數據庫的表結構以表格形式展示出來,小編在度娘搜了很多文章,但是收獲不大,很多沒有達到我的預期(以表格形式展示出來)。

????????最后,小編決定發揮一下idea的作用,自己寫一個工具類,打印數據庫中的表的表結構,最后將其保存到excel表中,這樣更加方便移到論文中。

? ? ? ? 廢話不多說,咱們直接開始。

一、java實現MySQL表結構導出(Excel)

MysqlExporterToExcel.java類

package com.example.demo.utils;import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.sql.*;
import java.util.HashMap;
import java.util.Map;import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;public class MysqlExporterToExcel extends JFrame {private JTextField hostField;private JTextField userField;private JPasswordField passwordField;private JTextField databaseField;private JTextField outputFileField;public MysqlExporterToExcel() {setTitle("MySQL 表結構導出工具");setSize(600, 400);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setLocationRelativeTo(null);JPanel panel = new JPanel();panel.setLayout(new GridLayout(6, 2));JLabel hostLabel = new JLabel("主機:");hostField = new JTextField("localhost");JLabel userLabel = new JLabel("用戶名:");userField = new JTextField("root");JLabel passwordLabel = new JLabel("密碼:");passwordField = new JPasswordField("123456");JLabel databaseLabel = new JLabel("數據庫:");databaseField = new JTextField("");// 設置默認輸出路徑和文件名String defaultPath = "C:/software/mysql/table_structure.xlsx";JLabel outputFileLabel = new JLabel("輸出文件:");outputFileField = new JTextField(defaultPath);JButton exportButton = new JButton("導出");panel.add(hostLabel);panel.add(hostField);panel.add(userLabel);panel.add(userField);panel.add(passwordLabel);panel.add(passwordField);panel.add(databaseLabel);panel.add(databaseField);panel.add(outputFileLabel);panel.add(outputFileField);panel.add(new JLabel());panel.add(exportButton);add(panel);exportButton.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {String host = hostField.getText();String user = userField.getText();String password = new String(passwordField.getPassword());String database = databaseField.getText();String outputFile = outputFileField.getText();// 輸入驗證if (host.isEmpty() || user.isEmpty() || database.isEmpty() || outputFile.isEmpty()) {JOptionPane.showMessageDialog(MysqlExporterToExcel.this,"請確保主機、用戶名、數據庫和輸出文件都已填寫", "輸入錯誤", JOptionPane.ERROR_MESSAGE);return;}// 檢查并創建目錄File file = new File(outputFile);File parentDir = file.getParentFile();if (!parentDir.exists()) {if (!parentDir.mkdirs()) {JOptionPane.showMessageDialog(MysqlExporterToExcel.this,"無法創建目錄: " + parentDir.getAbsolutePath(), "目錄創建失敗", JOptionPane.ERROR_MESSAGE);return;}}exportTableStructure(host, user, password, database, outputFile);}});}private void exportTableStructure(String host, String user, String password, String database, String outputFile) {String url = "jdbc:mysql://" + host + ":3306/" + database;try (Connection connection = DriverManager.getConnection(url, user, password);Statement statement = connection.createStatement();Workbook workbook = new XSSFWorkbook()) {// 檢查數據庫連接是否成功if (connection.isValid(5)) {Sheet sheet = workbook.createSheet("表結構");ResultSet tables = statement.executeQuery("SHOW TABLES");int rowNum = 0;String[] headers = {"序號", "名稱", "類型", "空", "長度", "主鍵", "說明", "其他備注"};while (tables.next()) {String tableName = tables.getString(1);// 寫入表名相關信息Row tableNameRow = sheet.createRow(rowNum++);tableNameRow.createCell(0).setCellValue("表名:");tableNameRow.createCell(1).setCellValue(tableName);// 寫入表頭Row headerRow = sheet.createRow(rowNum++);for (int col = 0; col < headers.length; col++) {Cell cell = headerRow.createCell(col);cell.setCellValue(headers[col]);}// 獲取主鍵信息ResultSet primaryKeys = connection.getMetaData().getPrimaryKeys(null, null, tableName);Map<String, Boolean> primaryKeyMap = new HashMap<>();while (primaryKeys.next()) {String primaryKeyColumn = primaryKeys.getString("COLUMN_NAME");primaryKeyMap.put(primaryKeyColumn, true);}primaryKeys.close();ResultSet columns = connection.getMetaData().getColumns(null, null, tableName, null);ResultSetMetaData metaData = columns.getMetaData();int extraColumnIndex = -1;for (int i = 1; i <= metaData.getColumnCount(); i++) {if ("EXTRA".equalsIgnoreCase(metaData.getColumnName(i))) {extraColumnIndex = i;break;}}int serialNumber = 1;while (columns.next()) {String columnName = columns.getString("COLUMN_NAME");String columnType = columns.getString("TYPE_NAME");int nullable = columns.getInt("NULLABLE");String isNullable = (nullable == ResultSetMetaData.columnNullable)? "是" : "否";int columnSize = columns.getInt("COLUMN_SIZE");String isPrimaryKey = primaryKeyMap.containsKey(columnName)? "是" : "否";// 簡單的字段名翻譯示例,可根據實際情況擴展String description = translateColumnName(columnName);String extra = "";if (extraColumnIndex != -1) {extra = columns.getString(extraColumnIndex);}if ("".equals(extra)) {extra = "<空>";}Row row = sheet.createRow(rowNum++);row.createCell(0).setCellValue(serialNumber++);row.createCell(1).setCellValue(columnName);row.createCell(2).setCellValue(columnType);row.createCell(3).setCellValue(isNullable);row.createCell(4).setCellValue(columnSize);row.createCell(5).setCellValue(isPrimaryKey);row.createCell(6).setCellValue(description);row.createCell(7).setCellValue(extra);}// 在每個表的信息后插入一個空行sheet.createRow(rowNum++);}tables.close();// 調整列寬for (int col = 0; col < headers.length; col++) {sheet.autoSizeColumn(col);}// 保存 Excel 文件try (FileOutputStream fileOut = new FileOutputStream(outputFile)) {workbook.write(fileOut);JOptionPane.showMessageDialog(this, "表結構已成功導出到 " + outputFile);}} else {JOptionPane.showMessageDialog(this, "無法連接到數據庫", "連接錯誤", JOptionPane.ERROR_MESSAGE);}} catch (SQLException sqlEx) {if (sqlEx.getSQLState().startsWith("28")) {JOptionPane.showMessageDialog(this, "用戶名或密碼錯誤", "認證錯誤", JOptionPane.ERROR_MESSAGE);} else if (sqlEx.getSQLState().startsWith("08")) {JOptionPane.showMessageDialog(this, "無法連接到數據庫,請檢查主機和端口", "連接錯誤", JOptionPane.ERROR_MESSAGE);} else {JOptionPane.showMessageDialog(this, "導出失敗: " + sqlEx.getMessage(), "錯誤", JOptionPane.ERROR_MESSAGE);}} catch (IOException ioEx) {JOptionPane.showMessageDialog(this, "文件寫入失敗: " + ioEx.getMessage(), "文件錯誤", JOptionPane.ERROR_MESSAGE);}}private String translateColumnName(String columnName) {// 簡單的翻譯映射,可根據實際情況擴展Map<String, String> translationMap = new HashMap<>();translationMap.put("id", "編號");translationMap.put("name", "名稱");translationMap.put("age", "年齡");// 可以繼續添加更多的翻譯映射return translationMap.getOrDefault(columnName, "");}public static void main(String[] args) {SwingUtilities.invokeLater(new Runnable() {@Overridepublic void run() {MysqlExporterToExcel exporter = new MysqlExporterToExcel();exporter.setVisible(true);}});}
}

在java中還要引入依賴,這我就不細說了。

<!--導出表--><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.3</version></dependency>

這樣就可以了。

我們看一下運行效果:

上面的都可以修改。

小提醒:最后就是數據庫的問題

在java類中,我寫的是

String url = "jdbc:mysql://" + host + ":3306/" + database;

因為安裝數據庫時默認端口為3306,可能你在安裝時3306被占用,比如你在安裝時輸入的是3308,這里也要改為3308。

二、python實現MySQL表結構導出(Excel)

可能有的人要問了,小編小編,我不會java怎么辦啊,考慮到一些同學沒有學習java,我寫了一個pyhton版。下面就是python的代碼

import tkinter as tk
from tkinter import messagebox
import pymysql
from openpyxl import Workbook
import osclass MysqlTableStructureExporter:def __init__(self):self.root = tk.Tk()self.root.title("MySQL 表結構導出工具")# 定義輸入框和標簽tk.Label(self.root, text="主機:").grid(row=0, column=0)self.host_field = tk.Entry(self.root, width=30)  # 修改寬度為 30self.host_field.insert(0, "localhost")self.host_field.grid(row=0, column=1)tk.Label(self.root, text="用戶名:").grid(row=1, column=0)self.user_field = tk.Entry(self.root, width=30)  # 修改寬度為 30self.user_field.insert(0, "root")self.user_field.grid(row=1, column=1)tk.Label(self.root, text="密碼:").grid(row=2, column=0)self.password_field = tk.Entry(self.root, show="*", width=30)  # 修改寬度為 30self.password_field.insert(0, "123456")self.password_field.grid(row=2, column=1)tk.Label(self.root, text="數據庫:").grid(row=3, column=0)self.database_field = tk.Entry(self.root, width=30)  # 修改寬度為 30self.database_field.grid(row=3, column=1)tk.Label(self.root, text="輸出文件:").grid(row=4, column=0)default_path = "C:/software/mysql/table_structure.xlsx"self.output_file_field = tk.Entry(self.root, width=30)  # 修改寬度為 30self.output_file_field.insert(0, default_path)self.output_file_field.grid(row=4, column=1)# 導出按鈕export_button = tk.Button(self.root, text="導出", command=self.export_table_structure)export_button.grid(row=5, column=0, columnspan=2)def run(self):self.root.mainloop()def export_table_structure(self):host = self.host_field.get()user = self.user_field.get()password = self.password_field.get()database = self.database_field.get()output_file = self.output_file_field.get()# 輸入驗證if not host or not user or not database or not output_file:messagebox.showerror("輸入錯誤", "請確保主機、用戶名、數據庫和輸出文件都已填寫")return# 檢查并創建目錄output_dir = os.path.dirname(output_file)if not os.path.exists(output_dir):try:os.makedirs(output_dir)except OSError:messagebox.showerror("目錄創建失敗", f"無法創建目錄: {output_dir}")returntry:# 連接數據庫connection = pymysql.connect(host=host, user=user, password=password, database=database)cursor = connection.cursor()# 創建 Excel 工作簿和工作表workbook = Workbook()sheet = workbook.activesheet.title = "表結構"# 獲取所有表名cursor.execute("SHOW TABLES")tables = cursor.fetchall()row_num = 0for table in tables:table_name = table[0]# 寫入表名sheet.cell(row=row_num + 1, column=1, value="表名:")sheet.cell(row=row_num + 1, column=2, value=table_name)row_num += 1# 寫入表頭headers = ["序號", "名稱", "類型", "空", "長度", "主鍵", "說明", "其他備注"]for col, header in enumerate(headers, start=1):sheet.cell(row=row_num + 1, column=col, value=header)row_num += 1# 獲取主鍵信息cursor.execute(f"SHOW KEYS FROM {table_name} WHERE Key_name = 'PRIMARY'")primary_keys = [row[4] for row in cursor.fetchall()]# 獲取表的列信息cursor.execute(f"SHOW FULL COLUMNS FROM {table_name}")columns = cursor.fetchall()serial_number = 1for column in columns:column_name = column[0]column_type = column[1]is_nullable = "是" if column[2] == "YES" else "否"column_size = column[1].split("(")[-1].rstrip(")") if "(" in column[1] else ""is_primary_key = "是" if column_name in primary_keys else "否"description = self.translate_column_name(column_name)extra = column[8] if column[8] else "<空>"sheet.cell(row=row_num + 1, column=1, value=serial_number)sheet.cell(row=row_num + 1, column=2, value=column_name)sheet.cell(row=row_num + 1, column=3, value=column_type)sheet.cell(row=row_num + 1, column=4, value=is_nullable)sheet.cell(row=row_num + 1, column=5, value=column_size)sheet.cell(row=row_num + 1, column=6, value=is_primary_key)sheet.cell(row=row_num + 1, column=7, value=description)sheet.cell(row=row_num + 1, column=8, value=extra)row_num += 1serial_number += 1# 插入空行row_num += 1# 調整列寬for column in sheet.columns:max_length = 0column_letter = column[0].column_letterfor cell in column:try:if len(str(cell.value)) > max_length:max_length = len(str(cell.value))except:passadjusted_width = (max_length + 2)sheet.column_dimensions[column_letter].width = adjusted_width# 保存 Excel 文件workbook.save(output_file)messagebox.showinfo("導出成功", f"表結構已成功導出到 {output_file}")except pymysql.Error as e:if e.args[0] in [1045]:  # 認證錯誤messagebox.showerror("認證錯誤", "用戶名或密碼錯誤")elif e.args[0] in [2003]:  # 連接錯誤messagebox.showerror("連接錯誤", "無法連接到數據庫,請檢查主機和端口")else:messagebox.showerror("錯誤", f"導出失敗: {str(e)}")except Exception as e:messagebox.showerror("文件錯誤", f"文件寫入失敗: {str(e)}")finally:if 'connection' in locals():connection.close()def translate_column_name(self, column_name):# 簡單的翻譯映射,可根據實際情況擴展translation_map = {"id": "編號","name": "名稱","age": "年齡"}return translation_map.get(column_name, "")if __name__ == "__main__":exporter = MysqlTableStructureExporter()exporter.run()

復制代碼后直接導入包就行。

我們來看一下運行效果

效果還是不錯的。如果要修改可以根據上面java的來改,方法類似。

最后看一下excel表吧

可以看到非常清楚,方便復制

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/75788.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/75788.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/75788.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android使用OpenGL和MediaCodec渲染視頻

目錄 一&#xff0c;借助MediaCodec封裝解碼工具類VideoCodec 二&#xff0c;使用OpenGl繪制視頻封裝SoulFilter 一&#xff0c;借助MediaCodec封裝解碼工具類VideoCodec /*** 解碼工具類* 解碼完成后的數據 通過 ISurface 回調出去*/ public class VideoCodec {private ISu…

day39——輸入操作:多值輸入

數組輸入&#xff1a; int main() {//***** 1、多值輸入&#xff08;C&#xff09;/*輸入&#xff1a;3 --> 3個值5 4 9*/int n;cin >> n; //輸入個數const int MAX_SIZE 0xFFFF;//限定最大個數int a[MAX_SIZE];for (int i 0; i < n; i) {//用 n 作控制輸入…

第九課:LoRA模型的原理及應用

文章目錄 Part.01 3種LoRA的使用方式Part.02 5種LoRA的應用方向Part.01 3種LoRA的使用方式 LoRA能夠在家用級設備上訓練,實現對Checkpoint在某些方面的微調使用Lora的三種方式:放置Lora模型到目錄中,然后作為提示詞的一部分輸入。點擊生成按鈕下面的“畫”,然后打開Additio…

Cortex-M3 NVIC可以控制異常向量表的哪些部分

Cortex-M3 的 NVIC(嵌套向量中斷控制器)不直接控制整個異常向量表,但可以管理向量表中與中斷相關的部分行為。以下是 NVIC 對異常向量表的具體控制范圍和相關機制: 1. NVIC 直接控制的部分 NVIC 主要管理 外部中斷(IRQ) 和部分 系統異常 的行為,但對向量表本身的存儲位…

雙向鏈表增刪改查的模擬實現

本章目標 0.雙向鏈表的基本結構 1.雙向鏈表的初始化 2.頭插尾插 3.頭刪尾刪 4.查找與打印 5.在指定位置之前插入數據/在指定位置之后插入數據 6.在指定位置之前刪除數據/在指定位置之后刪除數據 7.銷毀鏈表 0.雙向鏈表的基本結構 本章所實現的雙向鏈表是雙向循環帶頭鏈表,是…

實戰交易策略 篇十四:江南神鷹捕捉熱點和熊市生存交易策略

文章目錄 系列文章捕捉熱點是股市最大的掘金術市場溫度不低于50是熱點產生的必要條件題材的大小和新穎程度決定熱點的持續時間和漲幅炒作熱點的3個階段捕捉熱點的方法與步驟操作實戰案例熊市生存術“熊市最好的做法是離開股市”的說法是一句空話熊市盈利模式:不輕言底部,超跌…

Linux錯誤(6)X64向量指令訪問地址未對齊引起SIGSEGV

Linux錯誤(6)X64向量指令訪問地址未對齊引起SIGSEGV Author: Once Day Date: 2025年4月4日 一位熱衷于Linux學習和開發的菜鳥&#xff0c;試圖譜寫一場冒險之旅&#xff0c;也許終點只是一場白日夢… 漫漫長路&#xff0c;有人對你微笑過嘛… 全系列文章可參考專欄: Linux實…

解碼 __iter__ 和 itertools.islice - 迭代的藝術

文章目錄 前言一、`_iter__`:自定義迭代的鑰匙1.1 什么是 __iter__?1.2 基本用法1.3 高級用法:獨立迭代器二、itertools.islice:迭代切片的利器2.1 什么是 itertools.islice?2.2 基本用法2.3 處理無限序列2.4 實際應用三、`__iter__` 與 `islice` 的結合六、為什么需要它們…

使用VSCode編寫C#程序

目錄 一、環境搭建&#xff1a;構建高效開發基礎1. 安裝VSCode2. 配置.NET SDK3. 安裝核心擴展 二、項目開發全流程1. 創建項目2. 代碼編輯技巧3. 調試配置4. 高級調試技巧5. 編譯與運行 三、常見問題解決指南1. 項目加載失敗2. IntelliSense失效3. 代碼格式化4. 典型編譯錯誤&…

日本汽車規模性經濟計劃失敗,日產三大品牌的合并合作共贏,還是絕地求生?本田與日產合并確認失敗,將成為世界第三大汽車集團愿景失敗

本田與日產(含三菱汽車)的合并計劃最終因核心矛盾無法調和而宣告失敗,這一事件揭示了傳統車企在行業變革期的深層困境。以下從合并動機、失敗原因、本質判斷及未來影響等方面綜合分析: 一、合并的初衷:生存壓力主導的被動策略 市場危機與財務困境 中國市場潰敗:日系品牌在…

AutoCAD2026中文版下載安裝教程

AutoCAD是一款由Autodesk公司開發的計算機輔助設計軟件&#xff0c;被廣泛應用于建筑設計、機械設計、電氣設計、土木工程、裝飾裝潢等多個領域。AutoCAD2026中文版在原有的基礎上進行了多項改進和優化&#xff0c;為用戶提供了更為高效、便捷的繪圖和設計體驗。這里我給大家分…

Latex語法入門之數學公式

Latex是一種高質量的排版系統&#xff0c;尤其擅長于數學公式的排版。本文我將帶大家深入了解Latex在數學公式排版中的應用。從基礎的數學符號到復雜的公式布局&#xff0c;我們都會一一講解&#xff0c;通過本文的學習&#xff0c;你將能夠輕松編寫出清晰、美觀的數學公式&…

洛谷 P3214 [HNOI2011] 卡農

題目傳送門 前言 再次敗在 d p dp dp 手下&#xff0c;但是數據范圍這么小應該是可以看出是 d p dp dp 的&#xff08;畢竟對于其他組合數的問題數據范圍都是 1 0 9 10^9 109 起步&#xff09;。 思路 題意簡化 現有 1 , 2 , 3 , . . . , n ? 1 , n 1, 2, 3, ... , n -…

【年份數據類型及使用】

在數據分析中,年份的處理需要根據具體場景選擇合適的數據類型,以確保后續分析的準確性和效率。以下是常見的年份數據類型及使用場景: 1. 數值類型(整數或浮點數) 適用場景: 僅需存儲年份數值(如 2020, 2023),無需進行日期計算。需要將年份作為連續變量參與數學運算(如…

詳解七大排序

目錄 一.直接插入排序 &#xff08;1&#xff09;基本思想 &#xff08;2&#xff09;算法步驟 &#xff08;3&#xff09;代碼實現 &#xff08;4&#xff09;算法特性 &#xff08;5&#xff09;算法優化 &#xff08;6&#xff09;示例演示 二.希爾排序 &#xff08…

YOLOv12 訓練從這里開始:LabelImg 標注數據集

視頻講解&#xff1a; YOLOv12 訓練從這里開始&#xff1a;LabelImg 標注數據集 labelimg https://github.com/tzutalin/labelImg sudo apt-get install pyqt5-dev-tools pip3 install lxml git clone https://github.com/tzutalin/labelImg.git cd labelImg 開始編譯 make…

Day2:前端項目uniapp壁紙實戰

先來做一個輪番圖。 效果如下&#xff1a; common-style.css view,swiper,swiper-item{box-sizing: border-box; } index.vue <template><view class"homeLayout"><view class"banner"><swiper circular indicator-dots autoplay…

SAP-ABAP:ABAP `LEAVE LIST-PROCESSING` 深度解析

ABAP LEAVE LIST-PROCESSING 深度解析 核心機制 模式切換(Dialog → List) 中斷屏幕流 強制終止當前Dialog程序的PBO/PAI處理,脫離屏幕序列控制(如事務碼SE38執行的程序)。觸發報表事件 激活類報表程序的事件鏈:INITIALIZATION → AT SELECTION-SCREEN → START-OF-SEL…

在PyTorch中使用GPU加速:從基礎操作到模型部署

本文將通過具體代碼示例&#xff0c;詳細介紹如何在PyTorch中利用GPU進行張量計算和模型訓練&#xff0c;包含設備查詢、數據遷移以及模型部署等完整流程。 1. 查看GPU硬件信息 使用 nvidia-smi 命令檢查GPU狀態和進程信息&#xff1a; # 查看GPU信息 !nvidia-smi 輸出示例&…

lib-zo,C語言另一個協程庫,dns協程化, gethostbyname

lib-zo,C語言另一個協程庫,dns協程化, gethostbyname 另一個 C 協程庫 https://blog.csdn.net/eli960/article/details/146802313 本協程庫 支持 DNS查詢 協程化. 禁用所有 UDP 協程化 zvar_coroutine_disable_udp 1;禁用 53 端口的UDP 協程化 zvar_coroutine_disable_ud…