鱼C论坛

 找回密码
 立即注册
查看: 896|回复: 3

[已解决]关于xlwings库读取Excel文件,进行计算的一个问题

[复制链接]
发表于 2024-10-24 18:54:21 | 显示全部楼层    本楼为最佳答案   
你的代码有一些地方需要调整,以下是修正后的代码以及一些简化和优化:

  1. import xlwings as xw

  2. def Excel_Xirr(file, sheet_name, date_col, cash_col, present_value_col, start_cell):
  3.     wb = xw.Book(file)
  4.    
  5.     # 检查并选择正确的 sheet
  6.     if '计算' in wb.sheets:
  7.         sheet = wb.sheets['计算']
  8.         sheet.clear_contents()
  9.     else:
  10.         sheet = wb.sheets.add('计算')
  11.    
  12.     data_sheet = wb.sheets[sheet_name]
  13.    
  14.     start_row = 2
  15.     end_row = data_sheet.range(f'{date_col}1').end('down').row
  16.    
  17.     for i in range(start_row, end_row + 1):
  18.         sheet.clear_contents()
  19.         
  20.         # 复制日期和现金流数据到'计算' sheet
  21.         date = data_sheet.range(f"{date_col}{i}").value
  22.         cash = data_sheet.range(f"{cash_col}{i}").value
  23.         present_value = data_sheet.range(f"{present_value_col}{i}").value
  24.         
  25.         sheet.range('A1').value = date
  26.         sheet.range('B1').value = cash
  27.         
  28.         for j in range(i + 1, end_row + 1):
  29.             next_date = data_sheet.range(f"{date_col}{j}").value
  30.             next_cash = data_sheet.range(f"{cash_col}{j}").value
  31.             sheet.range(f'A{j-i+1}').value = next_date
  32.             sheet.range(f'B{j-i+1}').value = next_cash
  33.         
  34.         if cash != 0:
  35.             sheet.range(f'B{end_row-i+2}').value = cash + present_value
  36.         else:
  37.             sheet.range(f'B{end_row-i+2}').value = present_value
  38.         
  39.         # 使用 Excel 公式 XIRR
  40.         xirr_formula = f'=XIRR(B1:B{end_row-i+2}, A1:A{end_row-i+2})'
  41.         sheet.range(f'C1').formula = xirr_formula
  42.         
  43.         # 将结果写回原始表
  44.         data_sheet.range(f"{start_cell}{i}").value = sheet.range('C1').value
  45.    
  46.     # 保存并关闭Excel文件
  47.     wb.save()
  48.     wb.close()

  49. # 使用示例
  50. Excel_Xirr('现金流示例2.xlsx', '006593', 'F', 'G', 'P', 'K3')
复制代码


注意事项:

1. 确保 `xlwings` 和 Excel 都安装正确。
2. 确保 Excel 的计算功能正常。
3. 使用 `range` 而不是 `api`,代码更简洁。
4. 检查数据是否按照预期在 Excel 中。
5. 避免频繁清空 sheet 内容,直接使用新的起始位置。
   
请根据具体需求调整代码。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-11-2 00:11:17 | 显示全部楼层
shadowmage 发表于 2024-11-01 23:48
实际上,刚刚发现,这个计算xirr的功能,还是用VBA实 ...


确实,使用VBA来计算XIRR可能会更直接和高效。以下是一个简单的VBA代码示例,可以帮助你在Excel中计算XIRR:

1. 打开Excel,按 `Alt + F11` 打开VBA编辑器。
2. 在VBA编辑器中,选择 `Insert` > `Module`,然后在模块中粘贴以下代码:

  1. Function CalculateXIRR(dates As Range, cashFlows As Range) As Double
  2.     On Error GoTo ErrorHandler
  3.     CalculateXIRR = Application.WorksheetFunction.Xirr(cashFlows, dates)
  4.     Exit Function
  5. ErrorHandler:
  6.     CalculateXIRR = CVErr(xlErrValue)
  7. End Function
复制代码


3. 返回Excel工作表,在单元格中输入公式 `=CalculateXIRR(A1:A10, B1:B10)`,其中 `A1:A10` 是日期范围,`B1:B10` 是现金流范围。

这个VBA函数会调用Excel内置的XIRR函数来计算结果,并且在遇到错误时返回一个错误值。这样可以避免在Python中处理复杂的Excel操作,同时利用Excel的内置功能来简化计算过程。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-9-29 03:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表