整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

Excel转Word表格不变形,用网页格式1分钟搞定

Excel转Word表格不变形,用网页格式1分钟搞定,别再逐个调整了!

xcel表格直接粘贴到Word文档会变形,这个问题相信很多人都遇到,今天就跟大家分享下解决的方法,操作其实非常的简单,只不过可能很多人都不知道

一、原理解析

Excel表格粘贴在Word文档中会发生变形,本质的原因就是表格的格式变化了。

Excel与Word表格它们对【列宽】、【行高】等格式的度量规则是不一致的,因为格式变化了,所以表格就会发生变形。

想要实现不变形的相互转换,最重要的就是找到一种2者都可以识别的格式。【网页格式】就能满足这个要求,只需3步即可轻松搞定

转换步骤:Excel表格→网页格式表格→Word表格

这个过程也是可逆的,下面来看下具体操作

二、Excel转换网页格式

打开Excel表格,点击左上角的【文件】然后找到【另存为】点击蓝色的【更多选项】,将文件的格式设置为【单个文件网页】,然后选择一个储存的位置,最下方将发布设置为【工作表】最后点击发布,点击发布后会再次跳出一个窗口,选择表格所在的sheet位置,直接点击发布即可。

三、Word打开

找到另存的网页文件,点击鼠标右键找到【打开方式】选择使用【Word】文档打开,如果超过了1页直接在右下角向下拖动整个文件调整位置。最后需要将网页格式的文件另存为Word文档的格式即可。至此设置完毕

以上就是今天分享的全部内容,我是Excel从零到一,关注我,持续分享更多Excel技巧


如果你想要提高工作效率,不想再求同事帮你解决各种Excel问题,可以了解下我的专栏,讲解了函数、图表、透视表、数据看板等常用功能,带你快速成为Excel高手

数据分析中,将数据以表格的形式呈现出来是必不可少的环节,Pandas 是一个非常强大的数据分析库,提供了很多方便的方法来处理和展示数据。今天,我们将学习如何使用 Pandas 自定义表格样式并将其导出为 HTML 格式。

通过这种方式,我们可以更好地组织和展示数据,并在网页上共享我们的分析结果,并且,掌握Pandas数据存储和表格样式自定义的方式,在日常工作过程中有更多应用和实践意义,将拓展我们的数据分析思路。

导入数据

首先,导入pandas库,并为其设置别名pd,使用pandas的read_excel函数读取指定路径下的Excel文件,并将其内容存储在DataFrame对象df中。

import pandas as pd

df=pd.read_excel(r'C:\Users\shangtianqiang\Desktop\2023年胡润百富榜.xlsx')
#默认显示DataFrame的前五行。
df.head()

df.info()显示DataFrame的简要信息,包括索引、列名、数据类型和每列的非空值数量,这里显示该数据表含有1241行数据。

#数据预览
df.info()

使用iloc方法筛选DataFrame的前100行数据。

df=df.iloc[:100,:]#筛选前100行数据
df

自定义样式

定义一个样式对象style,该对象用于生成HTML的样式,这里对筛选出来的前100行的数据进行了样式设置,它定义了一个居中的标题(h1标签),一个表格(table标签),以及表格中的表头(th标签)和单元格(td标签)。

  • h1 标签:文本居中,字体大小为24像素,下边距为10像素;
  • table 标签:边框合并(border-collapse: collapse;),宽度为100%;
  • th, td 标签:边框为1像素的实线,内边距为8像素,文本居中;
  • th 标签:背景颜色为浅灰色(#f2f2f2)。
# 定义CSS样式,添加标题“2023年胡润百富榜”  
style="""  
<style> 
h1 {  
    text-align: center;  
    font-size: 24px;  
    margin-bottom: 10px;  
}  
table {  
    border-collapse: collapse;  
    width: 100%;  
}  
th, td {  
    border: 1px solid black;  
    padding: 8px;  
    text-align: center;  
}  
th {  
    background-color: #f2f2f2;  
}  
</style>  
<head><title>2023年胡润百富榜</title></head>
<h1>2023年胡润百富榜</h1> 
"""  

将DataFrame转换为HTML代码,并添加样式,index=False来去除行索引 。

# 将DataFrame转换为HTML代码,并添加样式  
html=style + df.to_html(index=False)  # 使用index=False来避免显示行索引 

将生成的HTML内容写入到名为'2023年胡润百富榜.html'的文件中。

# 将HTML代码写入文件或打印到控制台  
with open('2023年胡润百富榜.html', 'w') as file:  
    file.write(html)  # 将HTML代码写入文件output.html

完整版的代码如下所示。

import pandas as pd

df=pd.read_excel(r'C:\Users\shangtianqiang\Desktop\2023年胡润百富榜.xlsx')
df=df.iloc[:100,:]#筛选前100行数据
  
# 定义CSS样式,添加标题“2023年胡润百富榜”  
style="""  
<style> 
h1 {  
    text-align: center;  
    font-size: 24px;  
    margin-bottom: 10px;  
}  
table {  
    border-collapse: collapse;  
    width: 100%;  
}  
th, td {  
    border: 1px solid black;  
    padding: 8px;  
    text-align: center;  
}  
th {  
    background-color: #f2f2f2;  
}  
</style>  
<head><title>2023年胡润百富榜</title></head>
<h1>2023年胡润百富榜</h1> 
"""  
  
# 将DataFrame转换为HTML代码,并添加样式  
html=style + df.to_html(index=False)  # 使用index=False来避免显示行索引  
  
# 将HTML代码写入文件或打印到控制台  
with open('2023年胡润百富榜.html', 'w') as file:  
    file.write(html)  # 将HTML代码写入文件output.html

导出的HTML表格样式如下所示,整体图表风格较为简洁。

导入数据

html的格式数据也是数据存储的一种方式,使用read_html命令可以将其很便捷地导入,从而进行接下来的数据分析。

import pandas as pd

df_html=pd.read_html('2023年胡润百富榜.html',encoding='gbk')[0]
df_html

通过学习如何使用 Pandas 自定义表格样式并将其导出为 HTML 格式,我们掌握了更丰富的数据处理和展示技巧,并且,还可以根据实际业务需求来自定义表格样式,实现与他人共享数据的目的。

Python是一门易学易用、代码简洁的编程语言,广泛应用于各个领域,尤其适合用于办公自动化。

通过使用Python实现办公自动化,不仅能够大幅提升工作效率,还能有效减少重复性的任务。Python的应用场景非常广泛,包括操作Word、Excel、PPT,处理文本和文件,自动发送邮件,进行网页自动化操作,定时任务调度,图像处理与识别,自动生成报表,以及整合API和外部系统等。这些功能的集成使用,可以显著提高办公效率。

在Python生态系统中,python-docxjinja2python-docx-template 等库为我们提供了强大且灵活的工具,使得我们能够以编程的方式轻松创建和修改Word文档,从而进一步优化办公自动化流程。

python-docx

python-docx是一个Python库,用于创建和修改Microsoft Word文档。

它可以用来添加文本、插入图片、创建表格、设置格式和样式等。

这个库特别适合需要自动生成报告或处理文档的应用。

from docx import Document
from docx.shared import Inches

# 创建文档对象
document=Document()

# 添加标题
document.add_heading('文档标题DHub', 0)

# 添加段落,包含粗体和斜体文本
p=document.add_paragraph('这是一个普通段落,包含一些 ')
p.add_run('粗体').bold=True
p.add_run(' 和一些 ')
p.add_run('斜体。').italic=True

# 添加一级标题
document.add_heading('一级标题', level=1)

# 添加引用样式的段落
document.add_paragraph('强烈引用', style='Intense Quote')

# 添加无序列表项
document.add_paragraph('无序列表项', style='List Bullet')

# 添加有序列表项
document.add_paragraph('有序列表项', style='List Number')

# 添加图片,并设置宽度
document.add_picture('./images/monty-truth.png', width=Inches(1.25))

# 添加表格
records=(
    (3, '101', '火腿'),
    (7, '422', '鸡蛋'),
    (4, '631', '火腿、火腿、鸡蛋和火腿')
)

table=document.add_table(rows=1, cols=3)
hdr_cells=table.rows[0].cells
hdr_cells[0].text='数量'
hdr_cells[1].text='编号'
hdr_cells[2].text='描述'
for qty, id, desc in records:
    row_cells=table.add_row().cells
    row_cells[0].text=str(qty)
    row_cells[1].text=id
    row_cells[2].text=desc

# 添加分页符
document.add_page_break()

# 保存文档
document.save('demo.docx')

输出:

python-docx创建文档功能强大,但不适用于修改文档

jinja2

Jinja2 是一个Python模板引擎,用于生成动态网页内容。

它允许创建包含占位符的模板,这些占位符在渲染时会被实际数据替换。

主要功能:

  1. 动态内容生成:通过模板引擎,可以根据用户输入或其他数据生成HTML、XML等标记内容。
  2. HTML 转义:自动处理特殊字符,防止 XSS 攻击。
  3. 模板继承:可以从基础模板继承并扩展,避免重复代码,提高开发效率。

安装:

pip install jinja2

示例:

假设要创建一个显示购物清单的网页,就可以使用Jinja2来动态生成包含购物项的HTML页面。

app.py

from flask import Flask, render_template

app=Flask(__name__)

@app.route('/')
def index():
    items=[
        {'name': '苹果', 'quantity': 5},
        {'name': '香蕉', 'quantity': 3},
        {'name': '牛奶', 'quantity': 2}
    ]
    return render_template('shopping_list.html', items=items)

if __name__=='__main__':
    app.run(debug=True)

templates/shopping_list.html

<!DOCTYPE html>
<html>
<head>
    <title>购物清单</title>
</head>
<body>
    <h1>我的购物清单</h1>
    <ul>
        {% for item in items %}
        <li>{{ item.name }} - {{ item.quantity }} 个</li>
        {% endfor %}
    </ul>
</body>
</html>

在这个示例中,我们有一个 Flask 路由 /,它将一个购物项列表传递给模板 shopping_list.html

模板使用 Jinja2 的循环语法 {% for item in items %} 来动态生成每个购物项的列表。

这样,每次访问页面时,都会显示当前的购物清单。

python-docx-template

虽然python-docx在创建文档方面非常强大,但它在修改现有文档时有一定的局限性。

python-docx-template允许用户利用熟悉的 Word 界面创建模板文档,并通过jinja2`的模板语法动态替换和修改内容。

详细文档请参考:python-docx-template

这个包结合了以下两个库:

  • python-docx:用于读取、写入和创建文档
  • jinja2:用于管理模板中的标签

实现原理:

1、使用Microsoft Word创建所需的文档样本,包括图片、目录、页脚、页眉、变量等。

2、在文档中插入类似 Jinja2 的标签,并将文档保存为.docx文件,作为模板文件。

3、使用python-docx-template从模板和相关的上下文变量生成多个Word文档。

Jinja2-like 语法

标签用法

  • 段落: {%p jinja2_tag %}
  • 表格行: {%tr jinja2_tag %}
  • 表格列: {%tc jinja2_tag %}
  • 文本运行: {%r jinja2_tag %}

变量显示

  • 字符串变量: {{ <var> }}
  • 富文本变量: {{r <var> }}

注释

  • 段落注释: {#p 注释 #}
  • 表格行注释: {#tr 注释 #}
  • 表格列注释: {#tc 注释 #}

合并与分隔文本

  • 合并: {%- if condition -%} ... {%- endif -%}
  • 分隔: 使用 ENTERSHIFT+ENTER

转义字符

  • 转义符: {_%, %_}{_{, }_}

表格

  • 横向合并: {% colspan <var> %}
  • 纵向合并: {% hm %}{% vm %}
  • 单元格背景色: {% cellbg <var> %}

富文本

  • 创建: RichText('text', font='font_name')
  • 添加链接: 使用 RichTexturl_id

图片

  • 插入图片: {{ <var> }}
  • myimage = InlineImage(tpl, 'image_path.png', width=Mm(20), height=Mm(10))

子文档

  • 合并子文档:
  • tpl = DocxTemplate('template.docx')
    sd = tpl.new_subdoc('subdoc.docx')

替换

  • 图片: tpl.replace_pic('dummy.jpg', 'new.jpg')
  • 媒体: tpl.replace_media('dummy_media.jpg', 'new_media.jpg')
  • 嵌入对象: tpl.replace_embedded('dummy.docx', 'new.docx')

获取未声明变量

tpl=DocxTemplate('template.docx')
tpl.render(context_dict)
set_of_variables=tpl.get_undeclared_template_variables()

多次渲染

  • 重置: tpl.reset_replacements()

特殊情况

  • Word 2016: 使用RichText处理空格和制表符

自定义 Jinja 过滤器

import jinja2

def multiply_by(value, by):
    return value * by

jinja_env=jinja2.Environment()
jinja_env.filters['multiply_by']=multiply_by

一个完整示例

1、在 Word 中编辑模板

2、编写代码

from docxtpl import DocxTemplate, InlineImage
import datetime as dt
from docx2pdf import convert

# 指定输入和输出文件名
input_file='docs/invitation.docx'
output_file='docs/invitation.pdf'

# 创建文档对象
doc=DocxTemplate("inviteTmpl.docx")

# 创建上下文字典
context={
    "todayStr": dt.datetime.now().strftime("%Y年%m月%d日"), 
    "recipientName": "亲爱的朋友",  
    "evntDtStr": "2024年08月09日",  
    "venueStr": "洛克大厦",  # 事件地点
    "senderName": "吴建明",  # 发送者名字
}

# 将图片插入到上下文中
context['bannerImg']=InlineImage(doc, 'images/AIGC.png')

# 将上下文渲染到文档对象中
doc.render(context)

# 将文档对象保存为 Word 文件
doc.save(input_file)

# 将 DOCX 文件转换为 PDF
convert(input_file, output_file)

执行时长约为 3 秒:

3、生成效果如下:

生成word和pdf文件,pdf内容如右下图。2个文件格式完全一致。

小结

通过 python-docxjinja2python-docx-template,我们可以高效地创建和修改Word文档,并实现动态内容的自动生成。

无论是生成报告、创建网页内容,还是处理复杂的文档模板,这些工具都能为我们的工作提供强大的支持。