Linux Python Openpyxl xlsx转html

news2024/11/28 19:06:16

目录

Excel转Html

示例

函数

Openpyxl知识点

其他Excel解析库问题


Excel转Html

示例

函数

import openpyxl

from openpyxl.styles import Border
from openpyxl.styles import Font
from openpyxl.styles import Side
from openpyxl.styles import Alignment
from openpyxl.styles import PatternFill
from openpyxl.cell import MergedCell


# 模式:adaptive / normal
def transfer_xlsx_to_html(m_sheet, m_mode):
    # sheet.min_row的值在后续数据获取过程中会改变,原因不明
    m_min_row = m_sheet.min_row
    m_max_row = m_sheet.max_row
    m_min_column = m_sheet.min_column
    m_max_column = m_sheet.max_column
    if m_min_row == m_max_row == m_min_column == m_max_column and not m_sheet.cell(m_min_row, m_min_column).value:
        return ''
    m_merged_cell_dict = {}  # 用于储存 所有合并单元格的左上单元格对象
    m_width_dict = {}  # 用于储存 所有列的列宽,px
    m_height_dict = {}  # 用于储存 所有列的行高,px
    # 查询行高
    for m_i in range(m_min_row, m_max_row + 1):
        m_height = 13.5
        if m_sheet.row_dimensions[m_i].height:
            m_height = m_sheet.row_dimensions[m_i].height
        m_height_dict[str(m_i)] = m_height
    # 查询列宽
    for m_i in range(m_min_column, m_max_column + 1):
        m_column_name = openpyxl.utils.get_column_letter(m_i)
        m_width = m_sheet.column_dimensions[m_column_name].width
        if m_mode == 'normal':
            m_width = m_sheet.column_dimensions[m_column_name].width * 6
        m_width_dict[m_column_name] = m_width
    # 找出所有合并区域的行高,列宽,向右合并距离,向下合并距离
    for m_merged_range in m_sheet.merged_cells.ranges:
        m_width = 0  # 定义列宽
        m_height = 0  # 定义行高
        for m_i in range(m_merged_range.min_row, m_merged_range.max_row + 1):
            m_height += m_height_dict[str(m_i)]
        for m_i in range(m_merged_range.min_col, m_merged_range.max_col + 1):
            m_column_name = openpyxl.utils.get_column_letter(m_i)
            m_width += m_width_dict[m_column_name]
        m_cell = m_sheet.cell(row=m_merged_range.min_row, column=m_merged_range.min_col)  # 选择合并区域左上单元格
        m_colspan = m_merged_range.max_col - m_merged_range.min_col + 1  # 向右合并长度
        m_rowspan = m_merged_range.max_row - m_merged_range.min_row + 1  # 向下合并长度
        m_merged_cell_dict[m_cell] = (m_height, m_width, m_colspan, m_rowspan)
    # 开始写入数据到table标签
    m_html = '''<table style="border: 1px solid #A9A9A9">'''
    for m_i in range(m_min_row, m_max_row + 1):
        tr = '''<tr>'''
        for m_j in range(m_min_column, m_max_column + 1):
            m_cell = m_sheet.cell(m_i, m_j)
            m_column_name = openpyxl.utils.get_column_letter(m_j)
            # html 字体大小
            m_font_size = str(int(m_cell.font.size) + 3)
            # html 字体加粗
            m_font_weight = '700' if m_cell.font.b else '400'
            # html 边框格式
            m_border = 'border: 1px solid #A9A9A9' if m_cell.value else 'border: 0'
            # 水平位置
            m_align_horizontal = 'text-align: {}'.format(m_cell.alignment.horizontal) if m_cell.alignment.horizontal else ''
            # 垂直位置
            m_align_vertical = 'vertical-align: {}'.format(m_cell.alignment.vertical) if m_cell.alignment.vertical else ''
            # 字体颜色 颜色未设置时有时会存在 Values must be of type <class 'str'> 输出
            if m_cell.font.color and 'str' not in str(m_cell.font.color.rgb):
                m_font_color = 'color: #{}'.format(m_cell.font.color.rgb[2:])
            else:
                m_font_color = 'color: #000000'
            # 背景颜色 颜色未设置时有时会存在 Values must be of type <class 'str'> 输出
            if m_cell.fill.fgColor and 'str' not in str(m_cell.fill.fgColor.rgb) and m_cell.fill.fgColor.rgb[2:] != '000000':
                m_fill_color = 'background-color: #{}'.format(m_cell.fill.fgColor.rgb[2:])
            else:
                m_fill_color = 'background-color: #FFFFFF'
            # 单元格格式
            style = f'''{m_fill_color}; {m_border}; '''
            if m_cell.value:
                style += f'''{m_font_color};
                                font-style: normal;
                                font-family: 微软雅黑;
                                font-size: {m_font_size}px; 
                                font-weight: {m_font_weight}; 
                                {m_align_horizontal}; {m_align_vertical}; '''

            if m_mode == 'normal':
                if m_cell in m_merged_cell_dict.keys():
                    style += f'''height: {m_merged_cell_dict[m_cell][0]}px; width: {m_merged_cell_dict[m_cell][1]}px; '''
                else:
                    style += f'''height: {m_height_dict[str(m_i)]}px; width: {m_width_dict[m_column_name]}px; '''
            else:
                style += f'''word-break: keep-all; word-wrap:break-word; white-space: nowrap'''

            # 文本处理:小数转为百分比展示
            text = m_cell.value if m_cell.value else ''
            text = '{:.2f}%'.format(text*100) if type(text) == float else text

            td = ""
            if m_cell in m_merged_cell_dict.keys():
                td = f'''<td colspan="{m_merged_cell_dict[m_cell][2]}" rowspan="{m_merged_cell_dict[m_cell][3]}" style="{style}">{text}</td>'''
            elif not isinstance(m_cell, MergedCell):
                td = f'''<td style="{style}">{text}</td>'''
            tr = tr + td
        tr = tr + '''</tr>'''
        m_html = m_html + tr
    return m_html

Openpyxl知识点

函数功能
workbook.sheetnames返回一个列表,记录所有Sheet页名称
workbook[sheetname]定位Sheet页
workbook.remove(sheetname)删除Sheet页
sheet.min_row
sheet.max_row
sheet.min_column
sheet.max_column

获取有效数据首行(有时会改变,原因不明)

获取有效数据末行

获取有效数据首列

获取有效数据末列

sheet.views.sheetView[0].showGridLines设置网格线

sheet.row_dimensions[row_index].height

sheet.column_dimensions[column_name].width

openpyxl.utils.get_column_letter(column_index)

获取、设置行高

获取、设置列宽

获取下标对应的列名(从1开始)

cell.value

cell.alignment

cell.number_format

获取、设置文本

获取、设置对齐

获取、设置数字格式

cell.border = Border()

cell.border.left.style

cell.border.top.style

cell.border.right.style

cell.border.bottom.style

设置边框格式

获取边框格式-左(不能直接获取)

获取边框格式-上(不能直接获取)

获取边框格式-右(不能直接获取)

获取边框格式-下(不能直接获取)

cell.font

cell.font.size
cell.font.b

cell.font.color.rgb

设置字体格式

获取字体信息-尺寸

获取字体信息-粗细

获取字体颜色(不能直接获取)

cell.fill

cell.fill.fgColor.rgb

设置填充颜色

获取填充颜色(不能直接获取)

cell.coordinate
cell.alignment.vertical
cell.alignment.horizontal

获取坐标信息

获取对齐信息-竖直对齐

获取对齐信息-水平对齐

sheet.merge_cells()合并单元格
isinstance(cell, MergedCell)判断是否为合并单元格
sheet.merged_cells.ranges
sheet.merged_cells.ranges[index].min_row
sheet.merged_cells.ranges[index]..max_row
sheet.merged_cells.ranges[index]..min_col
sheet.merged_cells.ranges[index]..max_col
获取合并单元格信息

 示例代码:

import openpyxl

from openpyxl.styles import Border
from openpyxl.styles import Font
from openpyxl.styles import Side
from openpyxl.styles import Alignment
from openpyxl.styles import PatternFill
from openpyxl.cell import MergedCell

# 打开Excel
workbook = openpyxl.load_workbook(filename='D:\Project\test.xlsx')
print(workbook.sheetnames)

# 创建删除sheet
workbook.create_sheet('test')
workbook.remove('test')

# 行数列数
sheet = workbook.sheetnames[0]
print(sheet.min_row)
print(sheet.max_row)
print(sheet.min_column)
print(sheet.max_column)
# 行高列宽
print(sheet.row_dimensions[1].height )
print(sheet.column_dimensions['A'].width)

# 设置行高列宽
sheet.row_dimensions[1].height = 10
sheet.column_dimensions['A'].width = 10
# 获取下标对应的列名(从1开始)
column_name = openpyxl.utils.get_column_letter(1)

# 设置不显示网格线
sheet.views.sheetView[0].showGridLines = False
# 合并单元格
sheet.merge_cells(start_row=1, end_row=2, start_column=3, end_column=4)

# 设置数字格式
sheet.cell(row=2, column=2, value=100).number_format = '0'
sheet.cell(row=3, column=3, value=100).number_format = '0.00%'

# 设置单元格
sheet.cell(row=1, column=1, value='test')
# 设置填充颜色
fill = PatternFill('solid', fgColor='123456')
# 设置字体格式
font = Font(u'微软雅黑', size=16, bold=True, italic=False, strike=False, color='000000')
# 设置文本对齐
alignment = Alignment(wrap_text=True, horizontal='center', vertical='center')
# 方式一
sheet.cell(row=1, column=1, fill=fill, font=font, alignment=alignment, value='test')
# 方式二
sheet.cell(row=1, column=1).value = 'test'
sheet.cell(row=1, column=1).fill = fill
sheet.cell(row=1, column=1).font = font
sheet.cell(row=1, column=1).alignment = alignment

# 设置边框 方式一 合并单元格时右侧边框设置会不成功
border = Border()
border.left = Side(border_style='double', color='000000')
border.top = Side(border_style='double', color='000000')
border.right = Side(border_style='double', color='000000')
border.bottom = Side(border_style='double', color='000000')
# 设置边框 方式二 合并单元格时右侧边框设置会不成功
border = Border(left=Side(border_style='double', color='000000'),
                      top=Side(border_style='double', color='000000'),
                      right=Side(border_style='double', color='000000'),
                      bottom=Side(border_style='double', color='000000'))


# 使用下标索引时从0开始
cell = sheet[0][0]
cell = sheet.cell(row=1, column=1)
# 获取单元格信息
print(cell.value)
print(cell.coordinate)
# 获取字体信息
print(cell.font.size)
print(cell.font.b)
# 获取对齐信息
print(cell.alignment.vertical)
print(cell.alignment.horizontal)
# 判断是否为合并单元格
print(isinstance(cell, MergedCell))

# 获取边框信息 未初始化时不可直接获取
left = cell.border.left.style if cell.border.left else ''
top = cell.border.top.style if cell.border.top else ''
right = cell.border.right.style if cell.border.right else ''
bottom = cell.border.bottom.style if cell.border.bottom else ''
# 获取颜色信息 未初始化时不可直接获取
font_color = cell.font.color.rgb if 'str' not in str(cell.font.color.rgb) else ''
fill_color = cell.fill.fgColor.rgb if 'str' not in str(cell.fill.fgColor.rgb) else ''

# 获取合并单元格信息
merged_list = sheet.merged_cells.ranges
merged_cell = sheet.merged_cells.ranges[0]
print(merged_cell.min_row)
print(merged_cell.max_row)
print(merged_cell.min_col)
print(merged_cell.max_col)

其他Excel解析库问题

库名说明
pandas支持数据处理,不支持格式获取
xlsx2html支持简单表格,不支持合并单元格
xlwings支持Windows和MacOS系统,Linux系统需要使用xlwings pro

参考资料:

python将excel转html的table标签(含合并单元格)_python xlsx转html_weixin_50702169的博客-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/512755.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ChipScope 使用问题和解决方案

背景介绍 我最近在学习FPGA开发技术&#xff0c;用杜勇老师的《Xinlinx FPGA数字信号处理设计》一书&#xff0c;按照书中的例子&#xff0c;对 CXD301 开发板进行ADC、DAC示例的调试&#xff0c;使用 ChipScope 软件进行在线逻辑分析。遇到了下面的问题&#xff0c;并给出了解…

【软考数据库】第十章 系统开发与运行

目录 10.1 系统实施 10.1.1 信息系统生命周期 10.1.2 能力成熟度模型 10.1.3 软件过程开发模型 10.1.4 信息系统开发方法 10.1.5 系统分析与设计 10.1.6 结构化开发 10.2 系统测试 10.2.1 测试原则和方法 10.2.2 测试阶段 10.2.3 测试用例设计 10.2.4 调试 10.2.…

现代化个人博客系统 ModStartBlog v7.3.0 首页热门博客,UI优化调整

ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场拥有丰富的功能应用&#xff0c;支持后台一键快速安装&#xff0c;让开发者能快的实现业务功能开发。 系统完全开源&#xff0c;基于 Apache 2.0 开源协议。 功能特性 丰富的模块市场&#xff0c;后台一键快速安装 …

GETOPT函数详解

一、目的 相信第一次接触linux的小伙伴在使用命令行时肯定有这样的疑惑&#xff0c;命令行各种各样的选项和选项参数是怎样实现的&#xff08;各个命令的选项的含义可以通过man手册查看&#xff09;。 二、介绍 在正式介绍之前&#xff0c;我们先来看一下命令行选项的使用&…

数据库原理+openGauss

文章目录 0. 准备工作0.1 实验环境0.2 主要内容0.3 学习资源 1. 安装部署实验&#xff08;实验一&#xff09;1.1 下载VirtualBox1.2 安装VirtualBox1.3 镜像文件导入1.4 启动虚拟机1.5 数据库使用1.6 数据库基本操作 2 表&模式&#xff08;实验二&#xff09;2.1 创建模式…

jmeter如何测试一个post请求(发送json请求报文)

目录 1.配置测试计划1.1.创建POST的HTTP请求取样器&#xff08;模拟POST请求&#xff09;1.2.创建HTTP信息头管理器 2.执行压测并查看结果 jmeter如何测试一个发送json报文的post请求. 更详细的配置请参考另外一篇博文&#xff1a; jmeter如何测试一个get请求 1.配置测试计划 …

独立站运营必做的6项工作内容

独立站的运营工作内容比较繁琐和全面&#xff0c;主要包括以下几个方面&#xff1a; 一、网站策划和设计 定义网站目标和定位制定网站规划和设计方案确定网站主题、颜色和页面布局确定网站的核心功能和用户体验设计网站的Logo和其他品牌元素 二、网站建设和维护 选择网站主…

React基础入门【一】

官方文档&#xff1a;https://react.docschina.org/ 说明 本文总结自尚硅谷课程。学习本教程之前&#xff0c;最好具备vue的基础知识&#xff0c;明白虚拟DOM、jsx这些前置知识。接下来&#xff0c;我们通过一个简单的示例来展示react的使用。 注意&#xff1a;入门的学习不…

【Atlas 200】华为昇腾Atlas 200加速模块RC场景无法启动卡在Start to jump Linux kernel

问题现象 RC场景下&#xff0c;装有华为昇腾Atlas 200加速模块的开发板无法启动系统。 将制作好系统的SD卡插入开发板&#xff0c;0号串口输出的日志卡在Start to jump Linux kernel&#xff0c;之后没有更多输出。 可能原因 一种比较大的可能是——在制作系统时&#xff0c…

Mac终端代理

1.打开代理查看代理端口号 打开设置&#xff0c;点击网络&#xff0c;点击详细信息&#xff0c;点击代理查看代理端口号。 2.修改环境变量 1&#xff09;终端输入下面命令 vim .zshrc 2&#xff09;在.zshrc文件里添加下面两段内容&#xff08;注意&#xff1a;7980为端口号…

力扣206反转链表:代码实现+图文全解+方法总结(四种方法)

文章目录 第一部分&#xff1a;题目描述第二部分&#xff1a;题解2.1 方法一&#xff1a;生成新节点到新链表2.2 方法二&#xff1a;复用旧节点到新链表&#x1f340; 面向过程式思想方法&#x1f340; 面向对象式思想方法 2.3 方法三&#xff1a;递归2.4 旧链表中移动旧节点 第…

02:MYSQL---DML

目录 1:介绍 2:DML数据操作 1:介绍 DML英文全称是Data Manipulation Lanquage(数据操作语言)&#xff0c;用来对数据库中表的数据记录进行增删改操作。 添加数据 :insert 修改数据:update 删除数据:delete 2:DML数据操作 给指定字段添加数据 insert into 表名(字段名1,…

segment-anything本地部署使用

前言 Segment Anything Model&#xff08;SAM&#xff09;是一种先进的图像分割模型&#xff0c;它基于Facebook AI在2020年发布的Foundation Model3&#xff0c;能够根据简单的输入提示&#xff08;如点或框&#xff09;准确地分割图像中的任何对象&#xff0c;并且无需额外训…

将项目导入到github全过程

新建仓库 完善仓库信息 然后点击创建仓库 复制仓库地址 将文件上传到git上 我这里要上传IMProject文件夹&#xff0c;所以就在这个文件夹内部&#xff0c;右键鼠标&#xff0c;然后点击git bash here 输入git init &#xff0c;然后文件夹里面就会多一个.git文件 输入gi…

【IoT】ChatGPT 与 AI 硬件

随着AI的发展&#xff0c;比如最近炒得很火的ChatGPT&#xff0c;还在持续快速迭代更新。 当然了&#xff0c;对于软件和算法&#xff0c;如果你想&#xff0c;每天迭代 10 个版本都可以。 包括科大讯飞的星火认知大模型最近也刚发布。 这就引出了未来一个更大的发展方向&am…

PMP课堂模拟题目及解析(第7期)

61. 为限制项目变更的数量&#xff0c;项目经理制定了严格的变更管理计划&#xff0c;只允许批准减轻重大潜在或实际风险的变更&#xff0c;一位团队成员提出了一个范围变更&#xff0c;该变更将消除对一个落后于进度计划的外部项目的依赖关系。项目经理应该怎么做&#xff1f…

AI绘图实战(九):给热门歌曲做配图 | Stable Diffusion成为设计师生产力工具

S&#xff1a;AI能取代设计师么&#xff1f; I &#xff1a;至少在设计行业&#xff0c;目前AI扮演的主要角色还是超级工具&#xff0c;要顶替&#xff1f;除非甲方对设计效果无所畏惧~~ 预先学习&#xff1a; 安装及其问题解决参考&#xff1a;《Windows安装Stable Diffusion …

迎接新时代挑战:项目管理中的创新与发展

你想知道如何在你的 PM 角色中保持最新状态吗&#xff1f; 您所在的行业是否发展如此之快&#xff0c;以至于有一天您可能不再需要您&#xff1f; 随着人工智能、敏捷和授权团队的兴起&#xff0c;项目经理还需要吗&#xff1f;也许吧&#xff0c;但不是出于您可能期望的原因。…

@vant/weapp

文章目录 一、介绍二、安装1. cd 到项目文件目录2. 使用 npm 安装3. 修改项目配置4. 构建5. 其他文件 三、使用四、【参考】 微信小程序使用vant/weapp组件 一、介绍 Vant 是一个开源的移动端组件库&#xff0c;在微信小程序开发中可以使用该UI库提提供的组件。 使用这个三方…

用户分享 | Dockquery,一个国产数据库客户端的初体验

DockQuery 有话说 DockQuery &#xff0c;「天狼」也&#xff0c;中原本土狼种。天狼年纪很小&#xff0c;不满一岁&#xff0c;但它有一个伟大的梦想——建造一座能容纳中原群狼的宫殿&#xff01;它不想再被异域狼欺负&#xff0c;不想被异域狼群挤占生存空间&#xff0c;它…