求教, Excel 存储的题库,怎么快速生成题本和解析 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
tangbj
V2EX    程序员

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

  •  
  •   tangbj 2022-08-03 16:16:04 +08:00 2349 次点击
    这是一个创建于 1175 天前的主题,其中的信息可能已经有所发展或是发生改变。
    题库目前是用 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     Solana     3502 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 10:40 PVG 18:40 LAX 03:40 JFK 06:40
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86