python 读取excel(ZT)



import win32com.client
import os
import time

class Excel:
def __init__(self, filename=None, configuration = None):

self.xApp = win32com.client.Dispatch(' Excel.Application ')
self.Config = configuration

#start info.
#reading configuation file
print "Setting standard font: %s" % self.Config['FONT']
self.xApp.StandardFont = self.Config['FONT']

print "Setting standard size: %s" % str(TextSize)
self.xApp.StandardFontSize = TextSize

#check configuration file
if os.path.exists( self.Config['DATAPATH'] ) :
pass
else:
print "Error: The given data path doesn't exist"
self.close()

# name of report
if filename:
self.Filename = filename
try:
self.xBook = self.xApp.Workbooks.Open(filename)
except:
print "Error: Open file %s failed" % filename
else:

self.xBook = self.xApp.Workbooks.Add()
reportname = self.Config['PROJECT']+ '_R'+ self.Config['VERSION'] + '_' + time.strftime("%Y%m%d") + '_IssueReport'
self.Filename = os.path.join( self.Config['PATH'], reportname)
Name = self.Filename + '.xls'

# if the file exists, rename new file as format oldname(number)
try:
if os.path.exists ( Name ):
number = 2

# test new name
while 1:
Name = self.Filename + "(" + str(number) + ").xls"
if os.path.exists ( Name ):
number += 1
continue
else :
break

self.Filename = self.Filename + "(" + str(number) + ").xls"
print "Given name has been used, rename new report to %s" % self.Filename
else:
self.Filename += '.xls'

print "Report name: %s" % self.Filename
self.xBook.SaveAs( self.Filename )
print "Report file was created"
except:
print "Error: creating file failed"


def save(self, newfilename=None):

print "Saving report to %s" % self.Config['PATH']
if newfilename:
self.Filename = newfilename
self.xBook.SaveAs(newfilename)
else:
self.xBook.Save()
print "Report saved"


def close(self):
self.xBook.Close(SaveChanges=0)
# close error msg
del self.xApp

def show(self):
print "Show generated report"
self.xApp.Visible = 1

def delSheet(self, sheet):
sht = self.xBook.Worksheets(sheet)

try:
sht.Delete()
print "sheet %s is deleted" % sheet
except:
print "Error: Delete sheet %s failed" % sheet

def hide(self):
self.xApp.Visible = 0

# get value from cell
def getCell(self,sheet, row, col):
"Get value of one cell"
sht = self.xBook.Worksheets(sheet)
return sht.Cells (row, col).Value


# set value for cell
def setCell(self, sheet, row, col, value=None, formula=None):

sht = self.xBook.Worksheets(sheet)
if formula :
sht.Cells(row, col).Formula = formula
else:
sht.Cells(row, col).Value = value


# return tuple
def getRange(self, sheet, row1, col1, row2, col2):
"return a 2d array ( i.e. tuple of tuples)"
sht = self.xBook.Worksheets(sheet)
return sht.Range(sht.Cells(row1, col1), sht.Cells(row2, col2)).Value



# set tuple for range
def setRange(self, sheet, topRow, leftCol, data):
'''
set range data from a tuple
'''
if type( data ) == types.TupleType:

bottomRow = topRow + len(data) - 1
rightCol = leftCol + len(data[0]) - 1
length = len(data)
else:
bottomRow = topRow
rightCol = leftCol
length = 1
sht = self.xBook.Worksheets(sheet)

if( length > MaxAccept):
times = length/MaxAccept;
i = 0;
# Multiple * MaxAccept data
while( i < times ):

sht.Range(
sht.Cells (topRow + i*MaxAccept, leftCol),
sht.Cells(topRow + (i+1)*MaxAccept - 1, rightCol)
).Value = data[i*MaxAccept: (i+1)*MaxAccept]

i += 1

# additional data besides Multiple MaxAccept
sht.Range(
sht.Cells(topRow + times * MaxAccept, leftCol),
sht.Cells(bottomRow, rightCol)
).Value = data[times * MaxAccept:]


else:
sht.Range(
sht.Cells(topRow, leftCol),
sht.Cells(bottomRow, rightCol)
).Value = data



# rename a work sheet
def setSheetName(self, sheet, name):
'''
Rename a sheet
'''
sht = self.xBook.Worksheets(sheet)

#logging
print "Rename sheet %s to %s" % ( sheet , name )
sht.Name = name

------------------------------ 运行开始: 2025-08-19 09:07:15.815 ------------------------------ "D:/Program Files (x86)/ISRPA/Python/pythons.exe" "D:/Users/ZT-055364/Documents/RPA/Project/NewProject1/codes/Main.py" -p NewProject1 ------------------------------ BeginPython: 2025-08-19 09:07:20,533 ------------------------------ [2025-08-19 09:07:20,768] [D:/Users/ZT-055364/Documents/RPA/Project/NewProject1/codes/Main.py] - [Main] [读取Excel] [SNTag:2025081908385136330] [] [2025-08-19 09:07:20,875] [Main] [读取Excel] [SNTag:2025081908385136330] 返回值:[<class 'pandas.core.frame.DataFrame'>] 编号 姓名 节目 报销类型 报销金额 报销日期 备注 0 1 豪小哼 chaka 差旅费 1200 2024-09-01 NaN 1 2 豪小嗷 NaN 餐饮费 800 2024-09-02 NaN 2 3 莉豪鸭 NaN 办公用品 56 2024-09-03 NaN 3 4 豪小哼 NaN 差旅费 100 2024-09-04 NaN 4 5 豪小嗷 NaN 餐饮费 56 2024-09-05 NaN 5 6 莉豪鸭 NaN 差旅费 2000 2024-09-06 NaN [2025-08-19 09:07:20,877] [D:/Users/ZT-055364/Documents/RPA/Project/NewProject1/codes/Main.py] - [Main] [表格过滤] [SNTag:2025081908394045134] [过滤餐饮超过500申请] Traceback (most recent call last): File "D:/Users/ZT-055364/Documents/RPA/Project/NewProject1/codes/Main.py", line 147, in <module> iplatform.Return(MainResult=getattr(pro, fn)(**params), job_no=job_no) File "D:/Users/ZT-055364/Documents/RPA/Project/NewProject1/codes/Main.py", line 88, in Main tvar_2025081908394045235=tvar_2025081908385136531[(tvar_2025081908385136531[报销类型]== '餐饮费') & (tvar_2025081908385136531[报销金额]> '500')] NameError: name '报销类型' is not defined
08-20
### 问题分析 在使用 Pandas 进行数据处理时,出现 `TypeError: Invalid comparison between dtype=int64 and str` 和 `NameError: name '报销类型' is not defined` 两个错误,通常与数据类型不一致和列名引用方式不正确有关。 #### `TypeError: Invalid comparison between dtype=int64 and str` 该错误表明尝试将整数类型(`int64`)的列与字符串进行比较。例如,当执行如下代码时: ```python df[(df['报销类型'] == '餐饮费') & (df['报销金额'] > '500')] ``` 其中 `报销金额` 列为数值类型(`int64`),而 `'500'` 是字符串类型,Pandas 无法在不同数据类型之间执行比较操作,因此会抛出该错误[^1]。 #### `NameError: name '报销类型' is not defined` 此错误通常是因为在使用条件过滤时未正确引用列名。例如: ```python df[报销类型 == '餐饮费'] ``` 上述写法中,`报销类型` 未使用引号包裹,Python 会将其视为变量名而非字符串,从而导致 `NameError`[^1]。 --- ### 解决方案 #### 1. 确保列名使用引号包裹 在进行条件筛选时,必须使用字符串形式引用列名: ```python df[df['报销类型'] == '餐饮费'] ``` 这样可以避免 `NameError`,确保 Python 正确识别列名。 #### 2. 统一比较操作中的数据类型 在进行数值比较时,确保比较的值与列的数据类型一致。例如,若 `报销金额` 列为 `int64` 类型,则应使用整数进行比较: ```python df[(df['报销类型'] == '餐饮费') & (df['报销金额'] > 500)] ``` 如果列中存在非数字字符串,可以将其转换为数值类型,并将无法转换的值设为 `NaN`: ```python df['报销金额'] = pd.to_numeric(df['报销金额'], errors='coerce') ``` #### 3. 检查并处理缺失值 如果列中存在 `NaN` 值,可能会导致后续操作出错。可以在读取数据时避免将缺失值识别为 `NaN`: ```python df = pd.read_excel('data.xlsx', keep_default_na=False) ``` 或者在处理数据前填充缺失值: ```python df['报销金额'].fillna(0, inplace=True) ``` #### 4. 使用 `converters` 参数确保列类型一致 在读取 Excel 文件时,可以通过 `converters` 参数指定特定列的转换函数,以确保数据类型一致: ```python df = pd.read_excel('data.xlsx', converters={'报销金额': str}) ``` --- ### 示例代码 以下是一个完整的示例,展示如何正确处理 `TypeError` 和 `NameError`: ```python import pandas as pd # 读取 Excel 文件并避免将缺失值识别为 NaN df = pd.read_excel('data.xlsx', keep_default_na=False) # 将 '报销金额' 列转换为数值类型,无法转换的值设为 NaN df['报销金额'] = pd.to_numeric(df['报销金额'], errors='coerce') # 填充缺失值为 0 df['报销金额'].fillna(0, inplace=True) # 正确引用列名并进行条件筛选 filtered_data = df[(df['报销类型'] == '餐饮费') & (df['报销金额'] > 500)] print(filtered_data) ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值