python提供了第三方库xlwt用以操作excel表格
简单介绍
简单介绍一下使用,不想看可以直接跳到最后看案例
class xlwt.Workbook.Workbook(encoding ='ascii',style_compression = 0 )
这是一个表示工作簿及其所有内容的类。使用xlwt创建Excel文件时,通常首先要实例化此类的对象。
方法
- add_sheet(sheetname,cell_overwrite_ok = False )
此方法用于在工作簿中创建工作表。
参数:
- sheetname - 用于此工作表的名称,因为它将显示在Excel应用程序底部的选项卡中。
-
cell_overwrite_ok - 如果
True
写入多次,则添加的工作表中的单元格不会引发异常。
返回:
在Worksheet
已添加。
- save(filename_or_stream )
此方法用于将工作簿保存为本机Excel格式的文件。
参数: filename_or_stream
- 这可以是包含文件文件名的字符串,在这种情况下,使用提供的名称将excel文件保存到磁盘。它也可以是具有write方法的流对象,例如a
StringIO
,在这种情况下,excel文件的数据被写入流。
class xlwt.Worksheet.Worksheet(sheetname,parent_book,cell_overwrite_ok = False )
这是一个表示工作簿中工作表内容的类。
方法
- write(r,c,label ='',style = <xlwt.Style.XFStyle object> )
此方法用于将单元格写入a Worksheet
。
参数:
-
r - 应写入单元格的工作表中行的零相对数。
-
c - 工作表中应写入单元格的列的零相对数。
-
标签 -
要写入的数据值。
-
风格 -
样式(也称为XF(扩展格式))是一个
XFStyle
对象,它封装应用于单元格及其内容的格式。XFStyle
最好使用该easyxf()
功能设置对象 。它们也可以通过在设置属性设置Alignment
,Borders
,Pattern
,Font
和Protection
对象然后设置这些对象和一个格式字符串作为属性XFStyle
对象。
大致了解到这里就能够做基本的使用了,下面看我们案例
案例(一)
这里的案例主要实现把txt文本中的数据读取后添加到excel中,调用了第三方库xlwt和OrderedDict,首先判断文件类型,通过则继续下一步操作,文件转换流程:
- 实例化xlwt对象
- 添加数据表
- 数据添加
难点
- object_pairs_hook 的传入参数是有序的键值对表,而 object_hook 是无序的dict。并且两个参数都给的话,object_pairs_hook 的优先级要更高。就是给object_pairs_hook的解码的键值对列表是有序的,所以些依赖键值对顺序的功能可以用 object_pairs_hook 参数,而不能用 object_hook 。这里直接传入了OrderedDict,具体可参考知乎
- write方法中的r和c参数,对应的是excel中零行、列所在位置,开始也一直很懵,看了下网上的案例,大概明白一些,这里和列表的处理很类似,0就代表了第一项,比如这里参数顺序是(0,1,...),即时第一行第二列的位置,可以用下标循环进行全部数据添加,下面上代码
student.txt(原txt文本)
{
"1":["张三",150,120,100],
"2":["李四",90,99,95],
"3":["王五",60,66,68]
}
json2excel.py
from collections import OrderedDict
import xlwt, json
def json2excel(inputFile, outputFile):
if inputFile.split('.')[1] != 'txt':
print('please input .txt file!')
return
with open(inputFile, 'r') as f:
data = json.load(f, object_pairs_hook=OrderedDict)
#创建实例
wb = xlwt.Workbook()
#添加sheet
ws = wb.add_sheet('student', cell_overwrite_ok=True)
#注意这里的index和后面的i,不要混淆
for index, (key, values) in enumerate(data.items()):
#给excel的第一列的每一行添加序号
ws.write(index, 0, key)
#给excel的第二列开始的之后每一列的每一行添加数据
for i, value in enumerate(values):
ws.write(index, i+1, value)
wb.save(outputFile)
if __name__ == '__main__':
json2excel('student.txt', 'student.xls')
student.xls:
案例(二)
第一个案例熟悉了的话这类对象间的数据处理应该都不成问题,接下来我们来看另一种类型,数据里面就是简单的数组,这里相对之前的就要简单一些,直接遍历然后写入即可,主要用于熟悉一下行列规则
numbers.txt
[
[1, 82, 65535],
[20, 90, 13],
[26, 809, 1024]
]
json2excel-list.py
from collections import OrderedDict
import xlwt, json
def json2excel(inputFile, outputFile):
if inputFile.split('.')[1] != 'txt':
print('please input .txt file!')
return
with open(inputFile, 'r') as f:
data = json.load(f, object_pairs_hook=OrderedDict)
# 创建实例
wb = xlwt.Workbook()
# 添加sheet
ws = wb.add_sheet('numbers', cell_overwrite_ok=True)
for row in range(len(data)):
for col in range(len(data[row])):
ws.write(row, col, data[row][col])
wb.save(outputFile)
if __name__ == '__main__':
json2excel('numbers.txt', 'numbers.xls')
image.png
python也有提供相应的创建处理excel和xml的转化,主要用到xlrd这个库,xml的学习小编没有设计,这里贴出参考的github上的原版实例供大家学习参考,也可以直接参考源地址
student.xls:
excel2xml.py
#-*- coding: utf-8-*-
import xlrd, codecs, json
from lxml import etree
from collections import OrderedDict
def xls2xml(filename, outfile):
with xlrd.open_workbook(filename) as excel:
#table = excel.sheet_by_name('student')
table = excel.sheet_by_index(0)
data = OrderedDict()
for i in range(table.nrows):
key = str(int(table.row_values(i)[0]))
value = str(table.row_values(i)[1:])
data[key] = value
output = codecs.open(outfile, 'w', 'utf-8')
root = etree.Element('root')
students_xml = etree.ElementTree(root)
students = etree.SubElement(root, 'students')
students.append(etree.Comment('\n\t学生信息表\n\t"d" :[名字, 数学, 语文, 英语]\n'))
students.text = '\n\t学生信息表\n\t"d" :[名字, 数学, 语文, 英语]\n'
students.text = '\n'+str(json.dumps(data, indent=4, ensure_ascii=False))+'\n'
output.write('<?xml version="1.0" encoding="UTF-8"?>\n' + etree.tounicode(students_xml.getroot()))
output.close()
if __name__ == '__main__':
xls2xml('student.xls', 'student.xml')
student.xml
<?xml version="1.0" encoding="UTF-8"?>
<root><students>
{
"1": "['张三', 150.0, 120.0, 100.0]",
"2": "['李四', 90.0, 99.0, 95.0]",
"3": "['王五', 60.0, 66.0, 68.0]"
}
<!--
学生信息表
"d" :[名字, 数学, 语文, 英语]
--></students></root>
- 如有问题敬请参考:
网友评论