Python操作Excel

2017-04-24  本文已影响0人  炸鸡翅_

前言

因为工作上的需要,最近经常用Python对报表做Excel导入导出,特此做个笔记,方便日后查看。

首先我选择了Python-Excel下的xlrd和xlwt。需要注意的是,xlwt只支持生成xls,暂时还不支持xlsx。


安装

pip install xlrd
pip install xlwt

官方文档

https://github.com/python-excel/tutorial/raw/master/python-excel.pdf


读取Excel - xlrd

打开表格,获取总行数
xlrd.Book.encoding = "utf8" #设置编码
data = xlrd.open_workbook(file_path)
table = data.sheet_by_index(0) #取第一张工作簿
rows_count = table.nrows #取总行数
方法一
row_data = table.row_values(0)
cell_data = row_data[0]  #取第0行第0列的值
方法二
table.cell(1, 1).value  #取第1行第1列的值

读取主要是用到这两个方法,我想到就继续补充,更多用法请查阅官方文档


生成Excel - xlwt

新建文档和工作簿对象
workbook = xlwt.Workbook()
sheet = workbook.add_sheet('sheet1', cell_overwrite_ok=True)
写入数据
sheet.row(row_index).write(col_index, u'这是一个测试')
sheet.write(row_index, col_index, u'这也是一个测试')
合并单元格
sheet.write_merge(row_1, row_2, col_1, col2, u'我是一个合并的单元格'))  
#这个参数一开始我弄错了,要注意
表格样式

表格样式设置有XFStyle和easyxf两种方式

#XFStyle方式
borders = Borders()
borders.left = Borders.THICK
borders.right = Borders.THICK
borders.top = Borders.THICK
borders.bottom = Borders.THICK

pattern = Pattern()
pattern.pattern = Pattern.SOLID_PATTERN
pattern.pattern_fore_colour = 0x0A

style = XFStyle()
style.num_format_str='YYYY-MM-DD'
style.font = fnt
style.borders = borders
style.pattern = pattern
sheet.write_merge(row_1, row_2, col_1, col2, u'我是一个单元格', style)
#easyxf方式,可设置属性、键和值可以查看官方文档
#个人感觉写起来代码更少,更舒服
sheet.write_merge(row_1, row_2, col_1, col2, u'我是一个单元格', xlwt.easyxf(
        u'alignment: horizontal center, vertical center,wrap True;'
        u'font: name 宋体,height 440, bold True;'
))
设置行高和列宽

列宽在Excel里面用字符宽带来表示。xlwt以字符'0'的1/256宽为一个单位,默认表格宽度为2962,大致相当于11个字符宽度。设置Excel的列宽就大致等于,字符宽度 * 256 + 182 (有待继续考证,精度目前还行)

sheet.col(0).width = 字符宽度 * 256 + 182

行高再Excel里面一般用磅来表示,磅 * 20 即是xlwt的数值。字体的大小也是用磅来设置。

sheet.row(i).height_mismatch = True  #必须设置高度才能生效
sheet.row(i).height = 磅 * 20
保存文件
workbook.save(file_name)
冷门

设置页面方向

sheet.set_portrait(False)  #设置页面为横向

使用num_format_str来设置单元格类型。
特别是遇到时间的时候,Excel会自动转为May-2017这种格式,这时候就要设置为文本类型,防止自动转换

#将单元格设置为文本类型
sheet.row(row).write(col, u'这是一个单元格', xlwt.easyxf(
        u'borders: left 1,right 1,top 1,bottom 1;'
        u'alignment: horizontal left, vertical center,wrap True;'
        u'font: name 宋体,height 220;',
        num_format_str='@' #这个是关键
))
#这么多类型请自行体会
[
    'general',
    '0',
    '0.00',
    '#,##0',
    '#,##0.00',
    '"$"#,##0_);("$"#,##',
    '"$"#,##0_);[Red]("$"#,##',
    '"$"#,##0.00_);("$"#,##',
    '"$"#,##0.00_);[Red]("$"#,##',
    '0%',
    '0.00%',
    '0.00E+00',
    '# ?/?',
    '# ??/??',
    'M/D/YY',
    'D-MMM-YY',
    'D-MMM',
    'MMM-YY',
    'h:mm AM/PM',
    'h:mm:ss AM/PM',
    'h:mm',
    'h:mm:ss',
    'M/D/YY h:mm',
    '_(#,##0_);(#,##0)',
    '_(#,##0_);[Red](#,##0)',
    '_(#,##0.00_);(#,##0.00)',
    '_(#,##0.00_);[Red](#,##0.00)',
    '_("$"* #,##0_);_("$"* (#,##0);_("$"* "-"_);_(@_)',
    '_(* #,##0_);_(* (#,##0);_(* "-"_);_(@_)',
    '_("$"* #,##0.00_);_("$"* (#,##0.00);_("$"* "-"??_);_(@_)',
    '_(* #,##0.00_);_(* (#,##0.00);_(* "-"??_);_(@_)',
    'mm:ss',
    '[h]:mm:ss',
    'mm:ss.0',
    '##0.0E+0',
    '@'
]

只是把我这几天用到的记录一下,还有很多没写到,到时候用到了再慢慢补充!

上一篇下一篇

猜你喜欢

热点阅读