【生产力++】脚本自动化提取待复习内容 极大提高复习效率(上)

本文主要是介绍【生产力++】脚本自动化提取待复习内容 极大提高复习效率(上),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

    • 前言
    • 正文
      • 实现思路
      • java脚本开发
        • 首先配置pom引入相关依赖
        • 然后开始编写逻辑代码
        • 解释几个地方:
      • 结合bat脚本
        • 编写bat脚本
      • 效果展示
      • 这个程序的拓展性
    • 尾声

前言

【插入一句】这个的第二版脚本出来啦,有兴趣可以来看看,或许可以帮助到你
传送门(第二版)

【简单介绍一下大致背景 方便大家更快的get到这个东西的作用】

作为一只计算机的考研狗,每天起早贪黑,日复一日的复习。
知识越来越丰富,头发也越来越稀疏hhh
在这里插入图片描述
伴随着时间推移到了八月中,相比于刚刚开始备考的几个月,学科难度持续增大,学习项目越来越庞杂。因此每天的学习热情已经趋于平淡,但又秉持着必要上岸的决心,每天能不能坚持9h+的全凭意志力。(偶尔摆烂呜呜)
在这里插入图片描述

在英语的复习中,大纲词汇要背,阅读生词要背诵,真题熟词僻义要背…我原本的思路是把所有地方的单词按照这个样子整理到pdf中来,每天仅需要将不熟悉的部分用高亮选中,然后每天复习就好了。
在这里插入图片描述
但是随着数量越来越多之后,我发现了一个问题,不熟悉的单词东一个西一个,可能阅读部分有几个,翻译部分有几个…这总不能一页页翻过去找吧…本来就时间紧任务重。那有没有一个办法能把我不会的单词统一到一起,这样我就可以很快速的进行复习了。

左思右想之后,敲定了几种方案:
× 使用word自带的宏,进行编程,实现效果。但是不具备宏编程基础,并且宏编程界面跟记事本一样…开发起来很头痛,会付出很多的额外时间成本。

使用bat脚本+java脚本的方式 实现,之前有研究过bat脚本和java结合的方式,且java使用更加得心应手。

说干就干!!!

正文

实现思路

原来的复习方式 主要分为两部分:

①新词产生:学习产生陌生词汇——登记到word中——高亮标记需要重复学习的部分
②旧词复习:从后向前遍历每一页的新词,若掌握则去除标记,发现新的未掌握则添加标记。

主要的时间开销:在N页的文档中寻找需要复习的单词。

理想的复习方式:
着重针对寻找待复习单词方面进行优化
①新词产生:学习产生陌生词汇——登记到word中——高亮标记需要重复学习的部分
②旧词复习:由脚本帮忙整理出待复习的新词,若全部掌握即可回到文档直接 “全选-去除高亮”。

java脚本开发

省略中间选择实现方式的思考过程,最终选择使用 spire.doc.free的工具包完成

整体使用maven管理项目

首先配置pom引入相关依赖
        <dependency><groupId>e-iceblue</groupId><artifactId>spire.doc.free</artifactId><version>3.9.0</version></dependency>

这家伙不像其他依赖那么简单就能引入,他需要配置一下自己的仓库,同样在pom文件中

    <!--    配置word的仓库--><repositories><repository><id>com.e-iceblue</id><url>http://repo.e-iceblue.cn/repository/maven-public/</url></repository></repositories>
然后开始编写逻辑代码

我的word长这样,每一页都是一个N行4列的表格,其中一、三列英语,二、四列汉语。

除了普通的一个单词对应一个汉语,还存在一个单词对应多个汉语,或者多个单词对应一个汉语的情况。

在这里插入图片描述
首先简单介绍一下这个依赖读入word文件的流程(具体的实现可以根据名字去查开发手册):
【其实就是读入遍历循环的顺序】

  1. 将整个文档根据分节符分成很多节
  2. 将每一节根据我们文档的表格分成很多个表格
  3. 将每一张表分成很多行
  4. 将每一行分成很多列
  5. 将单元格拆分为段落(这个比较抽象 比如回车一下算一段)
  6. 将段落拆为不同的对象(这个更抽象 可以结合代码理解)

直接上成品代码(后续有解释)

import com.spire.doc.Document;
import com.spire.doc.Section;
import com.spire.doc.TableCell;
import com.spire.doc.TableRow;
import com.spire.doc.documents.Paragraph;
import com.spire.doc.fields.TextRange;
import com.spire.doc.interfaces.ITable;import java.awt.*;public class word_op {public static void main(String[] args) {//加载Word源文档Document doc = new Document();doc.loadFromFile("C:\\Users\\23252\\Desktop\\真题词汇词组.docx");//获取第一节Section section = doc.getSections().get(0);for (int i = 0; i < section.getTables().getCount(); i++) {//获取第i个表格ITable table = section.getTables().get(i);//遍历每个表格的行for (int j = 0; j < table.getRows().getCount(); j++) {TableRow row = table.getRows().get(j);//遍历每行的列for (int k = 0; k < row.getCells().getCount(); k++) {TableCell cell = row.getCells().get(k);//某个单元格整体的内容StringBuilder res = new StringBuilder();//遍历单元格中的段落for (int l = 0; l < cell.getParagraphs().getCount(); l++) {Paragraph paragraph = cell.getParagraphs().get(l);//遍历每个段落的子对象for (int m = 0; m < paragraph.getChildObjects().getCount(); m++) {Object obj = paragraph.getChildObjects().get(m);if (obj instanceof TextRange) {//获取文本String text = ((TextRange) obj).getText();//去除特殊符号text = text.replaceAll("\r|\n", "");//获取文本的高亮颜色(即突出显示颜色)Color color = ((TextRange) obj).getCharacterFormat().getHighlightColor();//判断是否高亮if (!(color.getRGB() == 0)) {res.append(text);//判断是否有多段 进行分割if (cell.getParagraphs().getCount() != 1 && m == paragraph.getChildObjects().getCount() - 1) {//最后一段后面没东西 不需要再加分割if (cell.getParagraphs().getCount() - 1 != l) {res.append(" | ");}}}}}}if (!res.toString().equals("")) {if ((k + 1) % 2 != 0) {System.out.print(generateWordSpan(res.toString()));} else {System.out.println(res);}}}}}}//    组合总长public static int total_length = 50;       //30+20//    根据单词长度动态生成后端空格组合public static String generateWordSpan(String word) {int span_length = total_length - word.length();StringBuilder op_word = new StringBuilder(word);for (int i = 0; i < span_length; i++) {op_word.append(" ");}return op_word.toString();}
}
解释几个地方:
  1. 首先是这一部分那个append操作在叠加什么
  //遍历每个段落的子对象for (int m = 0; m < paragraph.getChildObjects().getCount(); m++) {Object obj = paragraph.getChildObjects().get(m);if (obj instanceof TextRange) {//获取文本String text = ((TextRange) obj).getText();//去除特殊符号text = text.replaceAll("\r|\n", "");//获取文本的高亮颜色(即突出显示颜色)Color color = ((TextRange) obj).getCharacterFormat().getHighlightColor();//判断是否高亮if (!(color.getRGB() == 0)) {res.append(text);//判断是否有多段 进行分割if (cell.getParagraphs().getCount() != 1 && m == paragraph.getChildObjects().getCount() - 1) {//最后一段后面没东西 不需要再加分割if (cell.getParagraphs().getCount() - 1 != l) {res.append(" | ");}}}}}

首先很明确的是,用我们的视角来看,我们想要的目标是一个单元格,我们只有拿到一整个单元格的内容才能把数据存下来到数组啊,链表啊之类的。我们的操作对象既不是比单元格大的行、列,也不是比单元格更小的段落或者对象。

但是在程序的视角来看,单元格由段落组成,段落由对象组成。

那么我们就需要把较小的东西拼起来,凑成我们想要的东西。

所以核心逻辑就是:从word读入文件,一轮轮for循环下去,不断切切切,切到最小,然后我们操作着最小的对象开始拼装。

  1. 这部分动态组合是在干什么
    //    组合总长public static int total_length = 50;       //30+20//    根据单词长度动态生成后端空格组合public static String generateWordSpan(String word) {int span_length = total_length - word.length();StringBuilder op_word = new StringBuilder(word);for (int i = 0; i < span_length; i++) {op_word.append(" ");}return op_word.toString();}

这部分相对于上面那部分就简单太多啦,纯粹是因为个人强迫症。
因为单词不一样长,所以他和汉语之间的空格也不一样,所以最后控制台打印出来会歪歪扭扭,于是我设置了 单词+空格+汉语 的总长,一个太长另一个就短一点,也算是自己实现了动态调剂算法哈哈哈哈。

其他地方不难理解,可以按着我的样子建个表,然后自己代码贴过去跑一跑,很快就能理解。
贴一个效果图,节选了上面那一页的部分。
在这里插入图片描述
是不是很整齐
在这里插入图片描述

到这里

结合bat脚本

到这里,我们需要把写好的文件打成jar包或者exe文件,方便我们bat脚本调用(打jar包过程可以看我其他文章或者自行百度),这里因为习惯就打jar包了。
在这里插入图片描述

编写bat脚本

接下来我们可以写一个启动脚本,运行这个java程序,目前这个简易版的小脚本只有下面这三句。

cd C:\XXXX               (你的脚本的目录)
java -jar XXXXX.jar      (你的jar包的名字)
pause > nul  (这一句是为了让你的窗口执行完停下来,而不是直接闪退,可以多贴几行防止手误)

把这句话写到记事本里,保存为bat文件。
在这里插入图片描述

效果展示

双击bat文件,等待之后。
在这里插入图片描述
成功啦!!!正文部分到这里完全结束!!!接下来是小的碎碎念时间。

这个程序的拓展性

假设场景:在学校,白天去图书馆懒得搬电脑:
或许我们可以在java脚本中加一段发送邮件的代码(很简单),这样每天早上出门前运行一下代码,待复习内容就可以发送到邮箱,手机就可以随时随地查看了。不过那样发过去的单词可能看起来没那么整齐哈哈哈。

后续可能方案:做一个简单的图形化界面,在界面上通过勾选框选择已经掌握的单词,bat界面关闭后自动修改word文档里的高亮标识。(这个不难但是我是懒狗现在不想做)

高性价比方案:当前脚本保持不变,配合远程控制软件ToDesk使用,在图书馆使用iPad链接寝室的电脑,仅需双击bat文件,通过pad屏幕来看打印出来的单词,我们仅需要在晚上睡前修改一下待复习单词。

尾声

到这里也算是终于结束啦,原本预定一早上搞定,但是因为有段日子没有写过代码了,手有点生。
从完全不了解spire.doc.free这个依赖,到自己看开发文档,再到设计实现逻辑,还是学到了很多东西。
整个程序看起来不是很难,但每一步都不容出错。代码虽然很短,但是其中的核心逻辑大改了三遍hhh(纯菜狗了哈哈哈),从开始设计到写完这篇博客,用了大半天时间。今天是光明正大的摆烂的一天。
在这里插入图片描述

这篇关于【生产力++】脚本自动化提取待复习内容 极大提高复习效率(上)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/331843

相关文章

CentOS和Ubuntu系统使用shell脚本创建用户和设置密码

《CentOS和Ubuntu系统使用shell脚本创建用户和设置密码》在Linux系统中,你可以使用useradd命令来创建新用户,使用echo和chpasswd命令来设置密码,本文写了一个shell... 在linux系统中,你可以使用useradd命令来创建新用户,使用echo和chpasswd命令来设

redis中使用lua脚本的原理与基本使用详解

《redis中使用lua脚本的原理与基本使用详解》在Redis中使用Lua脚本可以实现原子性操作、减少网络开销以及提高执行效率,下面小编就来和大家详细介绍一下在redis中使用lua脚本的原理... 目录Redis 执行 Lua 脚本的原理基本使用方法使用EVAL命令执行 Lua 脚本使用EVALSHA命令

使用Python从PPT文档中提取图片和图片信息(如坐标、宽度和高度等)

《使用Python从PPT文档中提取图片和图片信息(如坐标、宽度和高度等)》PPT是一种高效的信息展示工具,广泛应用于教育、商务和设计等多个领域,PPT文档中常常包含丰富的图片内容,这些图片不仅提升了... 目录一、引言二、环境与工具三、python 提取PPT背景图片3.1 提取幻灯片背景图片3.2 提取

Python实现word文档内容智能提取以及合成

《Python实现word文档内容智能提取以及合成》这篇文章主要为大家详细介绍了如何使用Python实现从10个左右的docx文档中抽取内容,再调整语言风格后生成新的文档,感兴趣的小伙伴可以了解一下... 目录核心思路技术路径实现步骤阶段一:准备工作阶段二:内容提取 (python 脚本)阶段三:语言风格调

Java使用ANTLR4对Lua脚本语法校验详解

《Java使用ANTLR4对Lua脚本语法校验详解》ANTLR是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件,下面就跟随小编一起看看Java如何使用ANTLR4对Lua脚本... 目录什么是ANTLR?第一个例子ANTLR4 的工作流程Lua脚本语法校验准备一个Lua Gramm

一文详解如何在Python中从字符串中提取部分内容

《一文详解如何在Python中从字符串中提取部分内容》:本文主要介绍如何在Python中从字符串中提取部分内容的相关资料,包括使用正则表达式、Pyparsing库、AST(抽象语法树)、字符串操作... 目录前言解决方案方法一:使用正则表达式方法二:使用 Pyparsing方法三:使用 AST方法四:使用字

微信公众号脚本-获取热搜自动新建草稿并发布文章

《微信公众号脚本-获取热搜自动新建草稿并发布文章》本来想写一个自动化发布微信公众号的小绿书的脚本,但是微信公众号官网没有小绿书的接口,那就写一个获取热搜微信普通文章的脚本吧,:本文主要介绍微信公众... 目录介绍思路前期准备环境要求获取接口token获取热搜获取热搜数据下载热搜图片给图片加上标题文字上传图片

详解C#如何提取PDF文档中的图片

《详解C#如何提取PDF文档中的图片》提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使用,下面我们就来看看如何使用C#通过代码从PDF文档中提取图片吧... 当 PDF 文件中包含有价值的图片,如艺术画作、设计素材、报告图表等,提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使

Python实现自动化接收与处理手机验证码

《Python实现自动化接收与处理手机验证码》在移动互联网时代,短信验证码已成为身份验证、账号注册等环节的重要安全手段,本文将介绍如何利用Python实现验证码的自动接收,识别与转发,需要的可以参考下... 目录引言一、准备工作1.1 硬件与软件需求1.2 环境配置二、核心功能实现2.1 短信监听与获取2.

Python实现Microsoft Office自动化的几种方式及对比详解

《Python实现MicrosoftOffice自动化的几种方式及对比详解》办公自动化是指利用现代化设备和技术,代替办公人员的部分手动或重复性业务活动,优质而高效地处理办公事务,实现对信息的高效利用... 目录一、基于COM接口的自动化(pywin32)二、独立文件操作库1. Word处理(python-d