2011-10-03 121 views
1

我一直在花费更多的周末试图找出使用Python将MS Access表格中的数据传输到Excel表格的最佳方式。我发现了一些可能有用的模块(execsql,python-excel),但是由于我有限的知识和必须使用的模块来创建某些数据(我是GIS专业人员,所以我使用空间数据创建ArcGIS arcpy模块插入访问表中)使用Python将MS Access中的数据复制到MS Excel中

我不确定最佳方法应该是什么。我需要做的就是将访问的4列数据复制到excel,然后格式化excel。格式化部分已解决。

我应该:

迭代通过使用光标和莫名其妙的行加载行到Excel? 将访问列复制到excel? 在Excel中导出整个访问表到一个表中?

感谢您的任何建议。

回答

1

我目前使用XLRD模块从Excel电子表格和插入光标中吸取数据以创建要素类,这非常有效。

您应该可以使用搜索光标遍历要素类记录,然后使用XLWT Python模块(http://www.python-excel.org/)将记录写入Excel。

+0

嘿丹尼尔,这是我最终做的。感谢您的指导。我会用我的代码回答我的问题。 – Mike

1

您可以使用ADO从Access读取数据(这里是Access 2007+(.accdb files)Access 2003-(.mdb files)连接字符串),比使用Excel的Range.CopyFromRecordset方法(假设你是通过COM使用Excel)来复制整个记录到Excel中。

+0

嘿谢谢伊丹。我找到了一个解决方案,但是我仔细查看了你的链接,他们可能对我对未来的一些想法有用。 – Mike

1

最好的方法可能是不使用Python来执行此任务。

您可以在Excel中使用宏记录器来记录外部数据导入Excel。 启动宏记录器后,点击Data -> Get External Data -> New Database Query并输入您的条件。数据导入完成后,您可以查看生成的代码,并用变量替换硬编码的搜索条件。

+0

嘿米奇。感谢您花时间回答。我有点用python戴上手铐。我正在创建一个ArcGIS工具,它只能使用python创建。他们的文件被称为要素类,它使用Access作为底层数据库。我的最终用户只能使用我在Excel中创建的数据。这对Python来说可能过于雄心勃勃? – Mike

1

另一个想法 - 格式化部分有多重要?如果您可以消除格式化,则可以将数据输出为CSV。 Excel可以打开CSV文件,并且CSV格式比Excel格式简单得多 - 它非常简单,你可以直接从Python写入文本文件,这样就不需要混淆Office COM对象。

2

我终于找到了一种方法来做到这一点。我想我会将我的代码发布给任何可能遇到相同情况的人。我使用一些GIS文件,但如果不这样做,可以将变量设置为目录路径,而不是使用env.workspace,并使用游标搜索而不是arcpy.SearchCursor函数,那么这是可行的。

import arcpy, xlwt 
from arcpy import env 
from xlwt import Workbook 

# Set the workspace. Location of feature class or dbf file. I used a dbf file. 
env.workspace = "C:\data" 

# Use row object to get and set field values 
cur = arcpy.SearchCursor("SMU_Areas.dbf") 

# Set up workbook and sheet 
book = Workbook() 
sheet1 = book.add_sheet('Sheet 1') 
book.add_sheet('Sheet 2') 

# Set counter 
rowx = 0 

# Loop through rows in dbf file. 
for row in cur: 
    rowx += 1 
    # Write each row to the sheet from the workbook. Set column index in sheet for each column in .dbf 
    sheet1.write(rowx,0,row.ID) 
    sheet1.write(rowx,1,row.SHAPE_Area/10000) 
    book.save('C:\data\MyExcel.xls') 

del cur, row 
+0

您每行保存一次文件,而不是只保存一次。 unindent'book.save(.....)'行。 –

+0

这个问题可能会比[GIS](http://gis.stackexchange.com)更有用。 –