项目场景: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