知乎专栏 |
https://openpyxl.readthedocs.io/en/stable/
from openpyxl import Workbook workbook = Workbook() sheet = workbook.active workbook.save('netkiller.xlsx')
sheet = workbook.active 会创建一个工作表,默认名字是 Sheet 修改方法是 sheet.title = 'netkiller'
from openpyxl import Workbook workbook = Workbook() sheet = workbook.active # 重命名工作表 sheet.title = 'netkiller' workbook.save('openpyxl.xlsx')
from openpyxl import Workbook # 默认工作表 workbook = Workbook() worksheet = workbook.active worksheet.title = 'Windows' # 创建新工作表,后面的参数0表示表示在工作表中的位置,0是第一位。 worksheet1 = workbook.create_sheet("MacOS", 0) worksheet2 = workbook.create_sheet("Linux") workbook.save('worksheet.xlsx')
from openpyxl import Workbook, load_workbook workbook = load_workbook('worksheet.xlsx') print('输出文件所有工作表名:', workbook.sheetnames) # 遍历查看当前 Excel 文档所有工作表名称 for sheet in workbook: print(sheet.title)
from openpyxl import Workbook workbook = Workbook() worksheet = workbook.active worksheet.title = '员工表' # 向单元格写入数据 worksheet['A1'] = '姓名' worksheet['B1'] = '性别' worksheet.cell(row=2, column=1, value='景峯') worksheet.cell(row=2, column=2, value='男') worksheet.cell(row=3, column=1, value='小明') worksheet.cell(row=3, column=2, value='男') worksheet.cell(row=3, column=1, value='小梅') worksheet.cell(row=3, column=2, value='女') workbook.save('cell.xlsx')
追加数据
import datetime import random from openpyxl import Workbook wb = Workbook() # grab the active worksheet ws = wb.active # Data can be assigned directly to cells ws['A1'] = '数据测试表' # Rows can also be appended for i in range(10): ws.append([random.randint(1, 10), random.randint( 1, 10), random.randint(1, 10)]) # Python types will automatically be converted ws['A12'] = "创建日期" ws['B12'] = datetime.datetime.now() # Save the file wb.save("sample.xlsx")
from openpyxl import Workbook workbook = Workbook() worksheet = workbook.active worksheet.title = '员工表' # 向单元格写入数据 worksheet['A1'] = '姓名' worksheet['B1'] = '性别' worksheet.cell(row=2, column=1, value='景峯') worksheet.cell(row=2, column=2, value='男') worksheet.cell(row=3, column=1, value='小明') worksheet.cell(row=3, column=2, value='男') worksheet.cell(row=3, column=1, value='小梅') worksheet.cell(row=3, column=2, value='女') workbook.save('cell.xlsx') # 获取表有多少列 print('输出文件所有工作表名:', worksheet.max_column) # 获取表中最多有多少行 print('输出文件所有工作表名:', worksheet.max_row)
# 读取 col0 = worksheet['A1'] col1 = worksheet.cell(row=1, column=2) # print(c, c1) print(col0.value, col1.value)
读取行列数据
import datetime import random from openpyxl import Workbook wb = Workbook() ws = wb.active # Data can be assigned directly to cells ws['A1'] = '序列号' ws['B1'] = '随机数列A' ws['C1'] = '随机数列B' ws['D1'] = '随机数列C' # Rows can also be appended for i in range(10): ws.append([i+1, random.randint(1, 10), random.randint( 1, 10), random.randint(1, 10)]) # Python types will automatically be converted ws['A12'] = "合计" ws['B12'] = "=SUM(B2:B11)" ws['C12'] = "=SUM(C2:C11)" ws['D12'] = "=SUM(D2:D11)" # 获取指定单元格数据 a3 = ws['A1'] print(a3.value) print(("-" * 10) + "获取A列数据" + ("-" * 10)) # 获取指定一列数据 columns = ws['A'] for i in columns: print(i.value) print(("-" * 10) + "获取第3行数据" + ("-" * 10)) # 获取一行数据 rows = ws[3] for i in rows: print(i.value, sep=',') print() print(("-" * 10) + "iter_rows方法演示" + ("-" * 10)) # 获取数据库 for row in ws.iter_rows(min_row=1, max_col=2, max_row=ws.max_row-1): for cell in row: print(cell.value, end="\t") print() print(("-" * 10) + "遍历工作表" + ("-" * 10)) for row in ws.values: for value in row: print(value, end="\t") print() # Save the file # wb.save("formulae.xlsx")
from openpyxl.workbook import Workbook wb = Workbook() ws = wb.active ws.merge_cells('A2:D2') ws.unmerge_cells('A2:D2') # or equivalently ws.merge_cells(start_row=2, start_column=1, end_row=4, end_column=4) ws.unmerge_cells(start_row=2, start_column=1, end_row=4, end_column=4)
日期格式化
import datetime from openpyxl import Workbook wb = Workbook() ws = wb.active # set date using a Python datetime ws['A1'] = datetime.datetime(2010, 7, 21) print(ws['A1'].number_format) 'yyyy-mm-dd h:mm:ss'
import datetime import random from openpyxl import Workbook wb = Workbook() ws = wb.active # Data can be assigned directly to cells ws['A1'] = '序列号' ws['B1'] = '随机数列A' ws['C1'] = '随机数列B' ws['D1'] = '随机数列C' # Rows can also be appended for i in range(10): ws.append([i+1, random.randint(1, 10), random.randint( 1, 10), random.randint(1, 10)]) # Python types will automatically be converted ws['A12'] = "合计" ws['B12'] = "=SUM(B2:B11)" ws['C12'] = "=SUM(C2:C11)" ws['D12'] = "=SUM(D2:D11)" # Save the file wb.save("formulae.xlsx")
from openpyxl import Workbook from openpyxl.drawing.image import Image wb = Workbook() ws = wb.active ws['A1'] = 'You should see three logos below' # create an image img = Image('logo.png') # add to worksheet and anchor next to cells ws.add_image(img, 'A1') wb.save('logo.xlsx')
# 将整个表的行高设置为 50,列宽设置为 30; sheet.row_dimensions.height = 50 sheet.column_dimensions.width = 30
# 设置第 1 行的高度 sheet.row_dimensions[1].height = 50 # 设置 B 列的宽度 sheet.column_dimensions["B"].width = 20
""" name: 字体名称 color: 颜色通常是RGB或aRGB十六进制值 b(bold): 加粗(bool) i(italic): 倾斜(bool) shadow: 阴影(bool) underline: 下划线(‘doubleAccounting’, ‘single’, ‘double’, ‘singleAccounting’) charset: 字符集(int) strike: 删除线(bool) """
from openpyxl import Workbook from openpyxl.styles import Font workbook = Workbook() worksheet = workbook.active fontStyle = Font(size="18") worksheet.cell(row=1, column=1, value='《Netkiller Python 手札》').font = fontStyle worksheet.merge_cells('A1:E1') worksheet.cell(row=2, column=1, value='作者:netkiller').font = Font( name='黑体', color='FF4433', size=15, b=False) workbook.save('font.xlsx')
from openpyxl.styles import PatternFill, GradientFill from openpyxl import Workbook workbook = Workbook() worksheet = workbook.active # 填充单元格颜色 worksheet["A1"].fill = PatternFill(fill_type="solid", fgColor="99ccff") worksheet.merge_cells('A1:E1') # 填充单元格渐变色 worksheet["A3"].fill = GradientFill(stop=("FFFFFF", "99ccff", "000000")) worksheet.merge_cells('A3:E3') workbook.save(filename="fill.xlsx")
from openpyxl import Workbook from openpyxl.styles import Font, Alignment, PatternFill workbook = Workbook() worksheet = workbook.active worksheet.title = '员工表' # 在第一行插入新的一行作为表头 worksheet.insert_rows(1) # 设置文本标题 worksheet['A1'] = '《Netkiller Python 手札》' # 水平跨列合并单元格 worksheet.merge_cells('A1:E1') # 设置样式 style = worksheet['A1'] # 设置字体 font = Font(name='黑体', color='555555', size=15, b=True) style.font = font # 设置文本对齐 align = Alignment(horizontal='center', vertical='center') """ horizontal:水平对齐('centerContinuous', 'general', 'distributed', 'left', 'fill', 'center', 'justify', 'right') vertical:垂直对齐('distributed', 'top', 'center', 'justify', 'bottom') """ style.alignment = align # 设置图案填充 fill = PatternFill('solid', fgColor='FFAABB') style.fill = fill workbook.save('style.xlsx')
from openpyxl.styles import Side, Border, Alignment, Font, PatternFill, NamedStyle, colors from openpyxl import Workbook from openpyxl.utils import get_column_letter import random workbook = Workbook() worksheet = workbook.active worksheet['A1'] = '数据测试表' worksheet.merge_cells('A1:E1') worksheet['A2'] = '序号' worksheet['B2'] = 'A列' worksheet['C2'] = 'B列' worksheet['D2'] = 'C列' worksheet['E2'] = '合计' # Rows can also be appended for i in range(1, 10): worksheet.append([i, random.randint(1, 10), random.randint( 1, 10), random.randint(1, 10), "=SUM(B{}:D{})".format(i+2, i+2)]) # Python types will automatically be converted worksheet['A12'] = "合计" worksheet['B12'] = "=SUM(B2:B11)" worksheet['C12'] = "=SUM(C2:C11)" worksheet['D12'] = "=SUM(D2:D11)" worksheet['E12'] = "=SUM(E2:E11)" # worksheet['B12'] = datetime.datetime.now() # 字体 fontTitle = Font(name='黑体', size=18, b=True) fontHeader = Font(name='黑体', size=11, b=True) # 边框 thin = Side(style='thin', color='000000') # 细边框 medium = Side(style='medium', color=colors.BLACK) # 粗边框 titleBorder = Border(top=medium, bottom=medium, left=medium, right=medium) headerBorder = Border(top=medium, bottom=thin, left=thin, right=thin) bodyBorder = Border(top=thin, bottom=thin, left=thin, right=thin) # 最外边粗边框 tableTopBorder = Border(top=medium) tableRightBorder = Border(right=medium) tableBottomBorder = Border(bottom=medium) tableLeftBorder = Border(left=medium) # 单元格填充颜色 titlePatternFill = PatternFill('solid', fgColor='CFCFCF') headerPatternFill = PatternFill('solid', fgColor='EEEEEE') # 对齐 alignment = Alignment(horizontal='center', vertical='center') # 将样式打包命名 titleNamedStyle = NamedStyle(name='titleNamedStyle', font=fontTitle, fill=titlePatternFill, alignment=alignment) # border=titleBorder, # 表头样式 headerNamedStyle = NamedStyle( name='headerNamedStyle', font=fontHeader, fill=headerPatternFill, alignment=alignment, border=headerBorder) headerLeftNamedStyle = NamedStyle( name='headerLeftNamedStyle', font=fontHeader, fill=headerPatternFill, alignment=alignment, border=tableLeftBorder+tableTopBorder) headerRightNamedStyle = NamedStyle( name='headerRightNamedStyle', font=fontHeader, fill=headerPatternFill, alignment=alignment, border=tableRightBorder+tableTopBorder) bodyNamedStyle = NamedStyle( name='bodyNamedStyle', font=fontHeader, border=bodyBorder, alignment=alignment) # 读取数据表格范围 rows = worksheet.max_row cols = worksheet.max_column worksheet['A1'].style = titleNamedStyle # for cell in worksheet[1]: # cell.border = tableTopBorder n = 0 for cell in worksheet[2]: if n == 0: cell.style = headerLeftNamedStyle elif n == cols-1: cell.style = headerRightNamedStyle else: cell.style = headerNamedStyle n += 1 for r in range(3, rows+1): for c in range(1, cols+1): if c == 1: worksheet.cell(r, c).border = tableLeftBorder + bodyBorder elif c == worksheet.max_column: worksheet.cell(r, c).border = tableRightBorder + bodyBorder else: worksheet.cell(r, c).style = bodyNamedStyle n = 0 for cell in worksheet[rows]: if n == 0: cell.border = tableLeftBorder + tableBottomBorder + bodyBorder elif n == cols-1: cell.border = tableRightBorder + tableBottomBorder + bodyBorder else: cell.border = tableBottomBorder + bodyBorder n += 1 # for cell in worksheet['A']: # cell.border = tableLeftBorder + bodyBorder # for cell in worksheet[get_column_letter(worksheet.max_column)]: # cell.border = tableRightBorder + bodyBorder workbook.save("borders.xlsx")
https://github.com/python-excel
安装 xlrd
neo@MacBook-Pro-Neo ~/workspace/python % pip install xlrd
演示程序
import xlrd workbook = xlrd.open_workbook(filename='test.xls') # 打开文件 print("获取所有工作表: {}".format(workbook.sheet_names())) # 获取所有工作表 print("工作表数量 {0}".format(workbook.nsheets)) sheet1 = workbook.sheet_by_index(0) # 通过索引获取表格 sheet2 = workbook.sheet_by_name('工资表') # 通过名字获取表格 print(sheet1, sheet2) print("工作表名 {}, 行数 {}, 列数 {}".format(sheet1.name, sheet1.nrows, sheet1.ncols)) rows = sheet1.row_values(2) # 获取行内容 cols = sheet1.col_values(3) # 获取列内容 print("第二行内容 {}".format(rows)) print("第三列内容 {}".format(cols)) # 获取表格里的内容,三种方式 print(sheet1.cell(1, 0).value) print(sheet1.cell_value(1, 0)) print(sheet1.row(1)[0].value)
neo@MacBook-Pro-Neo ~/workspace/python % pip install xlwt
import xlwt # 创建workbook对象 workbook = xlwt.Workbook() # 创建工作表 sheet sheet1 = workbook.add_sheet('sheet1', cell_overwrite_ok=True) sheet2 = workbook.add_sheet('sheet2', cell_overwrite_ok=True) # 向sheet工作表中写入数据 sheet1.write(0, 0, '姓名') sheet1.write(0, 1, '性别') sheet1.write(0, 2, '年龄') sheet1.write(1, 0, '景峯') sheet1.write(1, 1, '男') sheet1.write(1, 2, '35') # 第二张工作表 sheet2.write(0, 0, '姓名') sheet2.write(0, 1, '性别') sheet2.write(0, 2, '年龄') sheet2.write(1, 0, '景峯') sheet2.write(1, 1, '男') sheet2.write(1, 2, '35') # 保存该excel文件,文件同名会被覆盖 workbook.save('class.xlsx')
设置编码
excel = xlwt.Workbook(encoding='utf-8')
设置列宽
sheet.col(0).width = 25 * 256
设置行高
sheet.row(0).height_mismatch = True sheet.row(0).height = 20 * 20
import xlwt workbook = xlwt.Workbook() worksheet = workbook.add_sheet('My Sheet') # 参数详解: write_merge(列, 行, 合并列数, 合并行数, '文本',样式) worksheet.write_merge(0, 0, 0, 3, '《Netkiller Python 手札》') worksheet.write_merge(1, 2, 0, 3, '作者:netkiller') workbook.save('netkiller.xls')
import xlwt # 创建workbook对象 workbook = xlwt.Workbook() # 创建工作表 sheet sheet1 = workbook.add_sheet('sheet1', cell_overwrite_ok=True) # 水平合并行单元格 sheet1.write_merge(0, 0, 0, 3, '班级学生名单') # 向sheet工作表中写入数据 sheet1.write(1, 0, '姓名') sheet1.write(1, 1, '性别') sheet1.write(1, 2, '年龄') sheet1.write(1, 2, '疫苗接种') sheet1.write(2, 0, '景峯') sheet1.write(2, 1, '男') sheet1.write(2, 2, '35') sheet1.write(3, 0, '小明') sheet1.write(3, 1, '男') sheet1.write(3, 2, '35') # 垂直合并列单元格 sheet1.write_merge(2, 3, 3, 3, '已接种') # 保存该excel文件,文件同名会被覆盖 workbook.save('class.xlsx')
import xlwt workbook = xlwt.Workbook() worksheet = workbook.add_sheet('My Sheet') worksheet.write(0, 0, 5) # Outputs 5 worksheet.write(0, 1, 2) # Outputs 2 worksheet.write(1, 0, xlwt.Formula('A1*B1')) # Should output "10"(A1[5] * A2[2]) worksheet.write(1, 1, xlwt.Formula('SUM(A1,B1)')) # Should output"7" (A1[5] + A2[2]) workbook.save('Workbook.xls')
import xlwt workbook = xlwt.Workbook() worksheet = workbook.add_sheet('My Sheet') worksheet.write(0, 0,xlwt.Formula('HYPERLINK("http://www.netkiller.cn";"Netkiller Python 手札")')) workbook.save('Excel.xls')
import xlwt # 创建workbook对象 workbook = xlwt.Workbook() # 创建工作表 sheet sheet1 = workbook.add_sheet('sheet1', cell_overwrite_ok=True) title = xlwt.XFStyle() alignment = xlwt.Alignment() # 垂直对齐 alignment.horz = alignment.HORZ_CENTER # 水平对齐 alignment.vert = alignment.VERT_CENTER # 换行 alignment.wrap = alignment.WRAP_AT_RIGHT # 设置边框 title.alignment = alignment # valign = xlwt.XFStyle() # 水平合并行单元格 sheet1.write_merge(0, 0, 0, 3, '班级学生名单', title) # 向sheet工作表中写入数据 sheet1.write(1, 0, '姓名') sheet1.write(1, 1, '性别') sheet1.write(1, 2, '年龄') sheet1.write(1, 2, '疫苗接种') sheet1.write(2, 0, '景峯') sheet1.write(2, 1, '男') sheet1.write(2, 2, '35') sheet1.write(3, 0, '小明') sheet1.write(3, 1, '男') sheet1.write(3, 2, '35') # 垂直合并列单元格 sheet1.write_merge(2, 3, 3, 3, '已接种') # 保存该excel文件,文件同名会被覆盖 workbook.save('class.xlsx')
import xlwt # 创建workbook对象 workbook = xlwt.Workbook() # 创建工作表 sheet sheet1 = workbook.add_sheet('sheet1', cell_overwrite_ok=True) title = xlwt.XFStyle() font = xlwt.Font() # 字体类型 font.name = 'name Times New Roman' # 字体颜色 font.colour_index = 4 # 字体大小,11为字号,20为衡量单位 font.height = 20 * 11 # 字体加粗 font.bold = False # 下划线 font.underline = True # 斜体字 font.italic = True alignment = xlwt.Alignment() # 垂直对齐 alignment.horz = alignment.HORZ_CENTER # 水平对齐 alignment.vert = alignment.VERT_CENTER # 换行 alignment.wrap = alignment.WRAP_AT_RIGHT # 设置边框 title.alignment = alignment title.font = font valign = xlwt.XFStyle() va = xlwt.Alignment() va.vert = alignment.VERT_CENTER valign.alignment = va # 水平合并行单元格 sheet1.write_merge(0, 0, 0, 3, '班级学生名单', title) # 向sheet工作表中写入数据 sheet1.write(1, 0, '姓名') sheet1.write(1, 1, '性别') sheet1.write(1, 2, '年龄') sheet1.write(1, 3, '疫苗接种') sheet1.write(2, 0, '景峯') sheet1.write(2, 1, '男') sheet1.write(2, 2, '35') sheet1.write(3, 0, '小明') sheet1.write(3, 1, '男') sheet1.write(3, 2, '35') # 垂直合并列单元格 sheet1.write_merge(2, 3, 3, 3, '已接种', valign) # 保存该excel文件,文件同名会被覆盖 workbook.save('class.xlsx')
import xlwt # 创建workbook对象 workbook = xlwt.Workbook() # 创建工作表 sheet sheet1 = workbook.add_sheet('sheet1', cell_overwrite_ok=True) borders = xlwt.Borders() # 细实线:1,小粗实线:2,细虚线:3,中细虚线:4,大粗实线:5,双线:6,细点虚线:7 # 大粗虚线:8,细点划线:9,粗点划线:10,细双点划线:11,粗双点划线:12,斜点划线:13 borders.left = 1 borders.right = 1 borders.top = 1 borders.bottom = 1 # borders.left_colour = 1 # borders.right_colour = 1 # borders.top_colour = 1 # borders.bottom_colour = 1 style_borders = xlwt.XFStyle() style_borders.borders = borders title = xlwt.XFStyle() alignment = xlwt.Alignment() # 垂直对齐 alignment.horz = alignment.HORZ_CENTER # 水平对齐 alignment.vert = alignment.VERT_CENTER # 换行 alignment.wrap = alignment.WRAP_AT_RIGHT # 设置边框 title.alignment = alignment valign = xlwt.XFStyle() va = xlwt.Alignment() va.vert = alignment.VERT_CENTER valign.alignment = va valign.borders = borders # 水平合并行单元格 sheet1.write_merge(0, 0, 0, 3, '班级学生名单', title) # 向sheet工作表中写入数据 sheet1.write(1, 0, '姓名', style_borders) sheet1.write(1, 1, '性别', style_borders) sheet1.write(1, 2, '年龄', style_borders) sheet1.write(1, 3, '疫苗接种', style_borders) sheet1.write(2, 0, '景峯', style_borders) sheet1.write(2, 1, '男', style_borders) sheet1.write(2, 2, '35', style_borders) sheet1.write(3, 0, '小明', style_borders) sheet1.write(3, 1, '男', style_borders) sheet1.write(3, 2, '35', style_borders) # 垂直合并列单元格 sheet1.write_merge(2, 3, 3, 3, '已接种', valign) # 保存该excel文件,文件同名会被覆盖 workbook.save('class.xlsx')
import xlwt workbook = xlwt.Workbook() worksheet = workbook.add_sheet('My Sheet') pattern = xlwt.Pattern() # Create the Pattern # May be: NO_PATTERN,SOLID_PATTERN, or 0x00 through 0x12 pattern.pattern = xlwt.Pattern.SOLID_PATTERN # May be: 8 through 63. 0 = Black,1 = White, 2 = Red, 3 = Green, 4 = Blue, 5 = Yellow, 6 = Magenta, 7= Cyan, 16 = Maroon, 17 = Dark Green, 18 = Dark Blue, 19 = DarkYellow , almost brown), 20 = Dark Magenta, 21 = Teal, 22 = LightGray, 23 = Dark Gray, the list goes on... pattern.pattern_fore_colour = 5 style = xlwt.XFStyle() # Create Style style.pattern = pattern # Add Borders to Style worksheet.write(0, 0, 'Cell Contents', style) workbook.save('Workbook.xls')
import xlwt from datetime import datetime workbook = xlwt.Workbook() sheet1 = workbook.add_sheet('工资表', cell_overwrite_ok=True) columes = ["姓名", "年龄", "出生日期", "工资", '报销'] datas = [ ["张三", 13, '2019-02-12', 16800, 15779.24], ["李四", 12, '2018-03-15', 17200, -24.225] ] format = xlwt.XFStyle() format.num_format_str = 'yyyy/mm/dd' number = xlwt.XFStyle() sheet1.write_merge(0, 0, 0, 4, '工资表') # 合并行单元格 # 写第一行 for i in range(0, len(columes)): sheet1.write(1, i, columes[i]) line = 2 # 写第一列 for data in datas: for col in range(len(data)): cell = data[col] if col == 2: date = datetime.strptime(cell, '%Y-%m-%d').date() # %H:%M:%S # print(date) sheet1.write(line, col, date, format) elif col == 3: number.num_format_str = '#,##;[RED]-#,##' sheet1.write(line, col, cell, number) elif col == 4: number.num_format_str = '#,##0.00;[RED]-#,##0.00' sheet1.write(line, col, cell, number) else: sheet1.write(line, col, cell) line = line+1 workbook.save('test.xls')
安装 xlutils
pip install xlutils
import xlrd import xlutils.copy # 打开一个xls文件 xls = xlrd.open_workbook('test.xls') workbook = xlutils.copy.copy(xls) # 添加新sheet表 workbook.add_sheet('sheet2', cell_overwrite_ok=True) # 获取sheet对象,通过sheet_by_index()获取的sheet对象没有write()方法 sheet = workbook.get_sheet(0) # 修改数据 sheet.write(2, 0, '王二小') # 保存时同名会覆盖,达到修改excel文件的目的 workbook.save('test.xls')