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',
'@'
]