首頁>科技>

這篇文章主要介紹了Python xlrd/xlwt 建立excel檔案及常用操作,幫助大家更好的理解和使用python辦公,感興趣的朋友可以瞭解下

一、建立excel程式碼 備註:封裝好了(可直接呼叫)

"""

-*- coding:utf-8 -*-

@Time :2020/8/20 21:02

@Author :Jarvis

@File :jar_excel_util.py

@Version:1.0

"""

from typing import List

import xlwt

class JarExcelUtil:

def __init__(self, header_list: List[list]):

"""

:param header_list: 如下格式

例1:預設列寬

header_list = [

['序號'], # 表格第0列[此列表頭名稱]

['姓名'],

['性別'],

['愛好'],

['生日']

]

例2:自定義列寬(列寬值為int型別 英文字元長度 如:10 表示列寬為10個英文字元長度)

header = [

['序號', 5], # 表格第0列[此列表頭名稱,列寬]

['姓名', 10], # 表格第1列[此列表頭名稱,列寬]

['性別', 10],

['愛好', 10],

['生日', 20]

]

"""

self.data = header_list

self.__color_str = 'aqua 0x31\r\n\

black 0x08\r\n\

blue 0x0C\r\n\

blue_gray 0x36\r\n\

bright_green 0x0B\r\n\

brown 0x3C\r\n\

coral 0x1D\r\n\

cyan_ega 0x0F\r\n\

dark_blue 0x12\r\n\

dark_blue_ega 0x12\r\n\

dark_green 0x3A\r\n\

dark_green_ega 0x11\r\n\

dark_purple 0x1C\r\n\

dark_red 0x10\r\n\

dark_red_ega 0x10\r\n\

dark_teal 0x38\r\n\

dark_yellow 0x13\r\n\

gold 0x33\r\n\

gray_ega 0x17\r\n\

gray25 0x16\r\n\

gray40 0x37\r\n\

gray50 0x17\r\n\

gray80 0x3F\r\n\

green 0x11\r\n\

ice_blue 0x1F\r\n\

indigo 0x3E\r\n\

ivory 0x1A\r\n\

lavender 0x2E\r\n\

light_blue 0x30\r\n\

light_green 0x2A\r\n\

light_orange 0x34\r\n\

light_turquoise 0x29\r\n\

light_yellow 0x2B\r\n\

lime 0x32\r\n\

magenta_ega 0x0E\r\n\

ocean_blue 0x1E\r\n\

olive_ega 0x13\r\n\

olive_green 0x3B\r\n\

orange 0x35\r\n\

pale_blue 0x2C\r\n\

periwinkle 0x18\r\n\

pink 0x0E\r\n\

plum 0x3D\r\n\

purple_ega 0x14\r\n\

red 0x0A\r\n\

rose 0x2D\r\n\

sea_green 0x39\r\n\

silver_ega 0x16\r\n\

sky_blue 0x28\r\n\

tan 0x2F\r\n\

teal 0x15\r\n\

teal_ega 0x15\r\n\

turquoise 0x0F\r\n\

violet 0x14\r\n\

white 0x09\r\n\

yellow 0x0D'

self.color_list = [] # [[]] [['aqua', '0x31'], ['black', '0x08'], ...]

for color in self.__color_str.split('\r\n'):

color = color.split(' ')

self.color_list.append(color)

def write(self, out_file, data_body: List[list], sheet_name='sheet', frozen_row: int = 1, frozen_col: int = 0):

"""

寫入資料

:param out_file: 儲存檔案(如:test.xlsx)

:param data_body: data_body[0]為表格第0行資料 data_body[0][0]為表格第0行第0列單元格值

:param sheet_name:

:param frozen_row: 凍結行(預設首行)

:param frozen_col: 凍結列(預設不凍結)

"""

# step1 判斷資料正確性(每行列數是否與表頭相同)

count = 0

for pro in data_body:

if len(pro) != len(self.data):

raise Exception(

'data_body資料錯誤 第{}行(從0開始) 需為{}個元素 當前行{}個元素:{}'.format(count, len(self.data), len(pro), str(pro)))

count += 1

# step2 寫入資料

wd = xlwt.Workbook()

sheet = wd.add_sheet(sheet_name)

ali_horiz = 'align: horiz center' # 水平居中

ali_vert = 'align: vert center' # 垂直居中

fore_colour = 'pattern: pattern solid,fore_colour pale_blue' # 設定單元格背景色為pale_blue色

# 表頭格式(垂直+水平居中、表頭背景色)

style_header = xlwt.easyxf('{};{};{}'.format(fore_colour, ali_horiz, ali_vert))

# 表體格式(垂直居中)

style_body = xlwt.easyxf('{}'.format(ali_vert))

# 表頭

for col in self.data:

# 預設列寬

if len(col) == 1:

sheet.write(0, self.data.index(col), str(col[0]), style_header)

# 自定義列寬

if len(col) == 2:

sheet.write(0, self.data.index(col), str(col[0]), style_header)

# 設定列寬

sheet.col(self.data.index(col)).width = 256 * col[1] # 256為基數 * n個英文字元

# 行高(第0行)

sheet.row(0).height_mismatch = True

sheet.row(0).height = 20 * 20 # 20為基數 * 20榜

# 表體

index = 1

for pro in data_body:

sheet.row(index).height_mismatch = True

sheet.row(index).height = 20 * 20 # 20為基數 * 20榜

for d in self.data:

value = pro[self.data.index(d)]

# 若值型別是int、float 直接寫入 反之 轉成字串寫入

if type(value) == int or type(value) == float:

sheet.write(index, self.data.index(d), value, style_body)

else:

sheet.write(index, self.data.index(d), str(value), style_body)

index += 1

# 凍結(列與行)

sheet.set_panes_frozen('1')

sheet.set_horz_split_pos(frozen_row) # 凍結前n行

sheet.set_vert_split_pos(frozen_col) # 凍結前n列

wd.save(out_file)

def color_test(self):

"""

測試顏色

"""

body_t = []

for color in self.color_list:

print(color)

body_t.append(color)

wd = xlwt.Workbook()

sheet = wd.add_sheet('sheet')

index = 0

for b in body_t:

ali = 'align: horiz center;align: vert center' # 垂直居中 水平居中

fore_colour = 'pattern: pattern solid,fore_colour {}'.format(

self.color_list[index][0]) # 設定單元格背景色為pale_blue色

style_header = xlwt.easyxf(

'{};{}'.format(fore_colour, ali))

sheet.write(index, 0, str(b), style_header)

sheet.col(0).width = 256 * 150 # 256為基數 * n個英文字元

index += 1

wd.save('顏色測試.xlsx')

# 測試顏色

# if __name__ == '__main__':

# header_t = [

# ['顏色']

# ]

# JarExcelUtil(header_t).color_test()

if __name__ == '__main__':

header = [

['序號', 5],

['姓名', 10],

['性別', 10],

['愛好', 10],

['生日', 20]

]

# header = [

# ['序號'],

# ['姓名'],

# ['性別'],

# ['愛好'],

# ['生日']

# ]

body = [

[1, '張三', '男', '籃球', '1994-07-23'],

[2, '李四', '女', '足球', '1994-04-03'],

[3, '王五', '男', '兵乓球', '1994-09-13']

]

JarExcelUtil(header_list=header).write(out_file='測試.xlsx', data_body=body)

二、效果

生成的Excel

三、常用操作

3.1、設定行高

# 行高(第0行)

sheet.row(0).height_mismatch = True

sheet.row(0).height = 20 * 20 # 20為基數 * 20榜

3.2、設定列寬

# 列寬(第0列)

sheet.col(0).width = 256 * 30 # 256為基數 * 30個英文字元(約)

3.3、凍結(列與行)

# 凍結(列與行)

sheet.set_panes_frozen('1')

sheet.set_horz_split_pos(2) # 凍結前2行

sheet.set_vert_split_pos(3) # 凍結前3列

# 凍結首行

sheet.set_panes_frozen('1')

sheet.set_horz_split_pos(1) # 凍結前1行(即首行)

3.4、設定單元格對齊方式

# 方式1

style_1 = xlwt.XFStyle()

al_1 = xlwt.Alignment()

al_1.horz = xlwt.Alignment.HORZ_CENTER # 水平居中

al_1.vert = xlwt.Alignment.VERT_CENTER # 垂直居中

style_1.alignment = al_1

sheet.write(0, 0, '第0行第0列單元格值', style_1)

# 方式2(推薦)

ali_horiz = 'align: horiz center' # 水平居中

ali_vert = 'align: vert center' # 垂直居中

style_2 = xlwt.easyxf('{};{}'.format(ali_horiz, ali_vert))

sheet.write(0, 0, '第0行第0列單元格值', style_2)

3.5、設定單元格背景色

# 設定單元格背景色

fore_colour = 'pattern: pattern solid,fore_colour pale_blue' # 設定單元格背景色為pale_blue色 (具體顏色值 參考上面程式碼JarExcelUtil類中的color_test方法的執行結果)

style = xlwt.easyxf('{}'.format(fore_colour))

sheet.write(0, 0, '第0行第0列單元格值', style)

13
最新評論
  • 整治雙十一購物亂象,國家再次出手!該跟這些套路說再見了
  • 手機訊號欄出現“HD”字樣,別大意了,你的話費可能已減少