Hallo,
ich schlage mich nun seit längerem erfolglos mit dem Import einer Exel-Datei in AV herum. Möchte diese über eine Script direkt importieren, weil mir beim dBase import Umlaute etc. verlorengehen. Ich habe schon verschiedene Scripte ausprobiert, die Exel-Tabelle im verschiedenster Weise verändert, aber irgendetwas läuft falsch. Die Fehlermeldung lautet entweder "Can´t convert String to number" (obwohl ich die Spalten alle in Exel dementsprechend formatiert habe) oder "An nil objekt does not recognize request substitut".
Hat jemand eine Idee und kann mir weiterhelfen ?
Besten Dank
Tim
ich schlage mich nun seit längerem erfolglos mit dem Import einer Exel-Datei in AV herum. Möchte diese über eine Script direkt importieren, weil mir beim dBase import Umlaute etc. verlorengehen. Ich habe schon verschiedene Scripte ausprobiert, die Exel-Tabelle im verschiedenster Weise verändert, aber irgendetwas läuft falsch. Die Fehlermeldung lautet entweder "Can´t convert String to number" (obwohl ich die Spalten alle in Exel dementsprechend formatiert habe) oder "An nil objekt does not recognize request substitut".
Hat jemand eine Idee und kann mir weiterhelfen ?
Besten Dank
Tim
- Anmelden oder Registieren, um Kommentare verfassen zu können
Gespeichert von HeinzJ am Mi., 08.09.2004 - 12:36
Permalinksiehe
http://webgis.dyndns.org:8080/giswiki/Wiki.jsp?page=ExcelDatenNachArcV iewImportieren
Gruß, Heinz
Gespeichert von Jörg Thomsen am Mi., 08.09.2004 - 13:15
Permalinkdas klingt nach fehlender Fehlerabfangung im Import-Script.
"Can´t convert String to number" bedeutet das Zeichen, die keine Ziffern sind umgewandlet werden sollen, das geht natürlich nicht (vielleicht ist es 'nur' der tausender-Trenner). Das hat mit der Formatierung der Zellen in Excel nichts zu tun.
"An nil objekt does not recognize request substitut": substiute ersetzt Zeichen eines Strings (!) durch andere Zeichen, wenn nun ein Feld der Tabelle leer ist, dann erhält das Script offenbar ein nil-object (das was anderes als ein leerer String ist) und nil kennt die Methode Substitute nicht (wozu auch? ;-).
Jörg
Gespeichert von Jörg Thomsen am Mi., 08.09.2004 - 13:18
PermalinkGespeichert von HeinzJ am Mi., 08.09.2004 - 13:32
PermalinkZitat aus dem GISWiki ( http://www.giswiki.de )
Dementsprechend kommt man zwangsläufig zur Problematik, dass ESRI ArcView bis heute nicht beigebracht hat, das ein Komma auch ein "," sein kann und nicht nur ein ".". In ArcView wird "unser" Komma beim Import als Trennzeichen angesehen. Ein Punkt stellt in ArcView ein Komma dar.
Der Export aus Excel in eine Textdatei muss dies also berücksichtigen.
Hierfür geht man (in Windows) in die Systemeinstellungen und wählt dort die Ländereinstellungen. Nach Auswahl von z.B. Englisch/Großbritanien sollte in Excel ein Punkt statt eines Kommas erscheinen (jedenfalls bei mir). Daraufhin muss in Excel die ....
Gruß, Heinz
Gespeichert von Kreuels am Mi., 08.09.2004 - 13:58
Permalinkdanke für die schnellen Antworten. Leider komme ich damit noch nicht so ganz weiter.
Ich hatte auf den GISWIKI Seiten schon vorher geschaut, aber wenn ich es recht verstehe geht es hier doch nur um den direkten Import von dBase Tabellen, oder ? So gehe ich auch in 99 % aller Fälle vor, nur diesesmal würde ich halt gerne irgendwie die Umlaute erhalten.
Ich habe das Script übrigens nicht selbst geschrieben sondern nutzte die Funktionen der Extensions "Compiles Table Tools" und "Demo Tools".
Darin enthalten sind ja auch Anleitungen zu den Scripten die z.B. besagen das die erste Zeile DAten bzw. die Feldnamen enthalten muß u.s.w.
Vielleicht gibt es ja auch eine einfache Möglichkeit die Umlaute auf anderem Wege bei einem Export in eine dbf-Datei zu erhalten ? Hier im Forum wurde schon mal soetwas über verschiedene Zeichensätzte diskutiert... klappt bei mir leider auch nicht.
Tja, falls noch jemand Ideen hat....
Gruß
Tim
Gespeichert von Maxilla am Mi., 08.09.2004 - 15:25
PermalinksysClient.Request("selection")
Dies gibt aus dem englischen Excel zurück (Zahlen nur als Beispiel):
[Book1]Sheet1!R3C1:R5C1
wobei R = Row und C = Column
im deutschen Excel gibt dieselbe Request zurück:
[Mappe1]Tabelle1!Z3S1:Z5S1
wobei Z = Zeile und S = Spalte
In dem Skript werden im Folgenden die Buchstaben R und Z als Tokens benutzt und noch ein paar mal verwandt. Statt "3" und "1" bekommt ArcView dann aber im deutschen Excel "Z3S1" was sie logischerweise nicht in eine Zahl umwandeln kann.
Also:
Skript "Table.ImportFromExcel.C" öffnen und alle Vorkommen der besagten "R" und "C" durch "Z" bzw. "S" ersetzen, dann funktioniert's auch mit den Umlauten.
Gruß von Maxilla
Gespeichert von Maxilla am Do., 09.09.2004 - 11:52
PermalinkAlso, wer mag:
' Name: Table.ImportFromExcel
'
' Title: Creates a new table document from an Excel spreadsheet
'
' Topics: Tables
'
' Description: This script allows you to create a table document using the data
' contained in a Microsoft Excel Spreadsheet. Start Excel and open the spreadsheet
' that you want to use in ArcView, then run this script. A new table will be created
' by using DDE to talk to Excel. This script doesn't handle boolean fields, doesn't
' handle non-contiguous (a column without a field name), always assumes dates are of
' the format MM/dd/yy, and always writes a file called "C:\TEMP\EXCEL.DBF".
'
' Requires: Microsoft Excel is running and a selection exists. The first row in the
' rows contain data. You have a directory called "C:\TEMP" that you can write to.
'
' MODIFIED FOR GERMAN EXCEL : M.
'
sysClient = DDEClient.Make( "Excel","System")
if (sysClient.HasError) then
MsgBox.Info( sysClient.GetErrorMsg, "")
return NIL
' if you want to start Excel instead, use the following two lines instead of the two above
' system.execute("c:\msoffice\excel\excel.exe <path>\<book_name>.xls")
' sysClient = DDEClient.Make("Excel","System")
end
v= vtab.makenew("C:\temp\excel.dbf".AsFileName, dBase)
fldlst = {}
fulltopic = sysClient.Request("selection") 'returns [BookN]SheetN!RnCn:RnCn
sysClient.Close
topiclist=fulltopic.AsTokens("!:")
if (topiclist.count < 3) then
MsgBox.Info("Selection in Excel?","")
return NIL
end
sheetname = topiclist.get(0)
startrange = topiclist.get(1)
endrange = topiclist.get(2)
startrow = startrange.AsTokens("ZS").Get(0).AsNumber
startcol = startrange.AsTokens("ZS").Get(1).AsNumber
endrow = endrange.AsTokens("ZS").Get(0).AsNumber
endcol = endrange.AsTokens("ZS").Get(1).AsNumber
sheet = DDEClient.Make( "Excel", sheetname )
for each column_num in startcol..endcol
column_name = sheet.request( "Z"+startrow.AsString+"S"+column_num.AsString )
val = sheet.request( "Z"+(startrow+1).AsString+"S"+column_num.AsString )
if ((val.Trim.IsNumber) and (val.Trim.Contains("."))) then
decimal_places = (val.trim.count - val.trim.IndexOf(".")) - 1
f = field.make(column_name.trim,#FIELD_DECIMAL,12,decimal_places)
elseif (val.Trim.IsNumber) then
f = field.make(column_name.trim,#FIELD_DECIMAL,12,0)
elseif (val.Trim.Contains("/")) then
f = field.make(column_name.trim,#FIELD_DATE,8,0)
else
f = field.make(column_name.trim,#FIELD_CHAR,val.count+5,0)
' adding 5 to the length of the first string value of the column is arbitrary
' set it to whatever accommodates your data best
end
fldlst.add(f)
end
v.AddFields(fldlst)
for each row in (startrow+1)..endrow
i = 0
newRec = v.AddRecord
for each col in startcol..endcol
if (fldlst.get(i).GetType=#FIELD_CHAR) then
v.setvalue(fldlst.get(i),newRec,sheet.request( "Z"+row.AsString+"S"+col.AsString ).trim )
elseif (fldlst.get(i).GetType=#FIELD_DECIMAL) then
v.SetValue(fldlst.get(i),newRec,sheet.request( "Z"+row.AsString+"S"+col.AsString ))
else (fldlst.get(i).GetType=#FIELD_DATE)
the_date = date.make(sheet.request( "Z"+row.AsString+"S"+col.AsString ).trim,"MM/dd/yy")
v.setvalue(fldlst.get(i),newRec,the_date)
end
i = i + 1
end
end
table.make(v)
sheet.Close
Gespeichert von Kreuels am Do., 09.09.2004 - 14:27
Permalinkdanke für das Script. Habe es mal durchlaufen lassen und es funktioniert auch wunderbar mit einer dummy-Tabelle. Mit der eigentlichen klappt es leider auch nicht (an nil object does not recognize request Trim). Mit der Tabelle ist wohl einfach etwas faul, ich komme nur einfach nicht dahinter. Werde mir wohl irgenwie anders behelfen müssen, aber trotzdem vielen Dank für die Tipps !
Gruß
tim