hallå Ja, du kan snabba upp detta avsevärt. tackar! Anledningen till att det är så segt är framför all com-interop. Dvs när .NET ska prata med Excel som är COM/ActiceX så måste varje anrop översättas mellan olika lager. Bl.a. för att det är helt olika typer av minneshantering i de båda miljöerna. T.ex. kodraden: har gjort några försök nu... en del har klarnat, men inte allt tyvärr. Du kan antingen använda TextToColumns eller så kan du skapa en Variant-array som du istället skriver rakt in. Var skulle jag använda texttocolumns? kan inte hitta uttrycket i hjälpen ens. Öh... Det absolut snabbaste sättet (som jag har fattat det) att skapa Office-dokument är att första skapa XML-dokument, ladda in det i Excel och sedan spara det som xls. Det är inte så dumt. Excel-XML finns även i Office XP. (testa att spara som XML i Excel..) okej... jag är inte överdrivet bevandrad med detta språket och som Jansson antyder är jag helt dum i huvet. Niklas, jag glömde en "liten detalj". Yeijh! hur spara fil snabbare? tar för lång tid
jag har ett litet obekvämt problem när jag sparar undan data till en .xls-fil.
Frågan lyder:
varför tar det >1min att spara filen?
Jag har en savefiledialog så användaren kan välja vart och med vilket namn filen sparas. Det tar mer än en minut från det att jag trycker på "Spara" tills dess att savefiledialog öppnas. Finns det nån effektivisering att göra?
tacksam för hjälp
skickar med en bit av koden:
Private Sub MenuItem2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem2.Click
Dim SlaveX As Integer
Dim xlApp As Excel.Application
Dim xlBook As Excel.Workbook
Dim xlSheet1, xlSheet2, xlSheet3, xlSheet4, xlSheet5, xlsheet6 As Excel.Worksheet
xlApp = New Excel.Application
xlBook = xlApp.Workbooks.Open("C:\Documents and Settings\nwallstr\Desktop\VB infotiv\WindowsApplication1\template.xls")
'egen template-fil i samma katalog
xlSheet1 = CType(xlBook.Worksheets(1), Excel.Worksheet)
xlSheet2 = CType(xlBook.Worksheets(2), Excel.Worksheet)
xlSheet3 = CType(xlBook.Worksheets(3), Excel.Worksheet)
xlSheet4 = CType(xlBook.Worksheets(4), Excel.Worksheet)
xlSheet5 = CType(xlBook.Worksheets(5), Excel.Worksheet)
xlSheet6 = CType(xlBook.Worksheets(6), Excel.Worksheet)
'Simulation mode / Real mode
If RadioButtonSimulationMode.Checked = True Then
xlSheet1.Cells(3, 2) = "Simulation Mode"
Else
xlSheet1.Cells(3, 2) = "Real Mode"
End If
'Det.en settings
xlSheet1.Cells(7, 3) = TextBoxWDetEn1.Text
xlSheet1.Cells(8, 3) = TextBoxWDetEn2.Text
xlSheet1.Cells(9, 3) = TextBoxWDetEn3.Text
xlSheet1.Cells(10, 3) = TextBoxWDetEn4.Text
xlSheet1.Cells(11, 3) = TextBoxWDetEn5.Text
xlSheet1.Cells(12, 3) = TextBoxWDetEn6.Text
xlSheet1.Cells(13, 3) = TextBoxWDetEn7.Text
xlSheet1.Cells(14, 3) = TextBoxWDetEn8.Text
xlSheet1.Cells(15, 3) = TextBoxWDetEn9.Text
xlSheet1.Cells(16, 3) = TextBoxWDetEn10.Text
xlSheet1.Cells(17, 3) = TextBoxWDetEn11.Text
xlSheet1.Cells(18, 3) = TextBoxWDetEn12.Text
xlSheet1.Cells(19, 3) = TextBoxWDetEn13.Text
xlSheet1.Cells(20, 3) = TextBoxWDetEn14.Text
xlSheet1.Cells(21, 3) = TextBoxWDetEn15.Text
xlSheet1.Cells(22, 3) = TextBoxWDetEn16.Text
xlSheet1.Cells(23, 3) = TextBoxWDetEn17.Text
xlSheet1.Cells(24, 3) = TextBoxWDetEn18.Text
xlSheet1.Cells(25, 3) = TextBoxWDetEn19.Text
xlSheet1.Cells(26, 3) = TextBoxWDetEn20.Text
xlSheet1.Cells(27, 3) = TextBoxWDetEn21.Text
'Squib Settings
xlSheet1.Cells(7, 4) = TextBoxWSquib1.Text
xlSheet1.Cells(8, 4) = TextBoxWSquib2.Text
xlSheet1.Cells(9, 4) = TextBoxWSquib3.Text
xlSheet1.Cells(10, 4) = TextBoxWSquib4.Text
xlSheet1.Cells(11, 4) = TextBoxWSquib5.Text
xlSheet1.Cells(12, 4) = TextBoxWSquib6.Text
xlSheet1.Cells(13, 4) = TextBoxWSquib7.Text
xlSheet1.Cells(14, 4) = TextBoxWSquib8.Text
xlSheet1.Cells(15, 4) = TextBoxWSquib9.Text
xlSheet1.Cells(16, 4) = TextBoxWSquib10.Text
xlSheet1.Cells(17, 4) = TextBoxWSquib11.Text
xlSheet1.Cells(18, 4) = TextBoxWSquib12.Text
xlSheet1.Cells(19, 4) = TextBoxWSquib13.Text
xlSheet1.Cells(20, 4) = TextBoxWSquib14.Text
xlSheet1.Cells(21, 4) = TextBoxWSquib15.Text
xlSheet1.Cells(22, 4) = TextBoxWSquib16.Text
xlSheet1.Cells(23, 4) = TextBoxWSquib17.Text
xlSheet1.Cells(24, 4) = TextBoxWSquib18.Text
xlSheet1.Cells(25, 4) = TextBoxWSquib19.Text
xlSheet1.Cells(26, 4) = TextBoxWSquib20.Text
xlSheet1.Cells(27, 4) = TextBoxWSquib21.Text
For SlaveX = 0 To 20
'squib results
xlSheet1.Cells(SlaveX + 7, 7) = 43 'TextBoxRDetYN(SlaveX)
xlSheet1.Cells(SlaveX + 7, 8) = 44 'TextBoxRECUEn(SlaveX)
xlSheet1.Cells(SlaveX + 7, 9) = 45 'TextBoxRDetTime(SlaveX)
xlSheet1.Cells(SlaveX + 7, 10) = 46 'TextBoxRPulseTime(SlaveX)
xlSheet1.Cells(SlaveX + 7, 11) = 47 'TextBoxRT0Time(SlaveX)
Next
' Place sensor readouts in the sheets
For SlaveX = 0 To 1799
'BRS
xlSheet2.Cells(SlaveX + 7, 2) = SlaveX * 0.228
xlSheet2.Cells(SlaveX + 7, 6) = SlaveX * 0.228
'xlSheet2.Cells(SlaveX + 7, 2) = ListViewBRSL.GetItemAt(SlaveX, 2)
Next
If RadioButtonBRSL8.Checked = True Then
xlSheet2.Cells(4, 2) = "8 bit data"
Else
xlSheet2.Cells(4, 2) = "10 bit data"
End If
If RadioButtonBRSR8.Checked = True Then
xlSheet2.Cells(4, 6) = "8 bit data"
Else
xlSheet2.Cells(4, 6) = "10 bit data"
End If
For SlaveX = 0 To 1799
'pSat
xlSheet3.Cells(SlaveX + 7, 2) = SlaveX * 0.224
xlSheet3.Cells(SlaveX + 7, 6) = SlaveX * 0.224
Next
If RadioButtonpSatL8.Checked = True Then
xlSheet3.Cells(4, 2) = "8 bit data"
Else
xlSheet3.Cells(4, 2) = "10 bit data"
End If
If RadioButtonpSatR8.Checked = True Then
xlSheet3.Cells(4, 6) = "8 bit data"
Else
xlSheet3.Cells(4, 6) = "10 bit data"
End If
For SlaveX = 0 To 1799
'UFS
xlSheet4.Cells(SlaveX + 7, 2) = SlaveX * 0.228
xlSheet4.Cells(SlaveX + 7, 6) = SlaveX * 0.228
Next
If RadioButtonUFSL8.Checked = True Then
xlSheet4.Cells(4, 2) = "8 bit data"
Else
xlSheet4.Cells(4, 2) = "10 bit data"
End If
If RadioButtonUFSR8.Checked = True Then
xlSheet4.Cells(4, 6) = "8 bit data"
Else
xlSheet4.Cells(4, 6) = "10 bit data"
End If
For SlaveX = 0 To 1799
'PAS Front
xlSheet5.Cells(SlaveX + 7, 2) = SlaveX * 0.228
xlSheet5.Cells(SlaveX + 7, 6) = SlaveX * 0.228
Next
If RadioButtonPASFL8.Checked = True Then
xlSheet5.Cells(4, 2) = "8 bit data"
Else
xlSheet5.Cells(4, 2) = "10 bit data"
End If
If RadioButtonPASFR8.Checked = True Then
xlSheet5.Cells(4, 6) = "8 bit data"
Else
xlSheet5.Cells(4, 6) = "10 bit data"
End If
For SlaveX = 0 To 1799
'PAS Rear
xlsheet6.Cells(SlaveX + 7, 2) = SlaveX * 0.228
xlsheet6.Cells(SlaveX + 7, 6) = SlaveX * 0.228
Next
If RadioButtonPASRL8.Checked = True Then
xlsheet6.Cells(4, 2) = "8 bit data"
Else
xlsheet6.Cells(4, 2) = "10 bit data"
End If
If RadioButtonPASRR8.Checked = True Then
xlsheet6.Cells(4, 6) = "8 bit data"
Else
xlsheet6.Cells(4, 6) = "10 bit data"
End If
' Create a SaveFileDialog to request a path and file name to save to.
Dim saveFile1 As New SaveFileDialog
' Initialize the SaveFileDialog to specify the extension for the file.
saveFile1.DefaultExt = "*.xls"
saveFile1.Filter = "Excel Files|*.xls"
saveFile1.Title = "Save present data from EMD"
' Determine if the user selected a file name from the saveFileDialog.
If (saveFile1.ShowDialog() = System.Windows.Forms.DialogResult.OK) _
And (saveFile1.FileName.Length) > 0 Then
' Save the contents into the file.
xlBook.SaveAs(saveFile1.FileName)
End If
saveFile1.Dispose()
xlApp.Quit() 'releases excel
End SubSv: hur spara fil snabbare? tar för lång tid
I de här looparna bör du inte anropa Excel för varje iteration:
<code>
For SlaveX = 0 To 1799
'PAS Rear
xlsheet6.Cells(SlaveX + 7, 2) = SlaveX * 0.228
xlsheet6.Cells(SlaveX + 7, 6) = SlaveX * 0.228
Next
</code>
Gör i stället en ny
Dim Sb1 As New System.Text.Stringbuilder()
för varje varv i loopen bygger du på en matris
som består av kolumner och rader som separeras med vbTab, vbCrLf
som du sedan <b>klistrar in</b> till Excel.
Ex om du har en tabell med två kolumner skapas en rad så här:
Sb1.Append("Cell1_value")
Sb1.Append(vbTab)
Sb1.Append("Cell2_value")
Sb1.Append(vbCrLf)
'Next
Till sist anropar du
EttRangeObjekt.Paste (Sb1.ToString)
'är inte hundra på syntaxen för Paste (kolla hjälpen)
Dvs, du ska jobba "chunky" inte "chatty"!
Generellt bör du också byta ut alla
xlsheet6.Cells(SlaveX + 7, 2) =
till
xlsheet6.Cells(SlaveX + 7, 2)<b>.Text</b> = Sv:hur spara fil snabbare? tar för lång tid
ska testa detta så snart jag får tid, men det låter ju väldigt vettigt att inte anropa xl cell för cell. Det är ju en del data som skall lagras, men jag blev förvånad när det tog SÅ lång tid...Sv: hur spara fil snabbare? tar för lång tid
xlsheet6.Cells(SlaveX + 7, 2) = SlaveX * 0.228
orsakar väldigt mycket mer kod "bakom kulisserna".
Därför ska man anropa Excel "Chunky" = flytta mycket data samtidigt.
I stället för "Chatty" = många anrop på rad.Sv:hur spara fil snabbare? tar för lång tid
problemet ligger i radbyte och tabb
har delvis försökt med vbTab, vbCrLf och chr(9), chr(13).
resultatet i .xls blir att HELA sb1 hamnar i samma cell med fyrkanter där jag vill ha enter och tabb
kan bero på att jag inte får paste-grejen att fungera riktigt
testade detta utan framgång:
<code>
Dim xlSettings As New System.Text.StringBuilder
xlSettings.Append(TextBoxWDetEn20.Text)
xlSettings.Append(Chr(9))
xlSettings.Append(TextBoxWSquib20.Text)
xlSettings.Append(Chr(13))
xlSheet1.Paste(xlSheet1.Cells(7, 3), xlSquibSettings.ToString)
</code>
kan inte förstå vad det skall stå på nedersta raden för att det ska funka bra...Sv: hur spara fil snabbare? tar för lång tid
Sv:hur spara fil snabbare? tar för lång tid
Sv: hur spara fil snabbare? tar för lång tid
Antingen Range.TextToColumns med dess argument, eller på Data->Text to columns alt. dess svenska motsvarighet.Sv: hur spara fil snabbare? tar för lång tid
Litet bökigare (en massa Office-XML-hantering), och kräver Office 2003 men ger bäst prestanda eftersom COM-interop-bitarna minimeras.
Jag har gjort det med Word och det fungerade mycket bra.
/AndreasSv:hur spara fil snabbare? tar för lång tid
Sv: hur spara fil snabbare? tar för lång tid
När jag försöker använda paste så klistras mycket riktigt nånting in där jag vill, men det som klistras in är det jag senast kopierade INNAN jag startade programmet.
Tänkte då lite smått med att på nåt sätt använda mig av Copy. Jag får inga felmeddelanden, men det jag ville kopiera har inte kopierats så det som klistras in blir FORTFARANDE det jag senast kopierade INNAN jag startade programmet.
Är det så svårt att hjälpa mig med den nedersta raden?
Jag vill ha matrisen med början i cell C7, sen ska det tabbas och bytas rad nedåt åt höger.
Det som skall stå i matrisen är de siffror/strängar som jag lagt i xlSettings med tab och carriage return.
Mitt excelark heter xlSheet1.Sv:hur spara fil snabbare? tar för lång tid
Du måste sätta data i Clipboarden först, från ditt .Net-program:
Clipboard.SetDataObject("aaa" & vbTab & "bbb")Sv: hur spara fil snabbare? tar för lång tid
<code>
Dim xlApp As Excel.Application
Dim xlBook As Excel.Workbook
Dim xlSheet1 As Excel.Worksheet
xlApp = New Excel.Application
xlBook = xlApp.Workbooks.Open("C:\WindowsApplication1\template.xls")
xlSheet1 = CType(xlBook.Worksheets(1), Excel.Worksheet)
Dim xlSettings As New System.Text.StringBuilder
xlSettings.Append(TextBox1.Text)
xlSettings.Append(vbTab)
xlSettings.Append(TextBox2.Text)
xlSettings.Append(vbCrLf)
xlSettings.Append(TextBox3.Text)
Clipboard.SetDataObject(xlSettings.ToString)
xlSheet1.Range("C7").Select()
xlSheet1.Paste()
</code>
trodde motsatsen till paste var copy. men nu funkar det!
tack ola