久久久国产精品久久久I国产亚洲久一区二区I制服丝袜亚洲I日韩av片在线I久久免费视频8I日韩av在线小说

您好,歡迎訪問(wèn)通商軟件官方網(wǎng)站!
24小時(shí)免費(fèi)咨詢熱線: 400-1611-009
聯(lián)系我們 | 加入合作

Python, 將HTML table 導(dǎo)出Excel

ERP系統(tǒng) & MES 生產(chǎn)管理系統(tǒng)

10萬(wàn)用戶實(shí)施案例,ERP 系統(tǒng)實(shí)現(xiàn)微信、銷售、庫(kù)存、生產(chǎn)、財(cái)務(wù)、人資、辦公等一體化管理

本文開(kāi)放系統(tǒng)中的一段代碼。將HTML5 table文本導(dǎo)出Excel。

需要的庫(kù)

  • python 2.7/2.x
  • xlwt
  • Django(可選)

目標(biāo)

網(wǎng)頁(yè)上的table部分,只要輸出文本,將html文本輸出成excel。幾乎一摸一樣,可以帶出簡(jiǎn)單的css樣式(本文基于bootstrap的標(biāo)準(zhǔn)樣式),合并單元格,表頭等內(nèi)容。但不能帶出單元格樣式,公式等。

例子

比如上圖。頁(yè)面輸出是這個(gè)樣子的。

導(dǎo)出后

例子

很簡(jiǎn)單吧。

代碼

__author__ = 'm.uzefa.com'

from django.http import HttpResponse
from django.utils.http import urlquote
import xlwt, HTMLParser, StringIO, uuid

blue_stype = xlwt.easyxf('alignment: horz left, vert top; pattern: pattern solid, fore_colour light_blue; font: bold on;')
red_stype = xlwt.easyxf('alignment: horz left, vert top; pattern: pattern solid, fore_colour red; font: bold on;')
green_stype = xlwt.easyxf('alignment: horz left, vert top; pattern: pattern solid, fore_colour light_green; font: bold on;')
yellow_stype = xlwt.easyxf('alignment: horz left, vert top; pattern: pattern solid, fore_colour light_yellow; font: bold on;')
orange_stype = xlwt.easyxf('alignment: horz left, vert top; pattern: pattern solid, fore_colour light_orange; font: bold on;')
merge_stype = xlwt.easyxf('alignment: wrap on;')

bold_stype = xlwt.easyxf('alignment: horz left, vert top; font: bold on;')
mydefault_stype = xlwt.easyxf('alignment: horz left, vert top')

STAG = 'stag'
ETAG = 'etag'
DATA = 'data'

def html_table_to_excel(table):
    """ html_table_to_excel(table): Takes an HTML table of data and formats it so that it can be inserted into an Excel Spreadsheet.
    """
    table_ls = []

    class MyHTMLParser(HTMLParser.HTMLParser):
        '''
        parser
        '''

        def handle_starttag(self, tag, attrs):
            table_ls.append((STAG, tag, attrs))

        def handle_endtag(self, tag):
            table_ls.append((ETAG, tag, None))

        def handle_data(self, contentstr):
            table_ls.append((DATA, contentstr.strip(), None))

    p = MyHTMLParser()
    p.feed(table)

    return table_ls

def export_to_sheet(wb, sheet_title, table_str):
    '''
    sheet
    '''
    ws = wb.add_sheet(sheet_title)

    ls = html_table_to_excel(table_str)

    xstatus = ''
    cline = 0
    ccell = 0
    b_readyinsert = False
    xattrs = None
    xcontent = ''
    cells_occupy = set()

    for tag, content, attrs in ls:
        if tag == STAG and content == 'thead':
            xstatus = 'thead'
        elif tag == ETAG and content == 'thead':
            xstatus = ''
        if tag == STAG and content == 'tbody':
            xstatus = 'tbody'
        elif tag == ETAG and content == 'tbody':
            xstatus = ''

        elif tag == STAG and content == 'tr':
            # row go
            ccell = 0
        elif tag == ETAG and content == 'tr':
            # row go
            cline += 1

        elif tag == STAG and content in ['td', 'th']:
            b_readyinsert = True
            xcontent = ''
            xattrs = dict(attrs)
        elif tag == ETAG and content in ['td', 'th']:
            # fill cell
            xstyle = mydefault_stype
            if 'class' in xattrs:
                xattr_class = xattrs['class']
                if 'success' in xattr_class:
                    xstyle = green_stype
                elif 'warning' in xattr_class:
                    xstyle = yellow_stype
                elif 'danger' in xattr_class:
                    xstyle = red_stype
                elif 'info' in xattr_class:
                    xstyle = blue_stype
            if not xstyle:
                xstyle = xstatus == 'thead' and bold_stype or mydefault_stype

            # test occupy
            while (cline, ccell) in cells_occupy:
                ccell += 1

            if 'colspan' in xattrs and 'rowspan' in xattrs:
                rowspan = int(xattrs['rowspan'])
                colspan = int(xattrs['colspan'])
                ws.write_merge(cline, rowspan - 1 + cline, ccell, colspan - 1 + ccell, xcontent, xstyle)
                for x in range(0, rowspan):
                    cells_occupy.add((cline + x, ccell))
                for x in range(0, colspan):
                    cells_occupy.add((cline, ccell + x))
            elif 'rowspan' in xattrs:
                rowspan = int(xattrs['rowspan'])
                ws.write_merge(cline, rowspan - 1 + cline, ccell, ccell, xcontent, xstyle)
                for x in range(0, rowspan):
                    cells_occupy.add((cline + x, ccell))
            elif 'colspan' in xattrs:
                colspan = int(xattrs['colspan'])
                ws.write_merge(cline, cline, ccell, colspan - 1 + ccell, xcontent, xstyle)
                for x in range(0, colspan):
                    cells_occupy.add((cline, ccell + x))
            else:
                ws.write(cline, ccell, xcontent, xstyle)
                cells_occupy.add((cline, ccell))

            b_readyinsert = False
            xattrs = {}
            xstyle = None
            # cell go
            # ccell += 1

        elif b_readyinsert:
            if content == 'br':
                if xcontent:
                    xcontent += 'r'

            elif tag == DATA:
                content = content.strip()
                if content:
                    if xcontent:
                        xcontent += ' ' + content
                    else:
                        xcontent = content

    return wb

def export_to_xls(table, b_export_response=True, table_title=''):
    """
    @param  table:              string or dict
    """
    wb = xlwt.Workbook(style_compression=2)
    if isinstance(table, dict):
        if table:
            vx = ''
            for kt, v in table.items():
                export_to_sheet(wb, unicode(kt), v)
        else:
            wb.add_sheet('EMPTY')
    elif isinstance(table, list):
        if table:
            vx = ''
            for kt, v in table:
                vx += u'<table><thead><tr><th></th></tr><tr><th>{}</th></tr></thead></table>{}'.format(unicode(kt), v)
            export_to_sheet(wb, 'NEW', vx)
        else:
            wb.add_sheet('EMPTY')
    else:
        export_to_sheet(wb, 'NEW', table)

    if b_export_response:
        sio = StringIO.StringIO()
        wb.save(sio)
        dd = sio.getvalue()
        sio.close()

        #download
        response = HttpResponse(dd, content_type='application/vnd.ms-excel')
        response['Content-Disposition'] = 'attachment; filename={0}.xls'.format(urlquote(table_title) or str(uuid.uuid4()))
        return response

    else:
        return wb

調(diào)用最后一個(gè)函數(shù) export_to_xls 就可以了。參數(shù)table,是HTML table 字符串。結(jié)合django的話,用render_to_string輸出就可以了。

在線疑問(wèn)仍未解決?專業(yè)顧問(wèn)為您一對(duì)一講解

24小時(shí)人工在線已服務(wù)6865位顧客5分鐘內(nèi)回復(fù)

Scroll to top
咨詢電話
客服郵箱
掃碼咨詢
主站蜘蛛池模板: 久久久久久久久久久免费 | 日日爽夜夜爽 | 精品一区二区在线免费观看 | 91尤物国产尤物福利在线播放 | 91精品人成在线观看 | 色是在线视频 | 国产91对白在线 | 毛片网站在线看 | 成人av电影在线观看 | 久久久精品视频网站 | 精品免费观看 | 国产伦精品一区二区三区高清 | 国产69精品久久99不卡的观看体验 | 国产黄在线看 | 亚洲精品综合一二三区在线观看 | 欧美日韩高清在线观看 | 国产日韩欧美视频在线观看 | 天天操天天干天天操天天干 | 91国内在线 | 国产精品网站 | 国产96精品 | 日韩精品久久久久久 | 日韩三级视频在线看 | 欧美少妇xxx| 中午字幕在线观看 | 国产精品成人一区二区三区 | 日韩欧美有码在线 | 日韩免费视频线观看 | 亚洲欧美日韩精品久久奇米一区 | 国产黄免费看 | 在线观看成人国产 | av成人在线网站 | 久久久久精 | 天天精品视频 | 婷婷色影院 | 久久久久久中文字幕 | 精品女同一区二区三区在线观看 | 色综合久久88 | 国产婷婷一区二区 | 中文字幕第 | 免费看国产精品 | 国产精品视频最多的网站 | 在线观看精品视频 | 波多野结衣视频一区 | 日韩电影在线观看一区二区三区 | 亚洲欧美日本A∨在线观看 青青河边草观看完整版高清 | 日韩精品aaa | 激情五月六月婷婷 | 伊人色播 | 丁香六月婷婷开心婷婷网 | 九色琪琪久久综合网天天 | 视频一区在线播放 | 97天堂网 | 免费国产在线精品 | 久久亚洲精品国产亚洲老地址 | 亚洲少妇久久 | 国产一级在线观看视频 | 欧美日韩高清一区二区 国产亚洲免费看 | 色诱亚洲精品久久久久久 | 亚洲激情精品 | 亚洲好视频 | 天天射天天干 | 久久久久久久久久久影院 | 午夜丁香视频在线观看 | 岛国片在线| av电影av在线 | 久久久久亚洲最大xxxx | 日韩中文字幕免费看 | 欧美综合在线视频 | 欧美一二三区在线播放 | 国产五月婷婷 | 亚洲 中文 欧美 日韩vr 在线 | 色人久久| 国产在线观看91 | 日本一区二区三区免费观看 | 在线观看中文字幕dvd播放 | 六月激情网 | 99久久精品久久亚洲精品 | 国产精品小视频网站 | 欧美日韩三级在线观看 | 色停停五月天 | 国产小视频在线观看免费 | 人人爽影院 | 日韩精品久久久久久久电影竹菊 | 国产成人三级在线 | 免费a一级 | 天天操天天射天天 | 国产美女精品视频免费观看 | 97超碰超碰 | 色天堂在线视频 | 97成人在线观看 | 久久久久二区 | 免费在线成人 | 国外成人在线视频网站 | 欧美伦理一区 | 日韩精品在线播放 | 日本中文乱码卡一卡二新区 | 天天操天天操一操 | 久久成人国产精品一区二区 |