java 如何读取解析 mac 下的 pages 文稿,实现数据库正向工程

简介: 版权声明:本文为 testcs_dn(微wx笑) 原创文章,非商用自由转载-保持署名-注明出处,谢谢。 https://blog.csdn.net/testcs_dn/article/details/80768968 mac下使用 pages 文稿编写的数据库设计文档,虽然 mac 下也有 word,但还是习惯用 pages,感觉它要比 word 开启的速度快一些,使用起来也挺方便的。
版权声明:本文为 testcs_dn(微wx笑) 原创文章,非商用自由转载-保持署名-注明出处,谢谢。 https://blog.csdn.net/testcs_dn/article/details/80768968

mac下使用 pages 文稿编写的数据库设计文档,虽然 mac 下也有 word,但还是习惯用 pages,感觉它要比 word 开启的速度快一些,使用起来也挺方便的。那使用 pages 设计了数据库表结构之后,又不想一个一个字段的去创建数据表结构,所以想到了 java如何读取解析mac下的pages文稿,实现数据库正向工程;这里的正向工程就是生成 SQL 建表语句。


Pages 文稿

Pages 文稿是一款功能强大的文字处理软件,让你能够制作精美的文档。你甚至能使用 Apple Pencil 在你的 iPad 上添加手写备注和手绘插图。利用实时协作功能,你的团队成员可以共同协作,不论他们使用 Mac、iPad、iPhone,
还是使用 PC。原文:https://blog.csdn.net/testcs_dn/article/details/80768968

实现步骤

java 是不能直接读取解析 pages 文稿的,有的文章提到在 Windows 下查看 pages 文稿的方法是把扩展名改为 tar ,然后把它解压出来,会提到PDF文件,直接打开就能看到文件中的内容啦,但是这个我试过,看到的内容很不清楚,而且不能编辑。

上面提到 mac 下也有 word,所以先导致为 word,选择 docx 格式


然后再使用 word 的另存为网页的功能(为什么这样做?其实 java 解析 word 也是比较麻烦的,个人感觉)



这样我们就得到了 htm 格式的文件,如果你写过爬虫,相信接下来就明白怎么做了吧!

我选择使用 Jsoup 框架。

上代码:原文:https://blog.csdn.net/testcs_dn/article/details/80768968

package com.weixiao;

import java.io.File;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

/**
 * 读取网页中的表格,生成建表语句
 * BuildCreateSQL
 * @author lipw
 * @date   2018年6月22日上午9:55:34
 */
public class BuildCreateSQL {

	public static void doCreateSQL(String fileName){
		File file = new File(fileName);
		
		Document doc = null;
		if (file.exists()) {
			try {
				// 解析网页,默认为 gbk 编码
				doc = Jsoup.parse(file, "gbk");
				
				// 选择网页中的表格元素,这里使用与 Jquery 兼容的 Selector 格式
				Elements tableElements = doc.select("body > div > table");
				int tableCount = 0;
				for (Element eleTable : tableElements){
					// 我的文档中第一个表是修订历史表,所以过滤掉
					if (tableCount == 0){
						tableCount+=1;
						continue;
					}
					
					// 不考虑性能,所以直接使用 String
					String sql = "";
					String tableComment = "";
					
					Elements trElements = eleTable.select("tr");
					for (Element eleTr : trElements){
						// 根据上图表结构看到的,第一行是表名,第二行是备注,只有两列
						Elements tdElements = eleTr.select("td");
						if (tdElements.size() == 2){
							if (sql.length() == 0){
								sql = "DROP TABLE IF EXISTS `" + tdElements.get(1).text().toLowerCase() + "`;\r\n";
								sql += "CREATE TABLE `" + tdElements.get(1).text().toLowerCase() + "` (\r\n";
							}else{
								tableComment = tdElements.get(1).text();
							}
						}
						// 定义字段的行有8列
						if (tdElements.size() == 8){
							// 判断是否为空行或表头行
							if (!tdElements.get(1).text().isEmpty() && !"字段".equals(tdElements.get(1).text())){
								sql += "  `" + tdElements.get(1).text().toLowerCase() + "` ";
								
								// 处理数据类型
								switch (tdElements.get(2).text().toLowerCase()){
								case "bigint":
									sql += "bigint(20)";
									break;
								case "int":
									sql += "int(11)";
									break;
								case "decimal":
									sql += "decimal" + tdElements.get(3).text();
									break;
								case "varchar":
									sql += "varchar(" + tdElements.get(3).text() + ")";
									break;
								case "bit":
									sql += "bit";
									break;
								case "tinyint":
									sql += "tinyint";
									break;
								case "datetime":
									sql += "datetime";
									break;
								case "date":
									sql += "date";
									break;
								case "time":
									sql += "time";
									break;
								case "text":
									sql += "text";
									break;
								case "blob":
									sql += "blob";
									break;
									default:
										break;
								}
								
								// 是否允许为空
								if ("N".equals(tdElements.get(5).text()) || "不为空".equals(tdElements.get(1).text())){
									sql += " NOT NULL";
								}
								
								// 是否为自增字段
								if ("自增".equals(tdElements.get(7).text())){
									sql += " AUTO_INCREMENT";
								}
								
								// 处理注释
								sql += " COMMENT '" + tdElements.get(4).text();
								if (!tdElements.get(7).text().isEmpty()){
									sql += ";" + tdElements.get(7).text();
								}
								sql +=  "',\r\n";
							}
						}
					}
					
					// 处理主键,设计规则中默认 id 为主键
					sql += "  PRIMARY KEY (`id`)\r\n";
					// 处理表的引擎、编码、注释等信息
					sql += ") ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='" + tableComment + "';";
					
					System.out.println("");
					System.out.println("");
					System.out.println(sql);
				}

			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (Throwable e) {
				e.printStackTrace();
			}
		}
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		doCreateSQL("/Users/aven/gswd/网站/网站数据库设计_v1.0.htm");
	}

}

生成效果:原文:https://blog.csdn.net/testcs_dn/article/details/80768968

DROP TABLE IF EXISTS `log`;
CREATE TABLE `log` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '编号;自增',
  `user_type` int(11) COMMENT '用户类型;0=未知',
  `user_id` bigint(20) COMMENT '用户编号',
  `operation` int(11) COMMENT '操作类型',
  `content` varchar(2000) COMMENT '日志内容',
  `create_time` datetime COMMENT '创建时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='日志表';

小结 原文:https://blog.csdn.net/testcs_dn/article/details/80768968

其实应该使用 PowerDesigner、Rational Rose、Visio 等建模工具来设计数据库的,然后是基于它们的正向工程。在 windows 下习惯使用 Visio,但 Visio 好像只有一个 2005 企业版有正向工程的功能,我也没有找到亲测可用的版本。所以一般是设计文档,然后建表,再反向工程,生成关系图。

这里使用 pages,word 自带的格式转换功能,实现了自己想要的结果;

有时候想到达到目的,就是需要学会拐弯抹角,正所谓好事多磨。


目录
相关文章
|
负载均衡 算法 关系型数据库
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
本文聚焦 MySQL 集群架构中的负载均衡算法,阐述其重要性。详细介绍轮询、加权轮询、最少连接、加权最少连接、随机、源地址哈希等常用算法,分析各自优缺点及适用场景。并提供 Java 语言代码实现示例,助力直观理解。文章结构清晰,语言通俗易懂,对理解和应用负载均衡算法具有实用价值和参考价值。
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
|
Java 关系型数据库 MySQL
Java汽车租赁系统源码(含数据库脚本)
Java汽车租赁系统源码(含数据库脚本)
571 4
|
NoSQL Java API
在Java环境下如何进行Redis数据库的操作
总的来说,使用Jedis在Java环境下进行Redis数据库的操作,是一种简单而高效的方法。只需要几行代码,就可以实现复杂的数据操作。同时,Jedis的API设计得非常直观,即使是初学者,也可以快速上手。
467 94
|
监控 Shell Linux
Android调试终极指南:ADB安装+多设备连接+ANR日志抓取全流程解析,覆盖环境变量配置/多设备调试/ANR日志分析全流程,附Win/Mac/Linux三平台解决方案
ADB(Android Debug Bridge)是安卓开发中的重要工具,用于连接电脑与安卓设备,实现文件传输、应用管理、日志抓取等功能。本文介绍了 ADB 的基本概念、安装配置及常用命令。包括:1) 基本命令如 `adb version` 和 `adb devices`;2) 权限操作如 `adb root` 和 `adb shell`;3) APK 操作如安装、卸载应用;4) 文件传输如 `adb push` 和 `adb pull`;5) 日志记录如 `adb logcat`;6) 系统信息获取如屏幕截图和录屏。通过这些功能,用户可高效调试和管理安卓设备。
|
机器学习/深度学习 人工智能 Java
Java机器学习实战:基于DJL框架的手写数字识别全解析
在人工智能蓬勃发展的今天,Python凭借丰富的生态库(如TensorFlow、PyTorch)成为AI开发的首选语言。但Java作为企业级应用的基石,其在生产环境部署、性能优化和工程化方面的优势不容忽视。DJL(Deep Java Library)的出现完美填补了Java在深度学习领域的空白,它提供了一套统一的API,允许开发者无缝对接主流深度学习框架,将AI模型高效部署到Java生态中。本文将通过手写数字识别的完整流程,深入解析DJL框架的核心机制与应用实践。
896 3
|
存储 设计模式 Java
重学Java基础篇—ThreadLocal深度解析与最佳实践
ThreadLocal 是一种实现线程隔离的机制,为每个线程创建独立变量副本,适用于数据库连接管理、用户会话信息存储等场景。
498 5
|
存储 监控 安全
重学Java基础篇—类的生命周期深度解析
本文全面解析了Java类的生命周期,涵盖加载、验证、准备、解析、初始化、使用及卸载七个关键阶段。通过分阶段执行机制详解(如加载阶段的触发条件与技术实现),结合方法调用机制、内存回收保护等使用阶段特性,以及卸载条件和特殊场景处理,帮助开发者深入理解JVM运作原理。同时,文章探讨了性能优化建议、典型异常处理及新一代JVM特性(如元空间与模块化系统)。总结中强调安全优先、延迟加载与动态扩展的设计思想,并提供开发建议与进阶方向,助力解决性能调优、内存泄漏排查及框架设计等问题。
617 5
|
Java 开发者
重学Java基础篇—Java类加载顺序深度解析
本文全面解析Java类的生命周期与加载顺序,涵盖从加载到卸载的七个阶段,并深入探讨初始化阶段的执行规则。通过单类、继承体系的实例分析,明确静态与实例初始化的顺序。同时,列举六种触发初始化的场景及特殊场景处理(如接口初始化)。提供类加载完整流程图与记忆口诀,助于理解复杂初始化逻辑。此外,针对空指针异常等问题提出排查方案,并给出最佳实践建议,帮助开发者优化程序设计、定位BUG及理解框架机制。最后扩展讲解类加载器层次与双亲委派机制,为深入研究奠定基础。
522 0
|
安全 IDE Java
重学Java基础篇—Java Object类常用方法深度解析
Java中,Object类作为所有类的超类,提供了多个核心方法以支持对象的基本行为。其中,`toString()`用于对象的字符串表示,重写时应包含关键信息;`equals()`与`hashCode()`需成对重写,确保对象等价判断的一致性;`getClass()`用于运行时类型识别;`clone()`实现对象复制,需区分浅拷贝与深拷贝;`wait()/notify()`支持线程协作。此外,`finalize()`已过时,建议使用更安全的资源管理方式。合理运用这些方法,并遵循最佳实践,可提升代码质量与健壮性。
481 1
|
前端开发 JavaScript Java
[Java计算机毕设]基于ssm的OA办公管理系统的设计与实现,附源码+数据库+论文+开题,包安装调试
OA办公管理系统是一款基于Java和SSM框架开发的B/S架构应用,适用于Windows系统。项目包含管理员、项目管理人员和普通用户三种角色,分别负责系统管理、请假审批、图书借阅等日常办公事务。系统使用Vue、HTML、JavaScript、CSS和LayUI构建前端,后端采用SSM框架,数据库为MySQL,共24张表。提供完整演示视频和详细文档截图,支持远程安装调试,确保顺利运行。
520 17

热门文章

最新文章

推荐镜像

更多
  • DNS