openpyxl模块操作excell表格(1)

 

 

写表格

from datetime import date
from  random import choices,randint
from openpyxl import Workbook,load_workbook
from openpyxl.drawing.image import Image 
from openpyxl.styles import Border,Side ,Font,Alignment,PatternFill
from openpyxl.comments import Comment
from openpyxl.utils import units
from openpyxl.formula.translate import Translator
from openpyxl.worksheet.datavalidation import DataValidation
from openpyxl.styles.fills import GradientFill
from openpyxl.worksheet.table import Table,TableStyleInfo
from openpyxl.chart import BarChart,PieChart,Reference
from openpyxl.worksheet.header_footer import _HeaderFooterPart
from openpyxl.chart.series import DataPoint

wb = Workbook() # 创建空白工作簿,
                # 如果设置参数write_only = True 只写模式,可以提高读写速率
                # 但是该参数使得空白工作簿中不包含任何工作表
                # 如果不设置参数,空白工作簿中会包含一个空的表格
                # 查看全部工作表的标题

print(wb.sheetnames)
defaultws = wb.worksheets[0]# 可以使用序号做下标定位工作表
print(defaultws)
defaultws.title ='表格标题' #设置工作表的标题
defaultws.sheet_properties.tabColor='88cc88' #设置工作表选型卡的颜色
ws1 = wb.create_sheet('第一个',0)  #创建工作表时直接指定标题, 0 表时第一个位置
ws2 = wb.create_sheet('最后一个')
ws3 = wb.create_sheet('倒数第二个',-1)# -1 表时倒数第二个位置插入工作表
ws = wb.active  # 获取活动工作表
ws.sheet_properties.tabColor='ff6666'
wb['倒数第二个'].sheet_properties.tabColor='3333cc'#也可以使用标题做下标直接定位工作表
ws['A1']= '单元格文字' # 使用下标定位单元格,如果设置了write_only = True ,不能使用这种形式
ws['A1'].font = Font(name='华文行楷',# 设置单元格的字体
                    size=36,        #设置单元格的字体大小
                    bold=True,    #加粗
                    italic=False,   #不斜体
                    underline='none',#不加下划线
                    strike=True,    #加删除线
                    color='FFaa8844')#单元格文本颜色


ws['A1'].alignment = Alignment(horizontal='center',#设置单元格对齐方式
                            vertical='bottom',
                            text_rotation=30,#文字旋转30度
                            wrap_text=True,
                            shrink_to_fit=False,
                            indent=0)

ws['A2']=3.14

ws['A2'].fill = GradientFill(type='linear',#使用简便颜色填充单元格
                            stop=('00ffff','ff0000'))#设置渐变色的开始颜色和结束颜色

ws['A2'].border = Border(left=Side(style='medium',color='FF000000'),#设置单元格边框
                        right=Side(style='double',color='00ff0000'),
                        top=Side(style='thick',color='ff00ff00'),
                        bottom=Side(style='thick',color='ff00ff00'))

ws["A3"] = date.today()  #写入日期
ws['A3'].fill = GradientFill(type='linear',#设置固定颜色填充单元格背景颜色
                            stop=('888888','888888'))

ws.cell(row=1,column=4,value="=SUM(A1,A2)")#行列下标都是从1开始
                                            #write_only =True 的只写模式不允许使用cell()方法

ws['D1'].comment = Comment(text='注释内容',author='ztx_taylor')#为单元格设置注释
ws['D1'].comment.width = units.points_to_pixels(100)#设置注释宽度和高度
ws['D1'].comment.height = units.points_to_pixels(20)#设置注释宽度和高度


#访问B,C 列所有的单元格,此时只有3行,由前面写入操作决定的
for column in ws['B':'C']:#切片的是闭区间
    for cell in column:
        cell.value = 'BC'

#访问第4行所有单元格, 只有4列,由前面的写入操作决定
for cell in ws[4]:
    cell.value = 4

#访问第5行到第8行的所有单元格, 只有4列,由前面的写入操作决定的
for row in ws[5:8]:
    for cell in row:
        cell.value = 58
ws.append(range(10))#在后面追加已返, write_only =True 的只写模式循序使用这种方式加行
ws.append(['a','b','c','d','e'])#在追加一行

#打开图片文件
# img = Image('E:\旅游图片\图片素材\\789899.jpg')

# # print(dir(img))
# # img.height //=3
# # img.width //=3
# ws.column_dimensions['A'].width = 30.0#设置单元格宽
# ws.row_dimensions[11].height = 40.0#设置单元格高度

# ws.add_image(img,"A11")


#设置选择框
#为工作表中的单元格添加验证规则
dv = DataValidation(type='list', #约束单元格内容必须在列表中选择
                    formula1='"red,green,blue"',
                    allow_blank=True)

dv.error = '内容不再清单中'
dv.errorTitle = '无效的输入'
dv.prompt = '请在清单中选择'
dv.promptTitle = '请选择1'

c1= ws["A12"]
dv.add(c1)#设置验证的单元格范围

ws.add_data_validation(dv)#在工作表中添加验证


#设置限制输入的数字大小
dv = DataValidation(type='whole',
                    operator='greaterThan',
                    formula1=100)
dv.error = '必须输入大于100的整数'
dv.errorTitle='无效输入'
A13= ws["A13"]
dv.add(A13)
ws.add_data_validation(dv)


#输入介于0和1之间的实数,type还可以是date  time等
dv = DataValidation(type='decimal',
                    operator='between',
                    formula1=0,formula2=1)
dv.error = '必须输入介于0和1之间的实数'
dv.errorTitle= '无效输入'
A14 = ws['A14']
dv.add(A14)
ws.add_data_validation(dv)


dv = DataValidation(type='textLength', #长度内容必须小于等于8,
                    operator='lessThanOrEqual',#operation 的值可以是,between, notEqual,greaterThanOrEqual,
                        #lessThan, notBetween, lessThanOrEqual, equal , greaterThan
                    formula1=8)
dv.error = '长度内容必须小于等于8'
dv.errorTitle= '无效输入'
A15 = ws['A15']
dv.add(A15)
ws.add_data_validation(dv)

ws2.merge_cells('A2:D4')#合并单元格的两种方式
ws2.merge_cells(start_row=5,start_column=1,end_row=8,end_column=6)

ws2['A10'].value='A10'
ws2['A11']='A11'
ws2['B10'].value='B10'
ws2['B11'].value='B11'

#一下的使用方法在openpyxl版本在2.5版本以上的才可以用
# ws2.insert_cols(2)  #在第二列插入一列
# ws2.insert_rows(11,2)#在第十一行的 位置插入2行
# ws2.delete_cols(2,2)#从第二列开始连续删除2列
# ws2.delete_rows(12,2)#从第11列开始删除连续的2列

# ws3.row_dimensions.group(3,10,hidden=True)

defaultws.append(list(map(lambda i :"第{}列".format(i),range(1,11)))+['求和'])
defaultws.append(choices(range(10,50),k=10))
defaultws['K2'] = "=SUM(A2:J2)"
for i in range(3,7):
    defaultws.append(choices(range(10,50),k=10))
    position = 'K'+str(i)
    # 转换公式,相当于在表格中选中单元格向下拉
    defaultws[position] = Translator(defaultws['K2'].value,
    origin='K2').translate_formula(position)
chart = BarChart()#创建柱状图
chart.add_data(Reference(defaultws,#指定工作表中用来创建柱状图的单元格区域
                    min_col=1,min_row=1,max_col=10,max_row=6),
                    titles_from_data=True)#单元格区域第一行内容用于图例中的文本标签
chart.height *=1.2
chart.width *=1.2
defaultws.add_chart(chart,'A12')



#创建饼图
chart =PieChart()#创建饼图,使用第一行前6列作为标签,第二列前6列作为数据
chart.add_data(Reference(defaultws,min_col=1,min_row=2,max_col=6),
                        from_rows=True, #这一行很关键,默认值为Fales 是要求标签和数据是纵向的
                        titles_from_data=False)
chart.set_categories(Reference(defaultws,min_col=1,min_row=1,max_col=6))
defaultws.add_chart(chart,'L1')


for i in range(25,31):
    position = 'A' + str(i)
    defaultws[position].value=position
    defaultws['B'+str(i)] = randint(1,100)
chart = PieChart()
lables= Reference(defaultws,range_string='默认!A25:A30')#设置区域和min_col  min_row 等价
data = Reference(defaultws,range_string='moren!B25:B30')
chart.add_data(data,titles_from_data=False)
chart.dataLabels
chart.title = '饼状图'
chart.width //=1.5
chart.set_categories(lables)

#让第一块和第三块饼图远离圆心
chart.series[0].data_points = [DataPoint(idx=0,explosion=20),# idx表示饼图中扇形
                                DataPoint(idx=2,explosion=30)]
defaultws.add_chart(chart,'D25')


#判断目录下时候存在要保存的文件,有就删除重新生成
import os
path1 = 'F:\my_pythontest\sssss.xlsx'
if os.path.exists(path1):
    os.remove(path1)
    wb.save('sssss.xlsx')
else:
    wb.save('sssss.xlsx')

  

posted @ 2019-12-12 23:58  taysem  阅读(1493)  评论(0编辑  收藏  举报