我正在整理一个脚本,从访问表中获取一些数据并将其写入excel表。在这个过程中,我正在尝试格式化表格。我已将excel表的输出粘贴到我的脚本下面。
在下面的脚本中,我从访问表中提取数据并将其放入excel表中。它将第一列中的所有值分组(即所有M1,所有M20a,等等)。第二栏是以公顷为单位的相关区域。第三列是每个分组值的面积之和。
除了最后一组(ZWA)之外,所有区域的总和都是正确的并且在正确的位置。它没有写出该值的总和。我有一种感觉,我需要设置脚本,以便它检测到表中的最后一行。
import arcpy, xlwt, sys, traceback, datetime
from arcpy import env
from xlwt import *
from itertools import groupby
from collections import defaultdict
from time import strftime
# Set workspace for the file to be used
env.workspace = "Z:\TestFolder"
env.overwriteOutput = True
# Stores access table into a variable and sorts the SMU field ascendingly
cur = arcpy.SearchCursor("Access Table", "", "", "SMU", "SMU A")
# Create excel workbook
book = Workbook()
sheet1 = book.add_sheet('Sheet 1')
# Create a dictionary
col_counts = defaultdict(int)
# Set a varialb eto be used in looping through rwos and detecting when the value in the cell is different from the last
last_value = object()
# Set the start of 2 counters. rowx is to count rows in the access table. rowadd is to add the values in a field alled row.SHAPE_Area
rowx = 3
rowadd = 0
# Loop through the access table
for row in cur:
# Ask if the current value is not equal to the last value in the row.SMU column
if row.SMU != last_value:
last_value = row.SMU
# if the current value doesn't equal the last value, then place the sum of the row.SHAPE_Area field for the last value in a new cell in a different column.
sheet1.write(int(rowx+1),3,rowadd/10000)
# Reset counter to 0
rowadd = 0
# Add 2 to the counter to create a space between groups of values in the excel table
rowx += 2
else:
# Else only add 1 to the counter if the value in the cell reamisn the same as the last one
rowx += 1
# if the value of the row is the same as the last one, then add the values for a second column together and write to the excel sheet
if row.SMU == str(last_value):
rowadd += row.SHAPE_Area
print rowadd
sheet1.write(int(rowx),0,row.SMU)
sheet1.write(int(rowx),1,row.SHAPE_Area/10000)
# Set the counter to += the last value in the (col_counts[last_value]) variable and start over again
rowx += (col_counts[last_value])
# Save the workbook
book.save("Z:\TestFolder\simple.xls")
下面是excel中的输出表。看到我没有在第三列中获得ZWA总面积。谁能说明为什么会这样?我想摆脱第三列第一行的0。
0
M1 0.076492721
M1 0.406600839
M1 2.98016238
3.46325594
M20a 0.665489193
0.665489193
M21 0.005333282
0.005333282
M23b 0.190245719
M23b 0.233315779
0.423561498
S1 0.201021287
S1 0.176390376
S1 0.200409435
S1 0.009312814
S1 0.071782163
0.658916076
ZWA 0.387293182
答案 0 :(得分:0)
您需要类似下面的(未经测试的)代码。
import arcpy, xlwt, sys, traceback, datetime
from arcpy import env
#### from xlwt import *
#### (a) horrid, you need only 1 class (b) you already imported xlwt
### from itertools import groupby
#### good idea, but get some simple programming skills first
#### from collections import defaultdict #### why?
from time import strftime
# Set workspace for the file to be used
env.workspace = "Z:\TestFolder"
env.overwriteOutput = True
# Stores access table into a variable and sorts the SMU field ascendingly
cur = arcpy.SearchCursor("Access Table", "", "", "SMU", "SMU A")
# Create excel workbook
book = Workbook()
sheet1 = book.add_sheet('Sheet 1')
# Create a dictionary #### what for?
col_counts = defaultdict(int)
# Set a varialb eto be used in looping through rwos
# and detecting when the value in the cell is different from the last
previous = dummy = object()
# Set the start of 2 counters.
# rowx is to count rows in the excel table, NOT the access table
# rowadd is to add the values in a field alled row.SHAPE_Area
rowx = 3
rowadd = 0
# Loop through the access table
for row in cur:
if row.SMU != previous != dummy:
# if the current value doesn't equal the previous value,
# AND it's not the first row, then place
# the sum of the row.SHAPE_Area field for the previous value
# in a new cell in a different column.
rowx += 1 # start a new output row
sheet1.write(rowx, 3, rowadd/10000)
# Reset counter to 0
rowadd = 0
rowx += 1 # start a new output row
rowadd += row.SHAPE_Area
print rowadd
sheet1.write(rowx, 0, row.SMU)
sheet1.write(rowx, 1, row.SHAPE_Area/10000)
previous = row.SMU
# End of input. Write the final subtotal (unless there was no input)
if previous != dummy:
rowx += 1
sheet1.write(rowx, 3, rowadd/10000)
##### What is the purpose of this???
# Set the counter to += the last value in the
# (col_counts[previous]) variable and start over again
rowx += (col_counts[previous])
# Save the workbook
book.save(r"Z:\TestFolder\simple.xls")