用Iron Python编写xlsx文件

时间:2015-04-06 16:07:40

标签: python excel ironpython openpyxl

我正在尝试使用Iron Python(v2.7.5)创建一个xlsx文件 我安装了最新版本的openpyxl(v2.2.1)并测试了一个简约的例子,几乎完全取自openpyxl文档:

from openpyxl import Workbook
wb = Workbook()
wb.save('empty.xlsx')

我在CPython中正如预期的那样工作(创建一个空的工作簿),但在Iron Python中它只是抛出异常。

  File "test_openpyxl.py", line 15, in <module>
  File "C:\Program Files (x86)\IronPython 2.7\lib\site-packages\openpyxl\workbook\workbook.py", line 298, in save
  File "C:\Program Files (x86)\IronPython 2.7\lib\site-packages\openpyxl\writer\excel.py", line 196, in save_workbook
  File "C:\Program Files (x86)\IronPython 2.7\lib\site-packages\openpyxl\writer\excel.py", line 179, in save
  File "C:\Program Files (x86)\IronPython 2.7\lib\site-packages\openpyxl\writer\excel.py", line 67, in write_data
  File "C:\Program Files (x86)\IronPython 2.7\lib\site-packages\openpyxl\workbook\properties.py", line 103, in write_properties
  File "C:\Program Files (x86)\IronPython 2.7\lib\site-packages\openpyxl\utils\datetime.py", line 33, in datetime_to_W3CDTF

TypeError:预期日期时间,得到Object_1 $ 1

我猜这个错误是由一些.NET对象意外弹出引起的,但我对Object_1的东西感到困惑,所以无法找到它的对象。

我也尝试过旧版本的软件包,只有v1.8.0才能获得一些结果:

  • openpyxl-2.1.0无异常运行(仅限弃用警告),但Excel会在创建的文件中抱怨损坏的内容。enter code here
  • openpyxl-2.0.5抛出另一个异常(already reported here
  • openpyxl-1.8.6抛出“ImportError:无法从openpyxl.styles导入PatternFill”
  • openpyxl-1.8.0打印出一个警告(UserWarning: Unable to import 'xml.etree.cElementree'. Falling back on 'xml.etree.Elementree'),经过一番考虑后非常合理。所以这可能是唯一有效的版本。

在我进一步挖掘之前,我想问社区:  1.有没有人设法在IronPyth下使用openpyxl  2.是否有其他可行的库 创建格式适中的xlsx文件?

3 个答案:

答案 0 :(得分:2)

我认为简短的回答是你不能将openpyxl与IronPython一起使用。我们使用描述符进行输入,而IronPython似乎很难与它们斗争。

答案 1 :(得分:1)

我们已成功使用ClosedXML - 一个相当活跃且受支持的项目 - 用于从.NET读取和编写格式化的XLSX数据。我们的主要用例以C#为中心,但有时我们也使用过IronPython。

该项目有NuGet packages,并以Microsoft官方的DocumentFormat.OpenXml SDK为基础,同时更易于使用。

我无法对openpyxl发表评论,因为我没有使用它,但你发现的错误报告以及IronPython中Ctypes的一般情况使得这种技术组合很可能无法解决(现在)。

答案 2 :(得分:-1)

尝试使用clr模块并参考Microsoft Excel “导入clr” clr.AddReferenceByName('Microsoft.Office.Interop.Excel')