Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: [VB.NET] Tietojen tulostus Exceliin ja ActiveX ongelma

Sivun loppuun

moks [12.08.2008 10:07:10]

#

Ongelmani on tietojen tulostaminen Textboxeista Excel-kenttään seuraavalla koodilla:

Dim xlApp As Microsoft.Office.Interop.Excel.Application
Dim xlBook As Microsoft.Office.Interop.Excel.Workbook
Dim xlSheet As Microsoft.Office.Interop.Excel.Worksheet
Set xlApp = CreateObject("Microsoft.Office.Interop.Excel.Application
")
Set xlBook = xlApp.Workbooks.Add
Set xlSheet = xlBook.Worksheets(1)

'Syötettävää kamaa.
xlSheet.Cells(1, 1) = TextBox1.Text

Toteutus kuitenkin kusee ja antaa "Exception was unhandled" -Cannot create ActiveX component, viitaten neljänteen riviin. Add referencessä lisättynä on mm. Microsoft Excel 12.0 Object Library ja Microsoft ActiveX Data Objects 2.8 Library, mutta ongelma pysyy.

K_L [12.08.2008 13:03:25]

#

Terve,

Voi olla että, minulla on vanhempi Office käytössä, mutta löytyykö sinulta referenssiä Microsoft.Office.Core

Imports System.IO
Imports Microsoft.Office.Core

...

        Dim oXL As Excel.Application
        Dim oWB As Excel.Workbook
        Dim oSheet As Excel.Worksheet
        Dim oRng As Excel.Range

        ' Start Excel and get Application object.
        oXL = CreateObject("Excel.Application")

Tämä toimii minulla, mutta voipi olla vanhentunut.

moks [12.08.2008 13:26:33]

#

Jep, ei pelittänyt minulle: "Muoto on vanha tai tyyppikirjasto ei kelpaa". Kiitoksia kuitenkin.

moks [14.08.2008 09:11:53]

#

Jahas syynä ongelmaan näköjään oli kielissä. Koska XP pyöri suomeksi ja excel englanniksi, homma ei pelittänyt. Ratkaisuksi löytyi seuraavaa:

Dim oApp As New Microsoft.Office.Interop.Excel.Application()
oApp.Visible = True
oApp.UserControl = True
Dim oBooks As Object = oApp.Workbooks
Dim ci As System.Globalization.CultureInfo = New _ System.Globalization.CultureInfo("en-US")
oBooks.GetType().InvokeMember("Add", Reflection.BindFlags.InvokeMethod, _
Nothing, oBooks, Nothing, ci)

Tämän kanssa olen kuitenkin aivan jumissa. Miten saan tuohon pakettiin lyötyä tiedoston avauksen mukaan, esim. c:\E1.xls sekä sheet rakenteen tyyliin aSheet.Cells(2, 2) = textbox1.text?

K_L [19.08.2008 13:36:40]

#

Oletko luonut uuden workbookin?

oBooks = oApp.Workbooks.Add
aSheet = oBooks.ActiveSheet

Voipi olla taas vanhaa tietoa :D

moks [20.08.2008 07:48:36]

#

Sheet syötön sain toimimaan jo aikaisemmin, joskin en tuon .Add kanssa. Sitä käyttäessäni puskee kokoajan: COMException was unhandled - "Muoto on vanha tai tyyppikirjasto ei kelpaa. (Exception from HRESULT: 0x80028018)". Sen sijaan excel tiedoston avausta en vaan saa pelittämään sitten millään.

neau33 [20.08.2008 14:02:58]

#

Moikka moks!

olisikohan kenties oheisesta sälästä mitään apua..?

Imports Excel=Microsoft.Office.Interop.Excel
Imports System

Public Class xlLuokka

Public Shared WithEvents xlapp As Excel.Application = New Excel.Application()
Public Shared xlbook As Excel.Workbook
Public Shared xlsheet As Excel.Worksheet

Public Sub Avaa(ByVal strTykirja As String)
   xlApp = CType(CreateObject("Excel.Application"), Excel.Application)
   xlBook = CType(xlApp.Workbooks.Add(strTykirja), Excel.Workbook)
   xlsheet = CType(xlBook.Worksheets(1), Excel.Worksheet)
   xlsheet.Application.Visible = True
End Sub

Public Sub UusiTykirja()
   xlApp = CType(CreateObject("Excel.Application"), Excel.Application)
   xlBook = CType(xlApp.Workbooks.Add(Type.Missing), Excel.Workbook)
   xlsheet = CType(xlBook.Worksheets(1), Excel.Worksheet)
   xlsheet.Application.Visible = True
End Sub

Public Sub Sulje()
   Try
     xlbook.Close()
   Catch ex As Exception
   End Try
End Sub

Public Sub TallennaNimella(ByVal strKokoPolku As String)
   Try
     xlBook.SaveAs(strKokoPolku)
   Catch ex As Exception
   End Try
End Sub

Public Sub AktivoiSivu(ByVal strSivu As String)
   Try
     CType(xlBook.Worksheets(strSivu), Excel.Worksheet).Activate()
     xlsheet = Ctype(xlbook.Activesheet, Excel.Worksheet)
   Catch ex As Exception
   End Try
End Sub

Public Sub AktivoiSolu(ByVal x As Integer, ByVal y As Integer)
     CType(CType(xlBook.ActiveSheet, Excel.Worksheet).Cells(x, y), Excel.Range).Activate()
End Sub

Public Function LueSolu(ByVal x As Integer, ByVal y As Integer) As String
     LueSolu = CStr(CType(CType(xlBook.ActiveSheet, Excel.Worksheet).Cells(x, y), Excel.Range).Value)
     If Not LueSolu = "" Then Messagebox.Show(LueSolu.ToString())
End Function

Public Sub KirjoitaSoluun(ByVal x As Integer, ByVal y As Integer, ByVal arvo As String)
     CType(xlBook.ActiveSheet, Excel.Worksheet).Cells(x, y).Value=arvo
End Sub

End Class

moks [21.08.2008 09:06:55]

#

Kiitoksia paljon Nealle vastauksesta! Jotain pystyin tuosta soveltamaan sekä parin muun lähteen kautta sain vihdoin valmiin excel pohjan aukeamaan seuraavasti:

Dim oApp2 As New Microsoft.Office.Interop.Excel.Application()
Dim xlSheet2 As Object
oApp2.Visible = True
oApp2.UserControl = True
Dim oBooks2 As Object = oApp2.Workbooks

Dim oldCl2 As System.Globalization.CultureInfo = System.Threading.Thread.CurrentThread.CurrentCulture
System.Threading.Thread.CurrentThread.CurrentCulture = New System.Globalization.CultureInfo("en-US")
oApp2.Workbooks.Open("c:\1.xlsx")
System.Threading.Thread.CurrentThread.CurrentCulture = oldCl2
xlSheet2 = oApp2.Worksheets(1)

xlSheet2.cells(2, 2) = TextBox1.Text

Mutta vieläkin on ongelmia! Nyt menee jo varmaan tyhmyyden puolelle, mutten silti onnistu lukemaan kenttiä excelistä textboxiin. Tuolla xlSheet2.cells(2, 2) = Textbox1.Text pystyn kyllä kirjoittamaan ongelmitta exceliin, mutta toisinpäin homma tökkii taas ja pahasti.

neau33 [22.08.2008 10:48:09]

#

Moikka taas moks!

kokeile seuraavanlaista kaavaa...

'...
'...

Public Sub AktivoiSivu(ByVal strSivu As String)
   Try
     CType(xlBook.Worksheets(strSivu), Excel.Worksheet).Activate()
     xlsheet = Ctype(xlbook.Activesheet, Excel.Worksheet)
   Catch ex As Exception
   End Try
End Sub

Public Function LueSolu(ByVal x As Integer, ByVal y As Integer) As String
     Dim Arvo As Object = _
     CStr(CType(CType(xlBook.ActiveSheet, Excel.Worksheet).Cells(x, y), Excel.Range).Value)
     Return(Arvo.ToString())
End Function

Public Sub KirjoitaBoxiin()
  AktivoiSivu("Sheet2")
  Textbox1.Text = LueSolu(2,2)
End Sub

moks [25.08.2008 13:42:41]

#

Kiitoksia jälleen vastauksesta. Melkoisen tappelun jälkeen sain homman toimimaan. Ratkaisuna oli tunkea tuota cultureinfo rivistöä useampaankin väliin, mistä homma tosiaan kiikasti.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta