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')

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM