zoukankan      html  css  js  c++  java
  • python2生成EXCEL——xlwt模块和xlsxwriter模块的简单使用

    # -*- coding: utf-8  -*-
    import xlwt
    import os
    import xlsxwriter
    
    class XLSX(object):
        """
        文档地址:https://xlsxwriter.readthedocs.io/working_with_data.html
        优点:功能强大,支持大文件写入
        缺点:不支持读取和修改、不支持XLS文件
        """
        def __init__(self, file_payh, sheet_name="sheet1"):
            self.workbook = xlsxwriter.Workbook(file_payh)
            self.sheet = self.workbook.add_worksheet(sheet_name)
            # 保存excel中表头列的唯一标识和列的索引
            self.keys = {}
            # 表头开始的行号
            self.start_row = 0
            # 当前待插入行的行号
            self.insert_row = 0
            # 表头开始的列号
            self.start_col = 0
    
        def get_style(self, font_name=u"微软雅黑", font_size=10, font_bold=False, font_color="black", border=1,
                      background_color="#FFFFFF", align="left", valign="vcenter"):
            """
            获取单元格样式
            设置字体:字体样式(默认微软雅黑),字体大小(默认10),字体默认不加粗,字体颜色(默认黑色)
            设置单元格:单元格背景颜色(默认白色)
            设置边框:边框宽度上下左右(默认宽度为1)
            """
    
            # 设置字体
            style = self.workbook.add_format({
                # 字体样式
                "font_name": font_name,
                # 字体大小
                "font_size": font_size,
                # 是否加粗
                "bold": font_bold,
                # 边框宽度
                "border": border,
                # 水平对齐方式
                "align": align,
                # 是否自动换行
                "text_wrap": True,
                # 背景颜色
                "fg_color": background_color,
                # 字体颜色
                "color": font_color,
                # 垂直居中
                "valign": valign
            })
            return style
    
        def set_head(self, head, start_row=0, start_col=0):
            """
            设置表头
            head:表头信息[{"name": "表头文本", "width": 10, "background-color": "green", "font-siz": 10}]
            start_row: 表头插入开始行,行号从0开始计算
            start_col:表头插入开始列,列号从0开始计算
            """
            # 设置当前行号,和表头所在行号
            self.start_row = start_row
            self.insert_row = start_row
            self.start_col = start_col
            # 添加表头
            for i in range(len(head)):
                col_index = start_col + i
                width = head[i].get("width", 10)
                background_color = head[i].get("background-color", "green")
                size = head[i].get("font-siz", 10)
                self.sheet.set_column(col_index, col_index, width)
                style3 = self.get_style(font_size=size, background_color=background_color)
                name = head[i].get("name", "").decode("utf-8")
                self.sheet.write(self.start_row, col_index, name, style3)
                key = head[i].get("key", "")
                self.keys[key] = {"col": col_index}
            self.insert_row += 1
    
        def write(self, data):
            """
            写入数据
            数据中各个对象的key需要和head保持一致
            数据格式
            data = [{"module": "地图", "function": "地图功能项1", "unique": "map", "info": "这是地图说明",
                     "type": "int", "value_info": "111111", "value": 1}]
            """
            for index, item in enumerate(data):
                row_index = self.insert_row + index
                for key in item.keys():
                    col_index = self.keys[key]["col"]
                    val = str(data[index][key])
                    self.sheet.write(row_index, col_index, val.decode("utf-8"))
    
        def group_write(self, data):
            """
            数据分组显示
            数据中各个对象的key需要和head保持一致
            数据格式
            data = [
                {
                    "module": "地图",
                    "data":[
                        {"function": "地图功能项1", "unique": "map", "info": "这是地图说明","type": "int", "value_info": "111111", "value": 1},
                        {"function": "地图功能项1", "unique": "map", "info": "这是地图说明", "type": "int", "value_info": "111111",
                         "value": 1},
                        {"function": "地图功能项1", "unique": "map", "info": "这是地图说明", "type": "int", "value_info": "111111",
                         "value": 1}
                    ]
    
                 },
            ]
            """
            for item in data:
                length = len(item["data"])
                module_name = item["module"]
                style = self.get_style(align="center")
                self.merge_range(self.insert_row, 0, self.insert_row + length - 1, 0, module_name.decode("utf-8"), style)
                functions = item["data"]
                self.write(functions)
                self.insert_row += length
            self.add_filter()
    
        def merge_range(self, first_row, first_col, last_row, last_col, data, style):
            """
            合并单元格
            """
            self.sheet.merge_range(first_row, first_col, last_row, last_col, data, style)
    
        def add_filter(self):
            """
            为每个列添加筛选功能
            """
            # 列添加筛筛选
            col_count = len(self.keys.keys())
            self.sheet.autofilter(self.start_row, self.start_col, self.insert_row-1, col_count - 1)
    
        def save(self):
            # 导出excel
            self.workbook.close()
    
    
    class XLS(object):
        def __init__(self, file_payh, sheet_name="sheet1"):
            self.workbook = xlwt.Workbook(encoding='utf-8')
            self.sheet = self.workbook.add_sheet(sheet_name, cell_overwrite_ok=True)
            self.keys = {}
            self.file_payh = file_payh
    
        def get_style(self, font_name=u"微软雅黑", font_size=10, font_bold=False, font_color="black", background_color="white",
                      border_left=1, border_right=1, border_top=1, border_bottom=1, center=False):
            """
            获取单元格样式
            设置字体:字体样式(默认微软雅黑),字体大小(默认10),字体默认不加粗,字体颜色(默认黑色)
            设置单元格:单元格背景颜色(默认白色)
            设置边框:边框宽度上下左右(默认宽度为1)
            """
    
            # 设置字体
            style = xlwt.XFStyle()
            font = xlwt.Font()
            # 字体样式
            font.name = font_name
            # 字体大小,字体大小的基本单位是20.
            font.height = 20 * font_size
            # 字体加粗
            font.bold = font_bold
            # 字体颜色
            font.colour_index = xlwt.Style.colour_map[font_color]
            style.font = font
    
            # 单元格对齐方式默认左对齐
            al = xlwt.Alignment()
            al.horz = 0x02 if center else 0x00
            # 设置自动换行
            al.wrap = True
            style.alignment = al
    
            # 设置单元格
            pat = xlwt.Pattern()
            # 设置单元格背景颜色
            pat.pattern = xlwt.Pattern.SOLID_PATTERN  # 设置单元格背景颜色
            pat.pattern_fore_colour = xlwt.Style.colour_map[background_color]
            style.pattern = pat
    
            # 设置边框
            border = xlwt.Borders()
            border.left = border_left
            border.right = border_right
            border.top = border_top
            border.bottom = border_bottom
            style.borders = border
            return style
    
        def set_head(self, head, start_row=0, start_col=0):
            """
            设置表头
            head:表头信息[{"name": "表头文本", "width": 10, "background-color": "green", "font-siz": 10}]
            start_row: 表头插入开始行,行号从0开始计算
            start_col:表头插入开始列,列号从0开始计算
            """
            # 添加表头
            for i in range(len(head)):
                col_index = start_col + i
                width = head[i].get("width", 10)
                background_color = head[i].get("background-color", "green")
                size = head[i].get("font-siz", 10)
                self.sheet.col(col_index).width = 256 * width  # 设置列宽,256为基准数,
                style3 = self.get_style(font_size=size, background_color=background_color)
                name = head[i].get("name", "")
                self.sheet.write(start_row, col_index, name, style3)
                key = head[i].get("key", "")
                self.keys[key] = {"col": col_index}
    
        def write(self, data, start_row):
            """
            写入数据
            """
            for index, item in enumerate(data):
                row_index = start_row + index
                for key in item.keys():
                    col_index = self.keys[key]["col"]
                    val = data[index][key]
                    self.sheet.write(row_index, col_index, val)
    
        def save(self):
            # 导出excel
            self.workbook.save(self.file_payh)
    
    
    class CppConfigXml(XLSX):
        def set_head(self, head, start_row=0, start_col=0):
            # 添加说明行
            # 合并单元格第0行第0列到第0行第7列
            style1 = self.get_style(font_size=20, font_bold=True, align="center")
            self.sheet.merge_range(0, 0, 0, 6, u"AUTO CPP 配置参数表", style1)
            style2 = self.get_style(font_size=10)
            explain = u"说明:HMI在与适配AL层交互时,由于系统能力或项目上与客户的约定不同,希望可以相应展现不同的UI样式和功能
    由项目/产品填写导入研发"
            self.sheet.merge_range(1, 0, 1, 6, explain, style2)
            self.sheet.set_row(1, 40)
    
            super(CppConfigXml, self).set_head(head, start_row, start_col)
    
    
    
    if __name__=="__main__":
        try:
            data = [{"module": "地图", "function": "地图功能项1", "unique": "map", "info": "这是地图说明",
                     "type": "int", "value_info": "111111", "value": 1}]
            head = [
                {"name": "模块", "width": 10, "key": "module"},
                {"name": "功能项", "width": 28, "key": "function"},
                {"name": "唯一码", "width": 52, "key": "unique"},
                {"name": "功能说明", "width": 62, "key": "info"},
                {"name": "参数类型", "width": 10, "key": "type"},
                {"name": "参数类型", "width": 15, "key": "value_info"},
                {"name": "参数值", "width": 10, "key": "value"},
            ]
            file_name = "1.xlsx"
            local_dir = os.path.dirname(os.path.abspath(__file__))
            file_pth = os.path.join(local_dir, file_name)
            start_row, start_col = 2, 0
            a = CppConfigXml(file_pth)
            a.set_head(head, start_row, start_col)
            a.write(data)
            a.add_filter()
            a.save()
        except Exception as e:
            print(e.message)
  • 相关阅读:
    MySQL Workbench的使用教程 (初级入门版)
    优化MySQL语句的十个建议
    Openfire+Spark+Spark Web安装配置(一)
    agsxmpp官方源代码
    (转载)Oracle中删除外键约束、禁用约束、启用约束
    8.手工备份恢复备用数据库(练习10、11)
    (转载)图文推荐给开发人员非常实用的站点
    13.服务器管理恢复RMAN备份(练习20)
    9.手工备份恢复表空间时间点恢复(练习12.13.14)
    12.服务器管理恢复RMAN配置(练习19)
  • 原文地址:https://www.cnblogs.com/fuchenjie/p/13564290.html
Copyright © 2011-2022 走看看