V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
tangbj
V2EX  ›  程序员

求教, Excel 存储的题库,怎么快速生成题本和解析

  •  
  •   tangbj · 2022-08-03 16:16:04 +08:00 · 1816 次点击
    这是一个创建于 625 天前的主题,其中的信息可能已经有所发展或是发生改变。
    题库目前是用 Excel 存储,有选择题,判断题,复合题,数据 10 万条左右,要根据筛选条件,比如根据年份、根据难度等等,生成出一份题本,一份解析,要包含目录。
    目前是用 RPA ,根据 Mardown 语法逐行输出文本,然后转成 PDF ,效率太低了,3000 道题目,要花费 1 小时,问问大家有更方便的方法吗?
    21 条回复    2022-08-04 20:51:19 +08:00
    wxf666
        1
    wxf666  
       2022-08-03 16:29:00 +08:00
    咋觉得放进数据库里( SQLite 都行),写个小脚本,几秒钟都生成好了呢
    buliugu
        2
    buliugu  
       2022-08-03 16:32:54 +08:00
    存储换到数据库,多线程读取然后合并再生成 pdf 。这个步骤可以做成任务队列一直运行
    wxf666
        3
    wxf666  
       2022-08-03 16:50:13 +08:00
    @buliugu 3000 题,用不上多线程吧。。

    就算数据库 B+树 3 层,3000 题每题都在不同页上,最差也就随机读 6000 页而已(第一层 root 页被缓存)

    对于 SQLite 4K 一页,也就随机读 6000 次 4K

    现在随便一个固态 4K 的 IOPS 都几万几十万了吧


    实在不行,丢 RamDisk 呗,每题 1KB ,10W 数据大概也就占 100MB 内存吧

    不想用 RamDisk ,SQLite 也有读取整个数据库文件至内存的选项
    tangbj
        4
    tangbj  
    OP
       2022-08-03 17:11:45 +08:00
    @wxf666 请问具体用什么编程语言呢?算是比小白好一丢丢,能找一些现成的源码修改。对了,有的题目是有图片的,excel 存了路径,导进数据库也同样用路径吗?
    wxf666
        5
    wxf666  
       2022-08-03 17:25:40 +08:00   ❤️ 2
    @tangbj 个人觉得,python 干这活儿会很快

    有点怀疑,你这场景这么具体,真的能找到现成源码么。。

    把路径当字符串存进数据库,很正常啊


    我觉得,你放点数据出来,可能有人看着简单,顺手帮你写了代码也说不定
    GodThemselves
        6
    GodThemselves  
       2022-08-03 17:43:13 +08:00
    最近刚整过一个 excel 转 word 的 python 脚本,excel 中的列头+行数据转换为 word 里的一个段落。目前不知道你这个不同的题型是怎么存的,可能会麻烦点。
    wxf666
        7
    wxf666  
       2022-08-03 18:00:58 +08:00
    @GodThemselves 看起来,要写的 python 代码只需输出 markdown ,

    后续是由楼主的 markdown 转 pdf 工具来完成余下的工作(估计有自定义的 css ?),

    这就很舒服啦~
    tangbj
        8
    tangbj  
    OP
       2022-08-03 18:49:51 +08:00
    @GodThemselves [腾讯文档] 题库演示数据
    https://docs.qq.com/sheet/DRld4ck1Ec09oV0FF
    四种题型里的三种,还有复合题没想好怎么存,还没做清洗。
    生成的文档只要有目录就行,格式也没有特殊要求,最终目的就是生成 PDF
    Vegetable
        9
    Vegetable  
       2022-08-03 19:11:06 +08:00
    。。。。这个啊,这个用 Word 配合邮件合并就行了
    Vegetable
        10
    Vegetable  
       2022-08-03 19:15:50 +08:00
    tangbj
        11
    tangbj  
    OP
       2022-08-03 19:17:37 +08:00
    @Vegetable 请问一下图片怎么适配呢?有的题目是图片,解析里也会有图片
    Vegetable
        12
    Vegetable  
       2022-08-03 19:20:49 +08:00
    Vegetable
        13
    Vegetable  
       2022-08-03 19:23:01 +08:00
    @tangbj 还有图片啊,有点复杂了

    https://jingyan.baidu.com/article/597035528f205c8fc0074019.html

    也有教程,不过这么搞邮件合并就不是特别合适了,可能不好区分图片还是文字了
    akira
        14
    akira  
       2022-08-03 23:49:22 +08:00
    感觉瓶颈是在 pdf 渲染 这里吧。 一秒渲染出一个 pdf 文件,差不多了啦。
    krixaar
        15
    krixaar  
       2022-08-04 08:44:02 +08:00
    直接读 excel 排个序然后 python-docx 一行一行写就行了啊,add_paragraph 加一段落,add_picture 加一张图,出一个 docx 之后再转 pdf 难度就不大了吧?
    GodThemselves
        16
    GodThemselves  
       2022-08-04 10:24:52 +08:00
    @tangbj
    传到 git 上了,具体可能你得按你的需求再调一调
    https://github.com/SHHK0976/excel_2_word
    tangbj
        17
    tangbj  
    OP
       2022-08-04 15:13:13 +08:00
    @GodThemselves 感谢老哥
    wxf666
        18
    wxf666  
       2022-08-04 16:48:54 +08:00
    @GodThemselves 看起来,你的源码和 @tangbj 的需求还有距离,比如:『要根据筛选条件,比如根据年份、根据难度等』、要包含目录』…… @tangbj 真要改起来,估计要学不少东西……

    有可能做成一个 word 模板,python 按需填入吗?这样改起来方便,也能先用 word 自定义样式了


    比如,『问题模板.docx 』:


    (标题一样式,居中){{ 分类 3 }}

    {{ for 问题 in problems }}

    <word 的编号列表>({{ 问题.题型 }}){{ 问题.题目 }}

    {{ if 问题.题图 is not None }}
    {{ docx.添加图片(问题.题图) }}
    {{ end }}

      A.{{ 问题.A }}
      B.{{ 问题.B }}
    {{ if 问题.题型 != '判断题' }}
      C.{{ 问题.C }}
      D.{{ 问题.D }}
    {{ end }}

    {{ next }}



    『答案模板.docx 』:


    (标题一样式,居中){{ 分类 3 }}

    {{ for 问题 in problems }}

    <word 的编号列表>正确答案:{{ 问题.正确答案 }}   {{ 问题.年份 }}   {{ 问题.考点 }}

    {{ 问题.解析 }}

    {{ if 问题.解析图 is not None }}
    {{ docx.添加图片(问题.解析图) }}
    {{ end }}

    {{ next }}
    GodThemselves
        19
    GodThemselves  
       2022-08-04 16:53:29 +08:00
    @wxf666 献丑了,我和 OP 一样是个初学者。

    @tangbj 的需求比较复杂,有多种题型和筛选方式,或许可以先用 excel 整理一遍分成子 sheets 再进行操作。
    目录这块,我这个是可以实现的,因为用 python-docx 给定了标题样式,生成 word 以后可以直接通过 word 生成目录。
    wxf666
        20
    wxf666  
       2022-08-04 17:15:06 +08:00
    @GodThemselves 文档生成这块,我也没啥经验

    刚搜了搜,python 居然没有多少操控 markdown 的,几乎全是 markdown 转 html 的。。

    虽说按楼主要求直接生成 markdown 很容易(还要处理下转义):

    for index, pro in enumerate(problems):
      fp.write(f'{index + 1}.({pro.题型}){pro.题目}\n')
      if pro.题图:
       fp.write(f'![]({pro.题图})\n')
      for j, choice in enumerate(filter(None, (pro.A, pro.B, pro.C, pro.D))):
       fp.write(…)

    但通用性太差了,专为楼主需求定制,没长进多少经验……

    我自己的话,若想答,总想能干的更通用些,答案以后也更可能有用
    wxf666
        21
    wxf666  
       2022-08-04 20:51:19 +08:00
    @GodThemselves @tangbj 又搜了搜,大致瞅了瞅,

    『 docxtpl 』这个 python 库可以做到类似 18 楼 那样,预先建一个『模板.docx 』,然后填充 3000 题,最后保存成新文件(有点类似 9 楼 说的邮件合并?)

    实在要用 Excel 存数据的话,『 pandas 』应该能比较好地满足楼主的需求:读取 Excel 、根据条件筛选


    话说 @tangbj ,你的原始数据长啥样的?

    不知你是不是被『如何把所有题型塞一张表里』难住了。其实不一定要全部塞一张表里的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2738 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 04:08 · PVG 12:08 · LAX 21:08 · JFK 00:08
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.