这题还真是有点难了。
只能简单这样说:
1、简单说如果不用第三方库来读写excel文件的话,主要就是用标准库来读写文件,然后再对其进行解析。
2、库的话一般来说不外乎把基本的文件读写、内容解析等方法封装了起来。翻了一会openxls(注意官方说了xlrd已经不再维护,现在主要换成这个)
要完全说明白太难了,简单说下扒的思路吧:扒调用代码
>>> from openpyxl import load_workbook
>>> wb = load_workbook(filename = 'empty_book.xlsx')
>>> sheet_ranges = wb['range names']
>>> print(sheet_ranges['D18'].value)
可以看到是用load_workbook(filename ='empty_book.xlsx')来实现读取的,那么找到读取方法的定义:
参数是这些:
def load_workbook(filename, use_iterators=False, keep_vba=KEEP_VBA, guess_types=False, data_only=False):
当然简单起见其实我们可以只管不能为空的参数,也就是filename就行,然后顺着这个变量看下后面怎么用的。
def _load_workbook(wb, archive, filename, use_iterators, keep_vba):
valid_files = archive.namelist()
# If are going to preserve the vba then attach a copy of the archive to the
# workbook so that is available for the save.
if keep_vba:
try:
f = open(filename, 'rb')
s = f.read()
f.close()
except:
pos = filename.tell()
filename.seek(0)
s = filename.read()
filename.seek(pos)
wb.vba_archive = ZipFile(BytesIO(s), 'r')
注意这段是关键:当需要保留vba内容时,它是以rb方式读取的,也就是以二进制文件的形式读取。
如果不是,它是这样操作的:
pos = filename.tell() 读取该文件开头的位置,存至pso
filename.seek(0) 将文件读写位置放到0处,也就是开头处
s = filename.read() 读取文件内容。注意这里就只读取内容,读出的结果一般是string,由于是从头读到尾,所以读完后文件读写位置会跑到末尾(你可以想象成一个指针现在指到了链表的末尾)
filename.seek(pos) 回到文件读写开头位置。
3、后面的内容就太细了,不多说了。补充一些关键的地方。
首先,它们都是事先定义了一个详细的和excel 对应的类:
WorkBook() <-- WorkSheet <-- Cells, Charts 等等
其次,在库里封装由文件内容(二进制、string)来填充这些对象和属性的方法。
这样,就可以把一些比较复杂的操作给“藏”起来,只调用对应的功能函数就行了。哎。还没法传图。空了再来吧、