|
02.09.2016., 10:50 | #1 |
Moderator
Datum registracije: Dec 2004
Lokacija: Zagreb, Tresnjevka
Postovi: 9,500
|
Visual studio + excel; korištenje funkcija excela unutar Visual Studia (MATCH)
Pozdrav, Imam jedan glupi problem unutar Visual Studia 2015 kojeg ne mogu riješiti. Imam Excel tablicu koja se sastoji od 16 redova i dvije kolumne ("tip" i "id"). Unutar Visual Studia 2015 sam generirao kod koji treba uzeti podatke iz tablice i generirati jednostavan XML file. Ono što me muči jest kako da iskoristim unutar VS-a funkciju MATCH iz Excela ? Puca mi na njemu kod, a ne znam di je problem ? Uzmite u obzir da ne znam programirati, ali je silom prilika bilo potrebno da sam napišem softver za povezivanje 2 CAD softvera u 2 dana, pa je google radio punom parom i ima svega u kodu (različitih stilova programiranja ). Error koji dobijem: Code:
Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click Dim excelApp As Application Dim wb As _Workbook Dim ws As _Worksheet ' Postavljanje varijable na My Documents path. Dim mydocpath As String = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) ' excel application referenca excelApp = New Application excelApp.Visible = True excelApp.ScreenUpdating = True ' Otvaranja excela wb = excelApp.Workbooks.Open(Path.Combine(mydocpath, "Book1.xlsx")) ' referenca na sheet broj 1 ws = wb.Worksheets(1) 'Traženje dimenzija tablice (koliko ima redova i kolumni) Dim LastCol As Long Dim LastRow As Long Dim i As Integer LastCol = ws.UsedRange.SpecialCells(XlCellType.xlCellTypeLastCell).Column LastRow = ws.UsedRange.SpecialCells(XlCellType.xlCellTypeLastCell).Row ' Napiši pocetni tekst u test.XML Dim startlines() As String = {"Ovo je početak XML-a", "Dalje slijede podaci iz excel tablice", ""} 'Write the beginning fixed string array to a New file named "text.xml". Using outputFile As New StreamWriter(mydocpath & Convert.ToString("\test.xml")) For Each startline As String In startlines outputFile.WriteLine(startline) Next End Using 'POČETAK DINAMIČKOG ZAPISIVANJA XML-a iz TABLICE! For i = 2 To LastRow Dim id As String Dim type As String 'Povezivanje varijabli sa ćelijama u Excelu type = ws.Range("A" & i).Value.ToString id = ws.Range("B" & i).Value.ToString 'template sklopova u "test.XML" If type = "sklop" Then Dim sklops() As String = { "<object>", "<type=""Sklop"" id=""" & id & """>", " <Name>Sklop" & id & "</Name>", " </type>", " </object>"} 'Zapisi sklopve u "test.xml". Using fs As StreamWriter = File.AppendText(mydocpath & Convert.ToString("\test.xml")) For Each sklop As String In sklops fs.WriteLine(sklop) Next End Using Dim jot As Integer Dim TrenutniComponent As String Dim TrenutniId As String Dim brojpartova As Double brojpartova = excelApp.WorksheetFunction.Match("sklop", "A3:A16", 0) For jot = 1 To brojpartova TrenutniComponent = excelApp.Cells(i + jot, 1).Value TrenutniId = excelApp.Cells(i + jot, 2).Value Dim parts() As String = { "<object>", "<type=""Part"" id=""" & id & """>", " <Name>Part" & id & "</Name>", " </type>", " </object>"} 'Write additional info to "test.xml". Using fs As StreamWriter = File.AppendText(mydocpath & Convert.ToString("\test.xml")) For Each part As String In parts fs.WriteLine(part) Next End Using Next End If Next excelApp.Quit() End Sub Kod nije do kraja napisan (iz razloga što se uvijek traži od A3:A16 MATCH a trebalo bi od Ai pa koliko treba). No ako prođe tu, onda ću znati i za ubuduće. P.S. Naravno da sam kao prava noobara napravio gumbek koji to sve radi jer onda izgleda kod profesionalno Sve imate u attachmentu! Book1.xlsx treba biti u My Documents folderu. Hvala na pomoći i pozdrav EDIT: Jesam li ja to krivo koristio input za Range A3:A16 ? Nešto sam sad načačkao i prošlo je, odnosno dobio sam vrijednost ? Naravno morao sam staviti i excelApp.Match bez WorksheetFunction između.
__________________
"Everything with a heartbeat can knock you down" Zadnje izmijenjeno od: Vuco. 02.09.2016. u 11:05. |
04.09.2016., 11:19 | #2 | ||
only fool, not a horse
Datum registracije: Apr 2008
Lokacija: near zgb
Postovi: 1,276
|
Citiraj:
Pretpostavljam da ide excelApp.WorksheetFunction.Match("sklop", A3:A16, 0) I još jedna sitnica, xml ti mora imat root element, i ne smije imati "naslov" ala ovo: Citiraj:
Code:
<root> <naslov><\naslov> <object........ <\root> |
||
|
|
Oglas
|
|
11.09.2016., 21:43 | #3 |
Moderator
Datum registracije: Dec 2004
Lokacija: Zagreb, Tresnjevka
Postovi: 9,500
|
Hvala Rodney na odgovoru, malo sam ga kasno vidio. Nemam posljednju verziju koda sad kod sebe, no mislim da se rješenje nije mijenjalo. Obzirom na nedostatak znanja oko programiranja, snašao sam se na sljedeći način, tako da sam u Excelu količinu čelija koja se gleda, definirao sa dvije slične varijable: rasponrng koja definira koje ćelije se trebaju gledati, kao string. rng - samo je definiran kao Range varijabla unutar Excela-a Code:
Dim rasponrng As String = "A" & i + 1 & ":A" & i + 20 Dim rng As Range = excelApp.ActiveSheet.Range(rasponrng) Dim PozicijaSljedecegParta As Double PozicijaSljedecegParta = excelApp.Match("Sklop", rng, 0) Uglavnom, cilj je bio dobiti XML oblik datoteke, koja ima točno određenu strukturu inače je drugi softver neće pročitati nikako. Kod je bio dosta bugovit sve dok nisam prestao koristiti ove "wb" i "ws" varijable koje su definirale dijelove Excel Interop Referencu unutar Visual Studio-a. Code:
' Otvaranja excela wb = excelApp.Workbooks.Open(Path.Combine(mydocpath, "Book1.xlsx")) ' referenca na sheet broj 1 ws = wb.Worksheets(1) Skinuo sam si tutorial na HR za Visual Basic, barem da pohvatam osnove i počnem se koristiti bolje dokumentacijom. Smatram da je to must-have za baratanje objektnim programiranjem.
__________________
"Everything with a heartbeat can knock you down" |
|
|
Oglas
|
|
Uređivanje | |
|
|