<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Calculate multiple feature class fields from stand alone table in Python Questions</title>
    <link>https://community.esri.com/t5/python-questions/calculate-multiple-feature-class-fields-from-stand/m-p/608127#M47460</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;Greetings,&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I have two feature classes and four tables stored in a file based geodatabase that periodically need attributes recalculated based on data stored in and Excel spreadsheet.&amp;nbsp; Any ideas on how to establish a Join then Calculate the attributes based on columns in Excel using Python?&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;The Joins would all be 1 to 1.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;The calculations are simple, ie.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;OilField_Locations.FIELD_ID = !OilFields$.FIELD_ID! (calculate fc field = column in Excel)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;but I have around 250 fields to calculate and do not have any desire to go through them manually.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Thanks!&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Wed, 01 Jun 2011 22:06:25 GMT</pubDate>
    <dc:creator>ChristopherKesler</dc:creator>
    <dc:date>2011-06-01T22:06:25Z</dc:date>
    <item>
      <title>Calculate multiple feature class fields from stand alone table</title>
      <link>https://community.esri.com/t5/python-questions/calculate-multiple-feature-class-fields-from-stand/m-p/608127#M47460</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;Greetings,&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I have two feature classes and four tables stored in a file based geodatabase that periodically need attributes recalculated based on data stored in and Excel spreadsheet.&amp;nbsp; Any ideas on how to establish a Join then Calculate the attributes based on columns in Excel using Python?&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;The Joins would all be 1 to 1.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;The calculations are simple, ie.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;OilField_Locations.FIELD_ID = !OilFields$.FIELD_ID! (calculate fc field = column in Excel)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;but I have around 250 fields to calculate and do not have any desire to go through them manually.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Thanks!&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 01 Jun 2011 22:06:25 GMT</pubDate>
      <guid>https://community.esri.com/t5/python-questions/calculate-multiple-feature-class-fields-from-stand/m-p/608127#M47460</guid>
      <dc:creator>ChristopherKesler</dc:creator>
      <dc:date>2011-06-01T22:06:25Z</dc:date>
    </item>
    <item>
      <title>Re: Calculate multiple feature class fields from stand alone table</title>
      <link>https://community.esri.com/t5/python-questions/calculate-multiple-feature-class-fields-from-stand/m-p/608128#M47461</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;1. Load the spreadsheet into a table.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;If you dump the spreadsheet to a .CSV file first and define a Schema.ini then it will load nicely as a formatted table using the CopyTable_management tool. Schema.ini is a default Windows function.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Note that a spreadsheet is not a database and is not supported to be reliably loaded with a satisfactory schema because columns are not defined, only formatted. Default widths are 255 chars for example.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;2. If you have to update multiple sheets from one table, create a dictionary using the key value and the attribute.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;3. Run an updateCursor on each target table and push the new values in using the dictionary as a lookup.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Using the join tools are a bit slow.&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 03 Jun 2011 01:29:53 GMT</pubDate>
      <guid>https://community.esri.com/t5/python-questions/calculate-multiple-feature-class-fields-from-stand/m-p/608128#M47461</guid>
      <dc:creator>KimOllivier</dc:creator>
      <dc:date>2011-06-03T01:29:53Z</dc:date>
    </item>
    <item>
      <title>Re: Calculate multiple feature class fields from stand alone table</title>
      <link>https://community.esri.com/t5/python-questions/calculate-multiple-feature-class-fields-from-stand/m-p/608129#M47462</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;Thank you for the direction.&amp;nbsp; Creatings CSV files from the six tables in my Excel workbook may be an acceptable alternative.&amp;nbsp; I am still looking for a more automated approach. I established the Joins manually in an ArcMap document for now and will focus on the field calculations.&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 03 Jun 2011 13:31:46 GMT</pubDate>
      <guid>https://community.esri.com/t5/python-questions/calculate-multiple-feature-class-fields-from-stand/m-p/608129#M47462</guid>
      <dc:creator>ChristopherKesler</dc:creator>
      <dc:date>2011-06-03T13:31:46Z</dc:date>
    </item>
    <item>
      <title>Re: Calculate multiple feature class fields from stand alone table</title>
      <link>https://community.esri.com/t5/python-questions/calculate-multiple-feature-class-fields-from-stand/m-p/608130#M47463</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;If you want a more automated approach, you can use the dispatch com interface that we used to use for ArcGIS9. This works well to get direct access to a spreadsheet and each of the sheets.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;This is well explained in "Python Programming on Win 32" by Hammond and Robinson.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;PRE class="lia-code-sample line-numbers language-none"&gt;o = win32com.client.Dispatch("Excel.Application")
o.Visible = 1
o.Workbooks.Add() # for office 97 �?? 95 a bit different!
o.Cells(1,1).Value = "Hello" &lt;/PRE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;To make accessing Excel a bit easier, Mark Hammond suggested a small module to get the data which I called exceldemos.py:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;PRE class="lia-code-sample line-numbers language-none"&gt;# Excel module from Mark Hammond
# Python Programming on Win 32
import win32com.client
import win32com.client.dynamic
from pywintypes import UnicodeType, TimeType

import pprint
import os
import time
import string


class easyExcel:
&amp;nbsp;&amp;nbsp;&amp;nbsp; """A utility to make it easier to get at Excel.&amp;nbsp; Remembering
&amp;nbsp;&amp;nbsp;&amp;nbsp; to save the data is your problem, as is&amp;nbsp; error handling.
&amp;nbsp;&amp;nbsp;&amp;nbsp; Operates on one workbook at a time."""
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; def __init__(self, filename=None):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.xlApp = win32com.client.dynamic.Dispatch('Excel.Application')
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if filename:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.filename = filename
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.xlBook = self.xlApp.Workbooks.Open(filename)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.xlBook = self.xlApp.Workbooks.Add()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.filename = ''&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; def save(self, newfilename=None):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if newfilename:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.filename = newfilename
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.xlBook.SaveAs(newfilename)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.xlBook.Save()

&amp;nbsp;&amp;nbsp;&amp;nbsp; def close(self):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.xlBook.Close(SaveChanges=0)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; del self.xlApp
&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; def show(self):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.xlApp.Visible = 1
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; def hide(self):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.xlApp.Visible = 0
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; def getBooks(self):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return self.xlApp.Worksheets

&amp;nbsp;&amp;nbsp;&amp;nbsp; def getName(self,sheet):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return self.xlBook.Worksheets(sheet).Name
#
#&amp;nbsp;&amp;nbsp;&amp;nbsp; now for the helper methods
#
&amp;nbsp;&amp;nbsp;&amp;nbsp; def getCell(self, sheet, row, col):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "Get value of one cell"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sht = self.xlBook.Worksheets(sheet)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return sht.Cells(row, col).Value
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; def setCell(self, sheet, row, col, value):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "set value of one cell"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sht = self.xlBook.Worksheets(sheet)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sht.Cells(row, col).Value = value
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; def getRange(self, sheet, row1, col1, row2, col2):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "return a 2d array (i.e. tuple of tuples)"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sht = self.xlBook.Worksheets(sheet)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return sht.Range(sht.Cells(row1, col1), sht.Cells(row2, col2)).Value
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; def setRange(self, sheet, leftCol, topRow, data):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; """insert a 2d array starting at given location. 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Works out the size needed for itself"""
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bottomRow = topRow + len(data) - 1
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rightCol = leftCol + len(data[0]) - 1
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sht = self.xlBook.Worksheets(sheet)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sht.Range(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sht.Cells(topRow, leftCol), 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sht.Cells(bottomRow, rightCol)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ).Value = data

&amp;nbsp;&amp;nbsp;&amp;nbsp; def getContiguousRange(self, sheet, row, col):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; """Tracks down and across from top left cell until it
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; encounters blank cells; returns the non-blank range.
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Looks at first row and column; blanks at bottom or right
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; are OK and return None witin the array"""
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sht = self.xlBook.Worksheets(sheet)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # find the bottom row
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bottom = row
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while sht.Cells(bottom + 1, col).Value not in [None, '']:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bottom = bottom + 1
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # right column
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; right = col
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while sht.Cells(row, right + 1).Value not in [None, '']:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; right = right + 1
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return sht.Range(sht.Cells(row, col), sht.Cells(bottom, right)).Value

&amp;nbsp;&amp;nbsp;&amp;nbsp; def getHeaderRange(self, sheet, row, col):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; """Tracks&amp;nbsp; across from left cell until it
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; encounters blank cells; returns the non-blank range.
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Looks at first row and column; blanks at bottom or right
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; are OK and return None within the array"""
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sht = self.xlBook.Worksheets(sheet)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # find the bottom row
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # bottom = row
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # while sht.Cells(bottom + 1, col).Value not in [None, '']:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bottom = bottom + 1
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # right column
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; right = col
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while sht.Cells(row, right + 1).Value not in [None, '']:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; right = right + 1
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return sht.Range(sht.Cells(row, col), sht.Cells(row, right)).Value&amp;nbsp;&amp;nbsp;&amp;nbsp; 
 
&amp;nbsp;&amp;nbsp;&amp;nbsp; def fixStringsAndDates(self, aMatrix):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # converts all unicode strings and times
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; newmatrix = []
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for row in aMatrix:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; newrow = []
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for cell in row:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if type(cell) is UnicodeType:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; newrow.append(str(cell))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; elif type(cell) is TimeType:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; newrow.append(int(cell))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; newrow.append(cell)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; newmatrix.append(tuple(newrow))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return newmatrix
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
def test():
&amp;nbsp;&amp;nbsp;&amp;nbsp; # puts things in a new sheet which it does not save
&amp;nbsp;&amp;nbsp;&amp;nbsp; spr = easyExcel()
&amp;nbsp;&amp;nbsp;&amp;nbsp; spr.show()
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; input = 'hello'
&amp;nbsp;&amp;nbsp;&amp;nbsp; spr.setCell('Sheet1',1,4, input)
&amp;nbsp;&amp;nbsp;&amp;nbsp; output = spr.getCell('Sheet1',1,4)
&amp;nbsp;&amp;nbsp;&amp;nbsp; print output
&amp;nbsp;&amp;nbsp;&amp;nbsp; assert input == output, 'setCell/getCell failed'
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; input = []
&amp;nbsp;&amp;nbsp;&amp;nbsp; for i in range(10):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; row = []
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for j in range(4):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; row.append(str('(%d,%d)'% (j, i)))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; input.append(tuple(row))
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; spr.setRange('Sheet1',2,2,input)
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; output = spr.getRange('Sheet1',2,2,11,5)
&amp;nbsp;&amp;nbsp;&amp;nbsp; # get rid of unicode strings
&amp;nbsp;&amp;nbsp;&amp;nbsp; output = spr.fixStringsAndDates(output)
&amp;nbsp;&amp;nbsp;&amp;nbsp; assert input == output, 'setRange/getRange test failed'
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; #get a contiguous range
&amp;nbsp;&amp;nbsp;&amp;nbsp; output2 = spr.getContiguousRange('Sheet1',2,2)
&amp;nbsp;&amp;nbsp;&amp;nbsp; dimensions = (len(output2), len(output2[0]))
&amp;nbsp;&amp;nbsp;&amp;nbsp; assert dimensions == (10, 4), 'getContiguousRange failed'
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; print 'passed!'
&amp;nbsp;&amp;nbsp;&amp;nbsp; 

# if __name__ == '__main__' :
#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; test()
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/PRE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Then to get each sheet you can create a Python loop something line this:&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;The spreadsheet had data split into several tables, with headers. I needed to transpose the data and calculate some cross sections from a centreline.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;In my case I exported to CSV files and loaded them using another obsolete tool called CreateFeaturesFromText, but you could write the data directly into a table using a cursor.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;PRE class="lia-code-sample line-numbers language-none"&gt;# load reachs and crosssections from a spreadsheet
# getwater3.py
# get channel centreline and number nodes uniquely
# dropping off duplicates
# calculate bearing of nodes in geographic degrees
# Kimo
# 6 October 2005
# upgrade to average angles for middle points of a reach
# 7 October 2005
# 10 October 2005
# offset one more row to allow for max water level calc
# does not get all the other water levels, just bottom and max
# better to load database of levels for each section for joining later
# so that we can create a surface for each time step from same cross sections
# ref first field for sorting and joining
# pad chainage
# removed max row again
# but too late, have to have it.
# 
# import win32com.client
import win32com.client.dynamic
import os,sys
from math import *

# sys.path.append("d:\\project\\python")
import exceldemos
 
homedir = "e:/toolbox/scratch"
os.chdir(homedir)

xlApp = win32com.client.dynamic.Dispatch('Excel.Application')
filename = "e:/example/GISTransfer.xls"

spr = exceldemos.easyExcel(filename)

f1 = open("channel.txt","w")&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # polyline generate file
f2 = open("channel_att.txt","w") # polyline attributes
f3 = open("channel_node.txt","w")# xsection nodes, can load as XY events
f4 = open("channel_skip.txt","w")# rejects - duplicate nodes
f5 = open("channel_xsec.txt","w")# xsection ref,x,y,theta for joining to xsections

# there are multiple worksheets
# so loop over all to combine into single output
max = 0
lstRef = []
try :
&amp;nbsp;&amp;nbsp;&amp;nbsp; for b in spr.getBooks() :
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; max += 1
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print "workbook: ",b.Name
&amp;nbsp;&amp;nbsp;&amp;nbsp; print "Workbooks found: ",max
&amp;nbsp;&amp;nbsp;&amp;nbsp; row = 0
&amp;nbsp;&amp;nbsp;&amp;nbsp; # output file headers
&amp;nbsp;&amp;nbsp;&amp;nbsp; print &amp;gt;&amp;gt; f1,'Polyline'&amp;nbsp;&amp;nbsp; # for Toolbox loader
&amp;nbsp;&amp;nbsp;&amp;nbsp; print &amp;gt;&amp;gt; f2,'rid,reach'
&amp;nbsp;&amp;nbsp;&amp;nbsp; print &amp;gt;&amp;gt; f3,'ref,nodeid,x,y,z,w,theta,rid,reach,chain'
&amp;nbsp;&amp;nbsp;&amp;nbsp; print &amp;gt;&amp;gt; f4,'rec,x,y,reach,chain,z,w'
&amp;nbsp;&amp;nbsp;&amp;nbsp; # no header for f5 xsec
&amp;nbsp;&amp;nbsp;&amp;nbsp; # print &amp;gt;&amp;gt; f5,'ref,x,y,theta,maxwater'
&amp;nbsp;&amp;nbsp;&amp;nbsp; rec = 1
&amp;nbsp;&amp;nbsp;&amp;nbsp; id = 0
&amp;nbsp;&amp;nbsp;&amp;nbsp; rn = 0
&amp;nbsp;&amp;nbsp;&amp;nbsp; # skip first sheet
&amp;nbsp;&amp;nbsp;&amp;nbsp; for sheetindex in range(2,5) :
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # get number of columns
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; header = spr.getHeaderRange(sheetindex,3,1)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; columns = len(header[0])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print "Length of header",columns
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print "Beginning :",spr.getName(sheetindex)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; aHeader = spr.getRange(sheetindex,1,1,6,columns)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # transpose rows and columns
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; headerpivot =&amp;nbsp; [[r[col] for r in aHeader] for col in range(len(aHeader[0]))]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # initialize counters
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rname = ""
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rx = 0
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ry = 0
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; i = 0
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rej = 0
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; colcount = len(headerpivot[1:])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print "Columns",colcount
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (a,b,c,d,e,w) in headerpivot[1:] :&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # print rec,a,b,c,d,e,w
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # a X coordinate
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # b Y coordinate
# ..... snip to fit forum text limit .....
&amp;nbsp;&amp;nbsp;&amp;nbsp; print &amp;gt;&amp;gt; f1,"END"
&amp;nbsp;&amp;nbsp;&amp;nbsp; print "records :",rec,"nodes",id,"reaches",rn,"rejects",rej
&amp;nbsp;&amp;nbsp;&amp;nbsp; f1.close()
&amp;nbsp;&amp;nbsp;&amp;nbsp; f2.close()
&amp;nbsp;&amp;nbsp;&amp;nbsp; f3.close()
&amp;nbsp;&amp;nbsp;&amp;nbsp; f4.close()
&amp;nbsp;&amp;nbsp;&amp;nbsp; f5.close()
&amp;nbsp;&amp;nbsp;&amp;nbsp; spr.close()
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; del xlApp
except :
&amp;nbsp;&amp;nbsp;&amp;nbsp; print "cleanup close"
&amp;nbsp;&amp;nbsp;&amp;nbsp; f1.close()
&amp;nbsp;&amp;nbsp;&amp;nbsp; f2.close()
&amp;nbsp;&amp;nbsp;&amp;nbsp; f3.close()
&amp;nbsp;&amp;nbsp;&amp;nbsp; f4.close()
&amp;nbsp;&amp;nbsp;&amp;nbsp; f5.close()
&amp;nbsp;&amp;nbsp;&amp;nbsp; spr.close()
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; del xlApp
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&lt;/PRE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;The spreadsheet is a bit large to include, I hope this is enough of a clue to encourage you to buy the book, which is now available in digital format.&lt;/SPAN&gt;&lt;BR /&gt;&lt;A href="http://oreilly.com/catalog/9781565926219" rel="nofollow noopener noreferrer" target="_blank"&gt;http://oreilly.com/catalog/9781565926219&lt;/A&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Sun, 12 Dec 2021 02:02:00 GMT</pubDate>
      <guid>https://community.esri.com/t5/python-questions/calculate-multiple-feature-class-fields-from-stand/m-p/608130#M47463</guid>
      <dc:creator>KimOllivier</dc:creator>
      <dc:date>2021-12-12T02:02:00Z</dc:date>
    </item>
  </channel>
</rss>

