from openpyxl import Workbook,load_workbook from openpyxl.styles import * import xlrd import xlwt #计算bosa_vapd workbook1 = xlrd.open_workbook('0509-PIC BOSA Test Report_460units.xls') table = workbook1.sheet_by_name(sheet_name='Sheet1') #table_list = table.row_values(rowx=3, start_colx=0, end_colx=None) #table_list1 = table.col.values(colx=0,start_rowx=0,end_rowx=None) table_list1 = table.col_values(colx=3,start_rowx=3,end_rowx=None) #print(table_list1) num = 3 book = xlwt.Workbook(encoding='utf-8',style_compression=0) sheet = book.add_sheet('Sheet1',cell_overwrite_ok=True) col=('bosa_sn','bosa_type','bosa_pn','bosa_vapd','bosa_ith','bosa_imod','bosa_impd','bosa_refpwr','bosa_tiavcc','bosa_apd_resp','bosa_apd_comp','bosa_apd_max_i','darkcurrent_vapd10','darkcurrent_vop','pin_resp','rf_oma','rf_out_target','target_er_set') for i in range(0,len(col)): sheet.write(0,i,col[i]) bosa_type="PA6260" bosa_pn="PA6-GPON-ONU-BOSA" bosa_ith="80" bosa_imod="380" bosa_refpwr="2500" bosa_tiavcc="1" bosa_apd_comp="110" bosa_apd_max_i="10" pin_resp="-1" rf_oma="-1" rf_out_target="-1" target_er_set="13" a=1 print(len(table_list1)) for op in range(0,len(table_list1)): table_list = table.row_values(rowx=op+3, start_colx=0, end_colx=None) print(table_list) sn=table_list[0] vop=table_list[8] pop=table_list[4] gain=table_list[11] io=table_list[10] iop=table_list[9] bosa_vapd = round(vop*100) bosa_impd = round(pop) bosa_apd_resp = round(gain*8.5) darkcurrent_vapd10=round(io*100) darkcurrent_vop = round(iop*10) value=(sn,bosa_type,bosa_pn,bosa_vapd,bosa_ith,bosa_imod,bosa_impd,bosa_refpwr,bosa_tiavcc,bosa_apd_resp,bosa_apd_comp,bosa_apd_max_i,darkcurrent_vapd10,darkcurrent_vop,pin_resp,rf_oma,rf_out_target,target_er_set) for j in range(0,len(value)): sheet.write(op+1,j,value[j]) book.save('test1.xls')
原始数据参数:
转换完后的数据:
import xlwt book = xlwt.Workbook(encoding='utf-8',style_compression=0) sheet = book.add_sheet('Sheet1',cell_overwrite_ok=True) col=('bosa_sn','bosa_type','bosa_pn','bosa_vapd','bosa_ith','bosa_imod','bosa_impd','bosa_refpwr','bosa_tiavcc','bosa_apd_resp','bosa_apd_comp','bosa_apd_max_i','darkcurrent_vapd10','darkcurrent_vop','pin_resp','rf_oma','rf_oma','rf_out_target','target_er_set') for i in range(0,len(col)): sheet.write(0,i,col[i]) book.save('test.xls')
from openpyxl import Workbook,load_workbook
from openpyxl.styles import *
import xlrd
import xlwt
#wb = openpyxl.load_workbook('0509-NP2659G-BOSA参数模板表.xls')
#type(wb)
#workbook = xlrd.open_workbook('0509-NP2659G-BOSA参数模板表.xls')
#table = workbook.sheet_by_name(sheet_name='Sheet1')
#print(table)
workbook = xlwt.Workbook()
#计算bosa_vapd
workbook1 = xlrd.open_workbook('0509-PIC BOSA Test Report_460units.xls')
table = workbook1.sheet_by_name(sheet_name='Sheet1')
table_list = table.row_values(rowx=3, start_colx=0, end_colx=None)
print(table_list)
sn=table_list[0]
vop=table_list[8]
pop=table_list[4]
gain=table_list[11]
io=table_list[10]
iop=table_list[9]
bosa_vapd = round(vop*100)
bosa_impd = round(pop)
bosa_apd_resp = round(gain*8.5)
darkcurrent_vapd10=round(io*100)
darkcurrent_vop = round(iop*10)
ls=[sn,bosa_vapd,bosa_impd,bosa_apd_resp,darkcurrent_vapd10,darkcurrent_vop]
print(ls[0])
wb = Workbook()
wb_sheet = wb.create_sheet("Sheet1")
wb_sheet.cell(row=1,column=1,value=ls[0])
wb.save('bosa_config.xlsx')
存在的问题补充:
问题描述
使用 Pandas 的 read_excel
方法读取一个 16 万行的 Excel 文件报 AssertionError
错误:
"/Users/Zzy/Desktop/test/csv_test/venv/lib/python3.7/site-packages/xlrd/xlsx.py", line 637, in do_row
assert 0 <= self.rowx < X12_MAX_ROWS
AssertionError
背后原理
Excel 文件的格式曾经发生过一次变化,在 Excel 2007 以前,使用扩展名为 .xls
格式的文件,这种文件格式是一种特定的二进制格式,最多支持 65,536 行,256 列表格。从 Excel 2007 版开始,默认采用了基于 XML 的新的文件格式 .xlsx
,支持的表格行数达到了 1,048,576,列数达到了 16,384。需要注意的是,将 .xlsx
格式的文件转换为 .xls
格式的文件时,65536 行和 256 列之后的数据都会被丢弃。
版本|最大行数|最大列数|文件格式 --|--|--|-- 早于 Excel 2007 的版本|65,536|256|.xls Excel 2007 及以后版本|1,048,576|16,384|.xlsx
Pandas 读取 Excel 文件的引擎是 xlrd
, xlrd
虽然同时支持 .xlsx
和 .xls
两种文件格式,但是在源码文件 xlrd/sheet.py 中限制了读取的 Excel 文件行数必须小于 65536,列数必须小于 256。
if self.biff_version >= 80:
self.utter_max_rows = 65536
else:
self.utter_max_rows = 16384
self.utter_max_cols = 256
这就导致,即使是 .xlsx
格式的文件, xlrd
依然不支持读取 65536 行以上的 Excel 文件(源码中还有一个行数限制是 16384,这是因为 Excel 95 时代, xls
文件所支持的最大行数是 16384)。
解决办法
openpyxl
是一个专门用来操作 .xlsx
格式文件的 Python 库,和 xlrd
相比它对于最大行列数的支持和 .xlsx
文件所定义的最大行列数一致。
首先安装 openpyxl
:
pip install openpyxl
Pandas 的 read_excel 方法中,有 engine
字段,可以指定所使用的处理 Excel 文件的引擎,填入 openpyxl
,再读取文件就可以了。
import pandas as pd
df = pd.read_excel('./data.xlsx', engine='openpyxl')
print(len(df)) # 160000