4.6 数据结构
1.一维数据
python的列表,可以和Excel中的行列进行数据交换,python中的一维列表,在Excel中默认为一行数据。
import?xlwings?as?xw
sht=xw.sheets.active
#?将1,2,3分别写入了A1,B1,C1单元格中 sht.range('A1').value=[1,2,3]
#?将A1,B1,C1单元格的值存入list1列表中 list1=sht.range('A1:C1').value
#?将1,2,3分别写入了A1,A2,A3单元格中 sht.range('A1').options(transpose=True).value=[1,2,3]
#?将A1,A2,A3单元格中值存入list1列表中 list1=sht.range('A1:A3').value
2.二维数据
python的二维列表,可以转换为Excel中的行列。二维列表,即列表中的元素还是列表。在Excel中,二维列表中的列表元素,代表Excel表格中的一列。例如:
#?将a1,a2,a3输入第一列,b1,b2,b3输入第二列 list1=[[‘a1’,'a2','a3'],['b1','b2','b3']] sht.range('A1').value=list1
#?将A1:B3的值赋给二维列表list1 list1=sht.range('A1:B3').value
3.Excel中区域的选取表格
#?选取第一列 rng=sht.?range('A1').expand('down') rng.value=['a1','a2','a3']
想看更多视频教程课加任姐姐VX,免费领取哦
#?选取第一行 rng=sht.range('A1').expand('right') rng=['a1','b1']
#?选取表格 rng.sht.range('A1').expand('table') rng.value=[[‘a1’,'a2','a3'],['b1','b2','b3']]
4.7 xlwings生成图表
import?xlwings?as?xw app?=?xw.App() wb?=?app.books.active sht?=?wb.sheets.active
chart?=?sht.charts.add(100,?10)??# 100, 10?为图表放置的位置坐标。以像素为单位。 chart.set_source_data(sht.range('A1').expand())??#?参数为表格中的数据区域。 # chart.chart_type = i ??????????????#?用来设置图表类型,具体参数件下面详细说明。 chart.api[1].ChartTitle.Text?=?i??????????#?用来设置图表的标题。
示例代码:
import?xlwings?as?xw app?=?xw.App() wb?=?app.books.active sht?=?wb.sheets.active #?生成图表的数据 sht.range('A1').value?=?[['时间',?'数量'],?['1日',?2],?['2日',?1],?['3日',?3] ?????????????,?['4日',?4],?['5日',?5],?['6日',?6]] """图表类型参数,被注释的那几个,无法生成对应的图表""" dic?=?{ ??'3d_area':?-4098, ??'3d_area_stacked':?78, ??'3d_area_stacked_100':?79, ??'3d_bar_clustered':?60, ??'3d_bar_stacked':?61, ??'3d_bar_stacked_100':?62, ??'3d_column':?-4100, ??'3d_column_clustered':?54, ??'3d_column_stacked':?55, ??'3d_column_stacked_100':?56, ??'3d_line':?-4101, ??'3d_pie':?-4102, ??'3d_pie_exploded':?70, ??'area':?1, ??'area_stacked':?76, ??'area_stacked_100':?77, ??'bar_clustered':?57, ??'bar_of_pie':?71, ??'bar_stacked':?58, ??'bar_stacked_100':?59, ??'bubble':?15, ??'bubble_3d_effect':?87, ??'column_clustered':?51, ??'column_stacked':?52, ??'column_stacked_100':?53, ??'cone_bar_clustered':?102, ??'cone_bar_stacked':?103, ??'cone_bar_stacked_100':?104, ??'cone_col':?105, ??'cone_col_clustered':?99, ??'cone_col_stacked':?100, ??'cone_col_stacked_100':?101, ??'cylinder_bar_clustered':?95, ??'cylinder_bar_stacked':?96, ??'cylinder_bar_stacked_100':?97, ??'cylinder_col':?98, ??'cylinder_col_clustered':?92, ??'cylinder_col_stacked':?93, ??'cylinder_col_stacked_100':?94, ??'doughnut':?-4120, ??'doughnut_exploded':?80, ??'line':?4, ??'line_markers':?65, ??'line_markers_stacked':?66, ??'line_markers_stacked_100':?67, ??'line_stacked':?63, ??'line_stacked_100':?64, ??'pie':?5, ??'pie_exploded':?69, ??'pie_of_pie':?68, ??'pyramid_bar_clustered':?109, ??'pyramid_bar_stacked':?110, ??'pyramid_bar_stacked_100':?111, ??'pyramid_col':?112, ??'pyramid_col_clustered':?106, ??'pyramid_col_stacked':?107, ??'pyramid_col_stacked_100':?108, ??'radar':?-4151, ??'radar_filled':?82, ??'radar_markers':?81, ??#?'stock_hlc':?88, ??#?'stock_ohlc':?89, ??#?'stock_vhlc':?90, ??#?'stock_vohlc':?91, ??#?'surface':?83, ??#?'surface_top_view':?85, ??#?'surface_top_view_wireframe':?86, ??#?'surface_wireframe':?84, ??'xy_scatter':?-4169, ??'xy_scatter_lines':?74, ??'xy_scatter_lines_no_markers':?75, ??'xy_scatter_smooth':?72, ??'xy_scatter_smooth_no_markers':?73 } w?=?385 h?=?241 n?=?0 x?=?100 y?=?10 for?i?in?dic.keys(): ??xx?=?x?+?n?%?3*w??#?用来生成图表放置的x坐标。 ??yy?=?y?+?n//3*h???#?用来生成图表放置的y坐标。 ??chart?=?sht.charts.add(xx,?yy) ??chart.set_source_data(sht.range('A1').expand()) ??chart.chart_type?=?i ??chart.api[1].ChartTitle.Text?=?i ??n?+=?1 wb.save('chart_图表') wb.close() app.quit()
效果如下:
4.8 实战训练
1. xlwings 新建 Excel 文档
程序示例:
#?3.4.2?xlwings?新建?Excle?文档 def?fun3_4_2(): ????""" ????visible ??? Ture:可见excel ??? False:不可见excel
????add_book ????True:打开excel并且新建工作簿 ??? False:不新建工作簿 ????""" ????app?=?xw.App(visible=True,?add_book=False)
????#?新建工作簿?(如果不接下一条代码的话,Excel只会一闪而过,卖个萌就走了) ????wb?=?app.books.add()
????#?保存工作簿 ????wb.save('example.xlsx')
????#?退出工作簿 ????wb.close()
????#?退出Excel ????app.quit()
执行程序后文件夹增加了“example.xlsx”:
此时表格是空的:
2. xlwings 打开已存在的 Excel 文档
现有表格长这样:
运行程序:
#?3.4.3?xlwings?打开已存在的Excel文件 def?fun3_4_3(): ????#?新建Excle 默认设置:程序可见,只打开不新建工作薄,屏幕更新关闭 ????app?=?xw.App(visible=True,?add_book=False) ????app.display_alerts?=?False ????app.screen_updating?=?False
????#?打开已存在的Excel文件 ????wb=app.books.open('./3_4?xlwings?修改操作练习.xlsx')
????#?保存工作簿 ????wb.save('example_2.xlsx')
????#?退出工作簿 ????wb.close()
????#?退出Excel ????app.quit()
生成新的表格:
内容如下:
3. xlwings 读写 Excel
程序示例:
#??3.4.4?xlwings读写?Excel def?fun3_4_4(): ????#?新建Excle 默认设置:程序可见,只打开不新建工作薄,屏幕更新关闭 ????app?=?xw.App(visible=True,?add_book=False) ????app.display_alerts?=?False ????app.screen_updating?=?False
????#?打开已存在的Excel文件 ????wb=app.books.open('./3_4?xlwings?修改操作练习.xlsx')
????#?获取sheet对象 ????print(wb.sheets) ????sheet?=?wb.sheets[0] ????#?sheet?=?wb.sheets["sheet1"]
????#?读取Excel信息 ????cellB1_value?=?sheet.range('B1').value ????print("单元格B1内容为:",cellB1_value)
????#?清除单元格内容和格式 ????sheet.range('A1').clear()
????#?写入单元格 ????sheet.range('A1').value?=?"xlwings写入"
????#?保存工作簿 ????wb.save('example_3.xlsx')
????#?退出工作簿 ????wb.close()
????#?退出Excel ????app.quit()
执行效果:
?想看更多视频教程课加任姐姐VX,免费领取哦
5. Python openpyxl 读取 写入 修改 操作Excel
在openpyxl中,主要用到三个概念:Workbooks,Sheets,Cells。
-
Workbook就是一个excel工作表; -
Sheet是工作表中的一张表页; -
Cell就是简单的一个格。
openpyxl就是围绕着这三个概念进行的,不管读写都是“三板斧”:打开Workbook,定位Sheet,操作Cell。
官方文档:https://openpyxl.readthedocs.io/en/stable/
官方示例:
from?openpyxl?import?Workbook wb?=?Workbook()
#?grab?the?active?worksheet ws?=?wb.active
#?Data?can?be?assigned?directly?to?cells ws['A1']?=?42
#?Rows?can?also?be?appended ws.append([1,?2,?3])
#?Python?types?will?automatically?be?converted import?datetime ws['A2']?=?datetime.datetime.now()
#?Save?the?file wb.save("sample.xlsx")
5.1 openpyxl 基本操作
1.安装
pip?install?openpyxl
因为我已经安装,所以提示如下信息:
2.打开文件
(1)新建
from??openpyxl?import??Workbook? #?实例化 wb?=?Workbook() #?激活?worksheet ws?=?wb.active
(2)打开已有
from?openpyxl??import?load_workbook
wb?=?load_workbook('文件名称.xlsx')
3.写入数据
#?方式一:数据可以直接分配到单元格中(可以输入公式) ws['A1']?=?42 #?方式二:可以附加行,从第一列开始附加(从最下方空白处,最左开始)(可以输入多行) ws.append([1,?2,?3]) #?方式三:Python 类型会被自动转换 ws['A3']?=?datetime.datetime.now().strftime("%Y-%m-%d")
4.创建表(sheet)
#?方式一:插入到最后(default) ws1?=?wb.create_sheet("Mysheet")? #?方式二:插入到最开始的位置 ws2?=?wb.create_sheet("Mysheet",?0)
5.选择表(sheet)
#?sheet?名称可以作为?key?进行索引 >>>?ws3?=?wb["New?Title"] >>>?ws4?=?wb.get_sheet_by_name("New?Title") >>>?ws?is?ws3?is?ws4 True
6.查看表名(sheet)
#?显示所有表名 >>>?print(wb.sheetnames) ['Sheet2',?'New?Title',??'Sheet1'] #?遍历所有表 >>>?for?sheet?in??wb: ...?????print(sheet.title)
7.访问单元格(cell)
(1)单个单元格访问
#?方法一 >>>?c?=?ws['A4'] #?方法二:row 行;column 列 >>>?d?=?ws.cell(row=4,?column=2,?value=10) #?方法三:只要访问就创建 >>>?for?i?in??range(1,101): ...?????????for?j?in?range(1,101): ...????????????ws.cell(row=i,?column=j)
(2)多个单元格访问
#?通过切片 >>>?cell_range?=?ws['A1':'C2'] #?通过行(列) >>>?colC?=?ws['C'] >>>?col_range?=?ws['C:D'] >>>?row10?=?ws[10] >>>?row_range?=?ws[5:10] #?通过指定范围(行?→?行) >>>?for?row?in??ws.iter_rows(min_row=1,?max_col=3,?max_row=2): ...????for?cell?in??row: ...????????print(cell) <Cell?Sheet1.A1> <Cell?Sheet1.B1> <Cell?Sheet1.C1> <Cell?Sheet1.A2> <Cell?Sheet1.B2> <Cell?Sheet1.C2>? #?通过指定范围(列?→?列) >>>?for?row?in??ws.iter_rows(min_row=1,?max_col=3,?max_row=2): ...????for?cell?in??row: ...????????print(cell) <Cell?Sheet1.A1> <Cell?Sheet1.B1> <Cell?Sheet1.C1> <Cell?Sheet1.A2> <Cell?Sheet1.B2> <Cell?Sheet1.C2> #?遍历所有?方法一 >>>?ws?=?wb.active >>>?ws['C9']?=?'hello?world' >>>?tuple(ws.rows) ((<Cell?Sheet.A1>,?<Cell?Sheet.B1>,?<Cell?Sheet.C1>), (<Cell?Sheet.A2>,?<Cell?Sheet.B2>,?<Cell?Sheet.C2>), ... (<Cell?Sheet.A8>,?<Cell?Sheet.B8>,?<Cell?Sheet.C8>), (<Cell?Sheet.A9>,?<Cell?Sheet.B9>,?<Cell?Sheet.C9>)) #?遍历所有?方法二 >>>?tuple(ws.columns) ((<Cell?Sheet.A1>, <Cell?Sheet.A2>, <Cell?Sheet.A3>, ... <Cell?Sheet.B7>, <Cell?Sheet.B8>, <Cell?Sheet.B9>), (<Cell?Sheet.C1>, ... <Cell?Sheet.C8>, <Cell?Sheet.C9>))
8.保存数据
wb.save('文件名称.xlsx')
9.其它
(1)改变sheet标签按钮颜色
ws.sheet_properties.tabColor?=?"1072BA"?#?色值为RGB16进制值
(2)获取最大行,最大列
#?获得最大列和最大行 print(sheet.max_row) print(sheet.max_column)
(3)获取每一行每一列
#?因为按行,所以返回A1,?B1,?C1这样的顺序 for?row?in?sheet.rows: ????for?cell?in?row: ????????print(cell.value)
#?A1,?A2,?A3这样的顺序 for?column?in?sheet.columns: ????for?cell?in?column: ????????print(cell.value)
(4)根据数字得到字母,根据字母得到数字
from?openpyxl.utils?import?get_column_letter,?column_index_from_string
#?根据列的数字返回字母 print(get_column_letter(2))??#?B #?根据字母返回列的数字 print(column_index_from_string('D'))??#?4
(5)删除工作表
#?方式一 wb.remove(sheet) #?方式二 del?wb[sheet]
(6)矩阵置换
rows?=?[ ????['Number',?'data1',?'data2'], ????[2,?40,?30], ????[3,?40,?25], ????[4,?50,?30], ????[5,?30,?10], ????[6,?25,?5], ????[7,?50,?10]]
list(zip(*rows))
#?out [('Number',?2,?3,?4,?5,?6,?7), ?('data1',?40,?40,?50,?30,?25,?50), ?('data2',?30,?25,?30,?10,?5,?10)]
#?注意?方法会舍弃缺少数据的列(行) rows?=?[ ????['Number',?'data1',?'data2'], ????[2,?40??????],????#?这里少一个数据 ????[3,?40,?25], ????[4,?50,?30], ????[5,?30,?10], ????[6,?25,?5], ????[7,?50,?10], ] #?out [('Number',?2,?3,?4,?5,?6,?7),?('data1',?40,?40,?50,?30,?25,?50)]
?想看更多视频教程课加任姐姐VX,免费领取哦
|