python 使用python-docx==0.8.10 生成word 並已數據流的形式 進行下載

生成效果:

     

生成代碼


from docx import Document
from docx.shared import Inches,Pt
from docx.oxml.ns import qn
from django.http import HttpResponse,FileResponse
import cStringIO, urllib2
import datetime
import os


def WordDownload(req):

    doc = Document()  # 建立模板對象
    chg_font(doc.styles['Normal'], fontname=u'宋體', size=12)  # 設置默認字體
    paragraph1 = doc.add_paragraph()
    run1 = paragraph1.add_run(u'基本信息')
    chg_font(run1, fontname=u'微軟雅黑', size=16)

    paragraph2 = doc.add_paragraph()
    lister = [u'作者姓名:%s' % doctor_user.realname, u'所在地區:%s' % doctor_user.area,
          u'所在醫院:%s' % doctor_user.hospital_name, u'所在科室:%s' %                         doctor_user.department,
          u'手機號碼:%s' % doctor_user.telephone, u'個人積分:%s' % doctor_user.integral,
          u'作者照片:', u'作者簡介:%s' % healer.introduce]
    for an in lister:  #
      if u'照片' in an:
        run = paragraph2.add_run(an)
        run.add_break()
        if wx_urls:
          file = urllib2.urlopen(wx_urls)
          tmpIm = cStringIO.StringIO(file.read())
          run.add_picture(tmpIm, width=Inches(0.8))
        else:
          paragraph2.add_run(u"沒有照片")
        run.add_break()  # 添加換行
      else:
        run = paragraph2.add_run(an)
        run.add_break()
    # ---第一部分  基本信息 ----#

    paragraph1 = doc.add_paragraph()
    run1 = paragraph1.add_run(u'基本信息')
    chg_font(run1, fontname=u'微軟雅黑', size=16)
    
    paragraph2 = doc.add_paragraph()
    lister = [u'作者姓名:%s' % doctor_user.realname, u'所在地區:%s' % doctor_user.area,
          u'所在醫院:%s' % doctor_user.hospital_name, u'所在科室:%s' % doctor_user.department,
          u'手機號碼:%s' % doctor_user.telephone, u'個人積分:%s' % doctor_user.integral,
          u'作者照片:', u'作者簡介:%s' % healer.introduce]
    for an in lister:  #
      if u'照片' in an:
        run = paragraph2.add_run(an)
        run.add_break()
        if wx_urls:
          file = urllib2.urlopen(wx_urls)
          tmpIm = cStringIO.StringIO(file.read())
          run.add_picture(tmpIm, width=Inches(0.8))
        else:
          paragraph2.add_run(u"沒有照片")
        run.add_break()  # 添加換行
      else:
        run = paragraph2.add_run(an)
        run.add_break()

    # ---第二部分  投稿詳情 ----#
    paragraph3 = doc.add_paragraph()
    run3 = paragraph3.add_run(u'投稿詳情')
    chg_font(run3, fontname=u'微軟雅黑', size=16)
    
    paragraph4 = doc.add_paragraph()
    run = paragraph4.add_run(u'投稿標題:%s'%healer.title)
    run.add_break()

    # ---第三部分  投稿文字 ----#
    medical=MedicalNotes.objects.filter(healer=healer).first()
    paragraph5 = doc.add_paragraph()
    run5 = paragraph5.add_run(u'投稿文字')
    chg_font(run5, fontname=u'微軟雅黑', size=16)
    paragraph6 = doc.add_paragraph()
    run = paragraph6.add_run(medical.content)
    run.add_break()

    # ---第四部分  投稿圖片 ----#
    paragraph7 = doc.add_paragraph()
    run7 = paragraph7.add_run(u'投稿圖片')
    chg_font(run7, fontname=u'微軟雅黑', size=16)                    
                       butelink=list(ContributeLink.objects.filter(medical=medical,typeser=1).values_list('links',flat=True))
    paragraph8 = doc.add_paragraph()
    run = paragraph8.add_run(u'投稿圖片')
    run.add_break()
    for img in butelink:
      file = urllib2.urlopen(img + '?imageView2/1/w/800/h/700')
      tmpIm = cStringIO.StringIO(file.read())
      run.add_picture(tmpIm, width=Inches(0.8))
    run.add_break()

    # ---第五部分  審覈記錄 (生成表格的方式)----#
    paragraph9 = doc.add_paragraph()
    run9 = paragraph9.add_run(u'審覈記錄')
    chg_font(run9, fontname=u'微軟雅黑', size=16)
    record = CaseAuditRecord.objects.filter(healer=healer)
    rows = record.count() + 1
    tab = doc.add_table(rows=rows, cols=4)
    tab1 = tab.rows[0].cells
    er = 0
    lister4 = [u'操作人', u'處理時間', u'操作', u'駁回原因']  # 表頭
    for an in lister4:
      tab1[er].text = an
      er += 1
    if record:
      rowser = 1
      for an in record.values('staff__name', 'create_time', 'audit_type', 'reject'):
        tab2 = tab.rows[rowser].cells
        tab2[0].text = an['staff__name']
        tab2[1].text = an['create_time'].strftime('%Y-%m-%d %H:%M:%S')
        tab2[2].text = u'%s' % AUDIT_TYPE[int(an['audit_type'] - 1)][1]
        tab2[3].text = an['reject']
        rowser += 1
    run9.add_break()
    # ---第六部分  生成word數據流直接下載 ----#
    new_time = datetime.datetime.now().strftime('%Y%m%d%H%M%S')
    file_name='word%s.docx' % new_time
    doc_url='./wordfile/'+file_name
    doc.save(doc_url)
    docfile=open(doc_url,"rb")
    response=FileResponse(docfile)
    response['Content-Type']='application/octet-stream'
    response['Content-Disposition']='attachment;filename=word%s.docx'%new_time
    path=os.getcwd()
    os_file_url=path+'/wordfile'
    w3 = threading.Thread(target=del_file, args=((os_file_url,file_name)))
    w3.start()
    return response

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章