django上传doc文件编码格式错误

项目场景:django上传doc文件编码格式错误

提示:这里简述项目相关背景:
接上篇文章,django通过form-data上传文件,包含doc文件时,因为是旧版本在2007前的word文档,编码格式会不识别,查询很多资料发现比较容易的实现方式为将旧版本的doc转为docx在进行读取。其中涉及的一个问题怎样兼容windows和linux系统。


问题描述:

主要解决问题:python处理旧版本的word文档读取表格。


原因分析:

word版本太低,编码格式不兼容,读取时无法识别。


解决方案:

1.在window系统使用win32com库将doc格式文件转为可以识别读取的docx文件。

pip install python-docx
python -m pip install pypiwin32

2.在linux上安装使用libreoffice工具将doc格式文件转为docx。
工具下载链接

https://zh-cn.libreoffice.org/get-help/install-howto/linux/
命令: libreoffice --headless --convert-to txt path-to-your-doc.doc
或者:libreoffice --headless --convert-to html --outdir /your/output/dir /your/doc_docx_wps/files/*.{dosx,doc,wps}

代码实现

1.引入库

代码如下(示例):

import platform
import docx
if platform.system().lower() == 'windows':
    import pythoncom
    import win32com.client as wc  

2.读入数据

代码如下(示例):

def deal_with_doc(request):
    """ 上传的文件为word的格式时,提取word内的表格数据 """

    try:
		#从form-data中上传的文件
        upload_file = request.FILES['excel'].read()
        # 把doc文件存储到临时目录-settings.BOM_DIR中
        filename = str(uuid.uuid4()) + '.doc'
        src_path = os.path.join(settings.BOM_DIR, filename)

        with open(src_path, 'wb+') as f:
            f.write(upload_file)
            f.flush()
        if platform.system().lower() == 'windows':
            # windows系统调用win32com
            pythoncom.CoInitialize()
            word = wc.Dispatch("Word.Application")
            pythoncom.CoInitialize()
            doc = word.Documents.Open(src_path)
            try:
                doc.SaveAs("{}x".format(src_path), 12, False, "", True, "", False, False, False, False)
            except Exception as e:
                log.error(e)
            finally:
                # doc.Close()  # 关闭原来word文件,此时只需要关闭一个,否则报错
                word.Quit()
        else:
            # linux系统调用libreoffice转换工具
            os.system("libreoffice --headless --convert-to docx --outdir {} {}".format(settings.BOM_DIR, src_path))
        docx_path = src_path + 'x'
        # 读取doc文件中的表格,在做处理
        doc = docx.Document(docx_path)    
    except Exception as e:
        func = sys._getframe().f_code.co_name
        print("deal_with_doc - error : {}".format(func, e))

总结

文件的处理遇到很多问题,但都有一些大佬提出解决方案供我们参考,我们只是代码的搬运工。
引用参考链接:

https://blog.csdn.net/weixin_41712499/article/details/107656792?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-3.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-3.control
https://blog.csdn.net/weixin_41701299/article/details/90477871

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值