自动化Excel进阶技能之一:添加图片

尽管Excel电子表格中并不经常都是插入图片的,但是添加了图片以及图片里插入里url链接,这还是相当实用的。我们可以用它来做品牌宣传,或者让Excel表格更加个性化。

怎么做?

为了能够使用openpyxl向电子表格加载图片,我们必须安装Pillow

除此之外,我们还需要准备一张要插入的图片。

我们可以在百度图片搜索pandas,然后在Chrome浏览器下面用“图片助手”的插件抓取png格式的pandas徽标图片,将最终的文件保存为 logo.png,并将这个图片复制到你运行示例的根目录下

这是你需要将该图片导入到hello_word.xlsx电子表格中的代码:

from openpyxl import load_workbookfrom openpyxl.drawing.image import Image# 我们用一个数据很小的hello_world文件workbook = load_workbook(filename="hello_world.xlsx")sheet = workbook.activelogo = Image("logo.png")# 调整图片大小,免得全屏都是图片logo.height = 150logo.width = 150sheet.add_image(logo, "A3")workbook.save(filename="hello_world_logo.xlsx")

自动化Excel进阶技能之二:创建漂亮的图表

Excel之所以强大,是因为能够绘制各种图表。

Excel图表是一种快速可视化,解释数据的好方法。

Excel内有很多不同的图表类型:柱状图、饼状图、线状图等等。

openpyxl支持所有的Excel图表。

在这里,我列举几个怎么画图表的例子,其余图表类型都是一样,照模画虎就行。

请注意:openpyxl目前不支持的几种图表类型有:Funnel, Gantt, Pareto, Treemap, Waterfall, Map和Sunburst。

对于任何我们想构建的图表,我们都需要定义图表类型。BarChart, LineChart等,再加上用于图表的数据。

在构建图表之前,我们需要定义我们想在图表中看到什么数据的表示。有时,我们可以按原样使用数据集,但其他时候,你需要对数据进行一些清洗规整以获得原始数据之外的信息。

让我们先用一些样本数据建立一个新的工作簿:

from openpyxl import Workbookfrom openpyxl.chart import BarChart, Referenceworkbook = Workbook()sheet = workbook.active# 创建一些虚拟销售数据rows = [    ["Product", "Online", "Store"],    [1, 30, 45],    [2, 40, 30],    [3, 40, 25],    [4, 50, 30],    [5, 30, 25],    [6, 25, 35],    [7, 20, 40],]for row in rows:    sheet.append(row)

现在我们要开始创建一个显示每个产品销售总数的条形图:

chart = BarChart()data = Reference(worksheet=sheet,                 min_row=1,                 max_row=8,                 min_col=2,                 max_col=3)chart.add_data(data, titles_from_data=True)sheet.add_chart(chart, "E2")workbook.save("chart.xlsx")

下面你可以看到一个非常直接的柱状图,显示电商平台产品销售和线下门店产品销售的区别:

如图所示,图表的左上角是原始数据。在我们的案例中,它是在单元格E2上。

我们再接着尝试创建一个折线图,先改变一下数据:

import randomfrom openpyxl import Workbookfrom openpyxl.chart import LineChart, Referenceworkbook = Workbook()sheet = workbook.active# 创建一些虚拟销售数据样本rows = [    ["", "January", "February", "March", "April",    "May", "June", "July", "August", "September",     "October", "November", "December"],    [1, ],    [2, ],    [3, ],]for row in rows:    sheet.append(row)for row in sheet.iter_rows(min_row=2,                           max_row=4,                           min_col=2,                           max_col=13):    for cell in row:        cell.value = random.randrange(5, 100)

通过上面的代码,我们将生成一些随机数据,关于3种不同产品在一整年的销售情况。

一旦完成,我们可以很容易地用下面的代码创建一个折线图。

chart = LineChart()data = Reference(worksheet=sheet,                 min_row=2,                 max_row=4,                 min_col=1,                 max_col=13)chart.add_data(data, from_rows=True, titles_from_data=True)sheet.add_chart(chart, "C6")workbook.save("line_chart.xlsx")

这是上面这段代码的结果:

这里需要注意的是,我们在添加数据时,参数使用from_rows=True。这个参数让图表是逐行而不是逐列进行绘制。

在示例数据中,我们看到每个产品都有12个数据行(每个月1列)。这就是为什么要使用from_rows的原因。

如果我们不传递这个参数,默认情况下,图表是按列绘制,我们会得到一个逐月的销售比较。

另一个与上述参数变化有关的区别是,我们的Reference现在从第一列开始,min_col=1,而不是第二列。

这个变化是需要的,因为图表默认第一列有标题。

关于图表的样式,还有一些其他的参数我们可以改变。

例如,可以在图表中添加特定的类别。

cats = Reference(worksheet=sheet,                 min_row=1,                 max_row=1,                 min_col=2,                 max_col=13)chart.set_categories(cats)

在保存工作簿之前添加这段代码,我们应该会看到月名而不是数字出现

从代码上来说,这是一个最小的变化。但就电子表格的可读性而言,这让读者更容易打开电子表格并直接理解图表。

另一个可以提高图表可读性的方法是添加一个轴。

我们可以使用属性x_axis和y_axis来实现。

chart.x_axis.title = "Months"chart.y_axis.title = "Sales (per unit)"

这将生成一个像下面这样的电子表格:

正如上图所示,这样的小变化使图表更容易读和理解。

还有一种方法是通过使用Excel的默认ChartStyle属性来设置图表的样式。

在这种情况下,我们需要在1和48之间选择一个数字。根据我们的选择,我们的图表颜色会发生改变。

# 我们可以选择颜色,从1到48里面填一个数字即可chart.style = 24

在上面选择的风格下,所有的线条都有一些橙色的阴影。

没有明确的文档说明每个样式会是什么样的,但这个案例有几个可用样式。

这里有更多的图表类型和自定义可以应用,所以如果我们需要一些特定的格式,我们需要查阅这方面的文档包。

自动化Excel进阶技能之三:将Python数据存储到Excel电子表格

我们演示里如何将Excel电子表格的数据转换为Python类,但现在让我们反过来做。

让我们想象一下,如果我们有一个数据库,并且正在使用一些对象关系映射 (ORM) 将 DB 对象映射到 Python 类中。现在,我们想把这些相同的对象导出到Excel中。

让我们假设以下数据类来表示来自数据库的有关产品销售的数据:

from dataclasses import dataclassfrom typing import List@dataclassclass Sale:    quantity: int@dataclassclass Product:    id: str    name: str    sales: List[Sale]

我们先生成一些随机数据,假设上述类存储在db_classes.py文件中。

import random# Ignore these for now. You'll use them in a sec ;)from openpyxl import Workbookfrom openpyxl.chart import LineChart, Referencefrom db_classes import Product, Saleproducts = []# Let's create 5 productsfor idx in range(1, 6):    sales = []    # Create 5 months of sales    for _ in range(5):        sale = Sale(quantity=random.randrange(5, 100))        sales.append(sale)    product = Product(id=str(idx),                      name="Product %s" % idx,                      sales=sales)    products.append(product)

通过运行这段代码,我们得到5个产品5个月的销售量,每个月的销售量是随机的。

现在,要将其转换为电子表格,然后需要对数据进行迭代,并将其写入到Excel中。

workbook = Workbook()sheet = workbook.active# 先添加列名sheet.append(["Product ID", "Product Name", "Month 1",              "Month 2", "Month 3", "Month 4", "Month 5"])# 写入数据for product in products:    data = [product.id, product.name]    for sale in product.sales:        data.append(sale.quantity)    sheet.append(data)

这可以让我们用来自数据库的一些数据创建一个电子表格。

然而,为什么不利用我们刚学的知识,添加一个图表,更直观地显示这些数据呢?

可以试试下面这样做:

chart = LineChart()data = Reference(worksheet=sheet,                 min_row=2,                 max_row=6,                 min_col=2,                 max_col=7)chart.add_data(data, titles_from_data=True, from_rows=True)sheet.add_chart(chart, "B8")cats = Reference(worksheet=sheet,                 min_row=1,                 max_row=1,                 min_col=3,                 max_col=7)chart.set_categories(cats)chart.x_axis.title = "Months"chart.y_axis.title = "Sales (per unit)"workbook.save(filename="oop_sample.xlsx")

这是一个由数据库对象生成的电子表格,并带有图表和所有的东西。一个由数据库对象生成的电子表格,并带有图表和一切:

实践运用,就是我们学习新知识的最好方法!

自动化Excel进阶技能之四:Pandas与openpyxl双剑合璧

尽管可以使用Pandas来处理Excel文件,但有时候,Pandas完成不了,这时候我们首选openpyxl。

openpyxl可以轻松地使用样式、条件格式等自定义电子表格。

openpyxl既支持将Pandas DataFrame中的数据转换为工作簿,也支持将openpyxl工作簿转换为Pandas DataFrame。

首先要记得安装pandas包:

然后,让我们创建一个示例DataFrame:

import pandas as pddata = {    "Product Name": ["Product 1", "Product 2"],    "Sales Month 1": [10, 20],    "Sales Month 2": [5, 35],}df = pd.DataFrame(data)

现在我们已经有了一些数据,你可以使用.dataframe_to_rows()将其从DataFrame转换为工作表。

from openpyxl import Workbookfrom openpyxl.utils.dataframe import dataframe_to_rowsworkbook = Workbook()sheet = workbook.activefor row in dataframe_to_rows(df, index=False, header=True):    sheet.append(row)workbook.save("pandas.xlsx")

我们会看到下图的Excel:

如果我们想添加DataFrame的索引,你可以改变index=True,它就会把每一行的索引添加到我们的Excel电子表格中。

另一方面,如果我们想把电子表格转换成DataFrame,这里有很直接的方法,比如这样做:

import pandas as pdfrom openpyxl import load_workbookworkbook = load_workbook(filename="sample.xlsx")sheet = workbook.activevalues = sheet.valuesdf = pd.DataFrame(values)

另外,如果我们想添加正确的标题,并使用review ID作为索引,那么我们也可以这样做来代替:

import pandas as pdfrom openpyxl import load_workbookfrom mapping import REVIEW_IDworkbook = load_workbook(filename="sample.xlsx")sheet = workbook.activedata = sheet.values# 将第一行设置为DataFrame的列。cols = next(data)data = list(data)# 设置字段 "review_id "作为每行的索引。idx = [row[REVIEW_ID] for row in data]df = pd.DataFrame(data, index=idx, columns=cols)

使用索引和列可以让我们轻松地从我们的DataFrame中访问数据。

>>> df.columnsIndex(['marketplace', 'customer_id', 'review_id', 'product_id',       'product_parent', 'product_title', 'product_category', 'star_rating',       'helpful_votes', 'total_votes', 'vine', 'verified_purchase',       'review_headline', 'review_body', 'review_date'],      dtype='object')>>> # 获得前10个评论的星级评价>>> df["star_rating"][:10]R3O9SGZBVQBV76    5RKH8BNC3L5DLF     5R2HLE8WKZSU3NL    2R31U3UH5AZ42LL    5R2SV659OUJ945Y    4RA51CP8TR5A2L     5RB2Q7DLDN6TH6     5R2RHFJV0UYBK3Y    1R2Z6JOQ94LFHEP    5RX27XIIWY5JPB     4Name: star_rating, dtype: int64>>> # 使用索引找到 "R2EQL1V1L6E0C9 "的评论>>> df.loc["R2EQL1V1L6E0C9"]marketplace               UScustomer_id         15305006review_id     R2EQL1V1L6E0C9product_id        B004LURNO6product_parent     892860326review_headline   Five Starsreview_body          Love itreview_date       2015-08-31Name: R2EQL1V1L6E0C9, dtype: object

好了,不管我们是想用openpyxl来美化我们的Pandas数据集,还是想用Pandas来做一些核心的代数,我们已经掌握了在pandas和openpyxl之间自由切换了。

关注我们,了解后续更新。

npoi生成的表格数字左上角_如何用openpyxl自动化编写Excel电子表格 进阶篇 下相关推荐

  1. asp.net添加删除表格_如何用openpyxl自动化编写Excel电子表格

    有很多不同的东西你可以写到电子表格,从简单的文本或数字值到复杂的公式,图表,甚至图像. 创建一个简单的电子表格 之前,大家看到了一个非常快速的例子,就是如何将 "Hello world!&q ...

  2. matlab画立体仓库库位图_仓库货物库位图在Excel电子表格中的设计与实现

    人工智能及识别技术 1 引言 Excel 电子表格是微软公司出品的 Office 系列办公软件中 的一个组件,可以用来制作电子表格 . 完成许多复杂的数据 运算,进行数据的分析和预测并且具有强大的制作 ...

  3. python随机生成100内的10个整数_用python随机生成数字教程_如何用Python编程随机产生10个随机整数,并输出这10个整数的和�9�3...

    如何用Python编程随机产生10个随机整数,并输出这10个整数的和 用Python编程产生10个随机整数,并整数的和,方法如下 准备材料python.电脑 1.需要加载的模块是:random. 2. ...

  4. python随机生成两个一维数组_如何用python随机产生一个一维数组

    一.使用random模块生成随机数组 python的random模块中有一些生成随机数字的方法,例如random.randint, random.random, random.uniform, ran ...

  5. python脚本编写_如何用Python包编写一个简单的脚本,表达你对父母的爱?

    全文共2800字,预计学习时长6分钟 在繁忙的工作生活中,我们经常忘记给所爱的人发WhatsApp.本教程将使用Python包Twilio编写一个简单的Python脚本来发送WhatsApp消息.我们 ...

  6. 摄像头 保存到外网服务器_【小喵科技】人工智能插件进阶篇:使用多个摄像头...

    关注KittenBot公众号,学习活动两不误~ 这次双十二,你可能需要知道的几件事!!!(有更新)1 KOI离线人工智能模块(长视频)释出~ 2 喵家灵动徽章双十二上线! 3 Kittenblock1 ...

  7. mysql 集合 思想_面向集合的思维编写SQL(第九篇 --- “我说的是:苹果柿子李子栗子梨的那个橘子啊”)...

    max:屏幕前的同学,这个时候还在天善智能看博文,肯定是单身狗吧... 猿同学:520是什么鬼,我的世界只有1024... 大家好,距离上篇(面向集合的思想编写SQL的第八篇)已经过去N多个月了... ...

  8. mysql导出七张表成dtf文件_如何用Java实现把excel表中的数据导入到mysql数据库已有的表中?...

    展开全部 java 读excel 还是比较方便简单的,原理就是,先用java 读取excel,然后,一行行的写入数据库,字段的话32313133353236313431303231363533e4b8 ...

  9. python线程池阻塞队列_福利又来啦!python多线程进阶篇

    使用Python中的线程模块,能够同时运行程序的不同部分,并简化设计.如果你已经入门Python,并且想用线程来提升程序运行速度的话,希望这篇教程会对你有所帮助. 通过阅读本文,你将了解到:什么是死锁 ...

最新文章

  1. stitching detail输出的dot图含义
  2. My first Blog
  3. Bag of Word
  4. TiDB 官方设计文档翻译(三)
  5. LightOJ 1259 Goldbach`s Conjecture 素数打表
  6. Yarn申请的内存的精确计算(转载+应用到自己的情况中)
  7. STM32项目(六)—— 中文电子捡货标签
  8. Entityframework core 动态添加模型实体
  9. java经典编程练习题_java笔试经典练习题及答案
  10. Linux开机启动过程分析
  11. 数值积分——梯形公式和Simpson公式
  12. C语言 第六章 多重循环
  13. 【音频特征】语音特征小结
  14. mui-app开发之项目类型概览
  15. (转)Linux下管道的原理
  16. 什么是业务中台、数据中台、技术中台?这回终于解释清楚了
  17. 用c语言写出变色的心形图案
  18. 3d Max 一些操作技巧
  19. 相机分辨率、图片分辨率、像素及图片尺寸关系的思考
  20. (转)Win10上安装任意版本的.net framework

热门文章

  1. 根据Word表格自动生成SQL数据库脚本的VBScript代码
  2. js rsa解密中文乱码_建议收藏 | 最全的 JS 逆向入门教程合集
  3. java的按钮点击事件_[转载]java处理按钮点击事件
  4. python 股票指标库talib_股票指标库 TA-Lib 安装方法
  5. 1.6 Dropout 正则化-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授
  6. u-boot分析之两阶段代码分析(三)
  7. 01、DFT-全面了解如何测试一颗芯片
  8. matlab 读取nc
  9. WPF-3D动效-文字球形环绕
  10. swift SDWebImage 与 UIButton 出现的细节bug 不显示