目录
pandas与excel
pd.DataFrame()写出到excel问题
ValueError: Append mode is note supported with xlsxwriter
对于pd.ExcelWriter
,现有的的写入excel模块包含openpyxl
和xlsxwriter
,pd.ExcelWriter方法中默认的模块是xlsxwriter
,但此模块不支持append追加操作。改成openpyxl
即可。在0.24.2中要指明,0.25.3则不需要。
openpyxl不支持写出xls格式
with pd.ExcelWriter(outfile_name,mode='a',engine="openpyxl")aswriter:
报错
openpyxl.utils.exceptions.InvalidFileException: openpyxl does not support the old .xls file format, please use xlrd to read this file, or convert it to the more recent .xlsx file format.
不指定这个engine
的时候用的是xlwt
,而这个不支持后面插入
ValueError: Append mode is not supported with xlwt!
pd读取问题
excel另存为
pandas读取会忽略格式,如果用pandas读入再写出,被隐藏的列会展示出来,日期也会变成完整形式。
但是如果用openpyxl删除某些sheet再保存的话,会很方便。格式完整,所见即所得。
wb = openpyxl.load_workbook(file_path)
print("openpyxl load ok!")
for i in use_less:
wb.remove(wb[i])
result_name = cur_year + '-orderlist.xlsx'
wb.save(result_name)
xlrd、xlwt和openpyxl的比较
1)xlrd:对xls、xlsx、xlsm文件进行读操作–读操作效率较高,推荐
2)xlwt:对xls文件进行写操作–写操作效率较高,但是不能执行xlsx文件
3)openpyxl:对xlsx、xlsm文件进行读、写操作–xlsx写操作推荐使用
xlwings处理xls格式的缺点
xlwings也很好用,还可以处理xls格式。当前的问题是:
- 文件有密码,需要用只读模式打开,而xlwings会打开excel进程,询问是否输入密码。
- xlwings结束后需要杀死excel进程,避免卡死。那么什么时间kill呢?需要考虑会不会影响在用的人。
- xlwings需要有excel安装。
xlwings requires an installation of Excel and therefore only works on Windows and macOS. To enable the installation on Linux nevertheless, do: export INSTALL_ON_LINUX=1; pip install xlwings
xlrd
xlrd适合读整列或者整行。
xlrd:对xls、xlsx文件进行读操作
获取工作簿对象:
xlrd.open_workbook()
workBook = xlrd.open_workbook(filemname)
打开Excel文件读取数据
注:filemname为文件名以及路径,如果路径或者文件名有中文给前面加一个r
表示原生字符。获取工作表(sheet)对象
1)workBook.sheet_names()
:获取所有sheet页的名字2)
sheetName = workBook.sheet_by_name(‘sheet1’)
:根据sheet页的名字获取指定表名的表3)
sheetName = workbook.sheet_by_index(0)
:根据sheet索引获取对应sheet表获取sheet的名称:
name
sheetName.name
:获取sheet的名称获取行数和列数:
nrows
、ncols
sheetName.nrows
:获取表格的总行数
sheetName.ncols
:获取表格的总列数获取整行或整列的值(数组):
row_values
、col_values
rows = sheetName.row_values(0)
# 获取第一行内容
cols = sheetName.col_values(0)
# 获取第一列内容获取指定单元格的值:
cell(a,b).value
、row(1)[0].value
sheetName.cell(1,0).value
:获取第2行第一列的单元格数据
sheetName.row(1)[0].value
:获取第2行第一列的单元格数据获取单元格内容的数据类型:
ctype
sheetName.cell(1,0).ctype
注:ctype : 0empty
,1string
, 2number
, 3date
, 4boolean
, 5error
原文链接:https://blog.csdn.net/y2Candice/article/details/100581454/
读取日期变float问题
日期会变成float,建议测一下:
# 3 means 'xldate' , 1 means 'text'
if sheet.cell(5, 19).ctype == 3:
ms_date_number = sheet.cell(5, 19).value
year, month, day, hour, minute, second = xlrd.xldate_as_tuple(ms_date_number, book.datemode)
py_date = datetime.datetime(year, month, day, hour, minute, nearest_second)