npoi生成的表格数字左上角_如何用openpyxl自动化编写Excel电子表格 进阶篇 下
自动化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电子表格 进阶篇 下相关推荐
- asp.net添加删除表格_如何用openpyxl自动化编写Excel电子表格
有很多不同的东西你可以写到电子表格,从简单的文本或数字值到复杂的公式,图表,甚至图像. 创建一个简单的电子表格 之前,大家看到了一个非常快速的例子,就是如何将 "Hello world!&q ...
- matlab画立体仓库库位图_仓库货物库位图在Excel电子表格中的设计与实现
人工智能及识别技术 1 引言 Excel 电子表格是微软公司出品的 Office 系列办公软件中 的一个组件,可以用来制作电子表格 . 完成许多复杂的数据 运算,进行数据的分析和预测并且具有强大的制作 ...
- python随机生成100内的10个整数_用python随机生成数字教程_如何用Python编程随机产生10个随机整数,并输出这10个整数的和�9�3...
如何用Python编程随机产生10个随机整数,并输出这10个整数的和 用Python编程产生10个随机整数,并整数的和,方法如下 准备材料python.电脑 1.需要加载的模块是:random. 2. ...
- python随机生成两个一维数组_如何用python随机产生一个一维数组
一.使用random模块生成随机数组 python的random模块中有一些生成随机数字的方法,例如random.randint, random.random, random.uniform, ran ...
- python脚本编写_如何用Python包编写一个简单的脚本,表达你对父母的爱?
全文共2800字,预计学习时长6分钟 在繁忙的工作生活中,我们经常忘记给所爱的人发WhatsApp.本教程将使用Python包Twilio编写一个简单的Python脚本来发送WhatsApp消息.我们 ...
- 摄像头 保存到外网服务器_【小喵科技】人工智能插件进阶篇:使用多个摄像头...
关注KittenBot公众号,学习活动两不误~ 这次双十二,你可能需要知道的几件事!!!(有更新)1 KOI离线人工智能模块(长视频)释出~ 2 喵家灵动徽章双十二上线! 3 Kittenblock1 ...
- mysql 集合 思想_面向集合的思维编写SQL(第九篇 --- “我说的是:苹果柿子李子栗子梨的那个橘子啊”)...
max:屏幕前的同学,这个时候还在天善智能看博文,肯定是单身狗吧... 猿同学:520是什么鬼,我的世界只有1024... 大家好,距离上篇(面向集合的思想编写SQL的第八篇)已经过去N多个月了... ...
- mysql导出七张表成dtf文件_如何用Java实现把excel表中的数据导入到mysql数据库已有的表中?...
展开全部 java 读excel 还是比较方便简单的,原理就是,先用java 读取excel,然后,一行行的写入数据库,字段的话32313133353236313431303231363533e4b8 ...
- python线程池阻塞队列_福利又来啦!python多线程进阶篇
使用Python中的线程模块,能够同时运行程序的不同部分,并简化设计.如果你已经入门Python,并且想用线程来提升程序运行速度的话,希望这篇教程会对你有所帮助. 通过阅读本文,你将了解到:什么是死锁 ...
最新文章
- stitching detail输出的dot图含义
- My first Blog
- Bag of Word
- TiDB 官方设计文档翻译(三)
- LightOJ 1259 Goldbach`s Conjecture 素数打表
- Yarn申请的内存的精确计算(转载+应用到自己的情况中)
- STM32项目(六)—— 中文电子捡货标签
- Entityframework core 动态添加模型实体
- java经典编程练习题_java笔试经典练习题及答案
- Linux开机启动过程分析
- 数值积分——梯形公式和Simpson公式
- C语言 第六章 多重循环
- 【音频特征】语音特征小结
- mui-app开发之项目类型概览
- (转)Linux下管道的原理
- 什么是业务中台、数据中台、技术中台?这回终于解释清楚了
- 用c语言写出变色的心形图案
- 3d Max 一些操作技巧
- 相机分辨率、图片分辨率、像素及图片尺寸关系的思考
- (转)Win10上安装任意版本的.net framework
热门文章
- 根据Word表格自动生成SQL数据库脚本的VBScript代码
- js rsa解密中文乱码_建议收藏 | 最全的 JS 逆向入门教程合集
- java的按钮点击事件_[转载]java处理按钮点击事件
- python 股票指标库talib_股票指标库 TA-Lib 安装方法
- 1.6 Dropout 正则化-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授
- u-boot分析之两阶段代码分析(三)
- 01、DFT-全面了解如何测试一颗芯片
- matlab 读取nc
- WPF-3D动效-文字球形环绕
- swift SDWebImage 与 UIButton 出现的细节bug 不显示