# Python Excel 操作
# 当你从odoo附件中读取excel的时候需要做base64转码,因为odoo中存储的附件都是经过转码的
company = self.env['res.company'].sudo().browse(cid)
if not company.excel_file:
return True
# 解析文件后缀
filename = company.excel_file_name
suffix = splitext(filename)[-1]
# 将文件内容写入临时文件中
fp = tempfile.NamedTemporaryFile(delete= False,suffix=".xlsx")
fp.write(binascii.a2b_base64(company.excel_file))
fp.seek(0)
file_name = fp.name
fp.close()
# 本文只涉及xls、xlsx、csv后缀的Excel文件
# xls是2003年的版本
# xlsx是2007年至今一直的版本,和xls的区别是,表格中插入了图片的话,xlsx对图片进行了压缩处理,所以一样的内容xls会比xlsx大很多。
# csv以逗号分隔的文本文件,便于兼容其他程序,只保存活动工作表
# 涉及模块
# xlrd 用于读取Excel文件,无写功能。仅支持xls格式
pip3 install xlrd
# xlwt 用于写Excel文件,无读功能。仅支持xls格式。当你只需要修改excel表格的时候,你调用保存你会发现图片丢失了。因为你用xlrd读取出来的内容只有文字并没有图片。图片还需你自己处理(还没研究)
pip3 install xlwt
# xlutils 用于读写Excel文件。仅支持xls格式。它只是集成了xlrd和xlwt两个模块。
pip3 install xlutils
# csv 用于读写csv后缀的Excel文件。和xlwt一样,只是修改的话会丢失图片
pip3 install csv # 好像自带就有
# openpyxl 用于读取/写入 Excel xlsx/xlsm 文件。该模块修改excel不会丢失图片
pip3 install openpyxl
# pandas 该模块是做数据分析用的,非常强大。修改excel表格的话也会丢失图片。但是好用的是,它支持所有excel格式
pip3 insytall pandas
# 例子:
# xlrd
import xlrd
book = xlrd.open_workbook("myfile.xls")
print("The number of worksheets is {0}".format(book.nsheets))
print("Worksheet name(s): {0}".format(book.sheet_names()))
sh = book.sheet_by_index(0)
print("{0} {1} {2}".format(sh.name, sh.nrows, sh.ncols))
print("Cell D30 is {0}".format(sh.cell_value(rowx=29, colx=3)))
for rx in range(sh.nrows):
print(sh.row(rx))
# xlwt
import xlwt
from datetime import datetime
style0 = xlwt.easyxf('font: name Times New Roman, color-index red, bold on',
num_format_str='#,##0.00')
style1 = xlwt.easyxf(num_format_str='D-MMM-YY')
wb = xlwt.Workbook()
ws = wb.add_sheet('A Test Sheet')
ws.write(0, 0, 1234.56, style0)
ws.write(1, 0, datetime.now(), style1)
ws.write(2, 0, 1)
ws.write(2, 1, 1)
ws.write(2, 2, xlwt.Formula("A3+B3"))
wb.save('example.xls')
# xlutils
import xlrd
import xlwt
from xlutils.copy import copy as xlscopy
workbook = xlrd.open_workbook(file_name, formatting_info=True)
writeworkbook = xlscopy(workbook)
# writeworkbook.save('/home/pc1/odoo14/local_shequ/python3/test123.xls')
for sheet_index in workbook.sheet_names():
sheet_page = workbook.sheet_by_name(sheet_index)
write_sheet_page = writeworkbook.get_sheet(sheet_index)
rowMax = sheet_page.nrows
colMax = sheet_page.ncols
for row in range(rowMax):
if row == 0:
continue
else:
rows = sheet_page.row_values(row)
for col in range(colMax):
te_result = '修改的值'
if te_result:
write_sheet_page.write(row,col,te_result)
writeworkbook.save(file_name)
# csv
import csv
file_reader = []
csv_reader = csv.reader(data_file, delimiter=',')
file_reader.extend(csv_reader)
for i in range(len(file_reader)):
field = list(map(str, file_reader[i]))
values = dict(zip(keys, field))
if values:
if i == 0:
continue
else:
values.update({
'Part Type' : field[0],
})
lvalues.append(values)
# openpyxl
# 文档:https://openpyxl.readthedocs.io/en/stable/
# 1
from openpyxl import load_workbook
wb = load_workbook(file_name)
for sheet_name in wb.sheetnames:
ws = wb[sheet_name]
for row in ws.rows:
for cell in row:
te_result = '你要修改的值'
if te_result:
cell.value = te_result
wb.save(file_name)
# 2
from openpyxl import Workbook
wb = Workbook()
# grab the active worksheet
ws = wb.active
# Data can be assigned directly to cells
ws['A1'] = 42
# Rows can also be appended
ws.append([1, 2, 3])
# Python types will automatically be converted
import datetime
ws['A2'] = datetime.datetime.now()
# Save the file
wb.save("sample.xlsx")