Jag behöver tips, länkar eller konkreta kodexempel på hur jag kan skapa ett excel-dokument genom att gå igenom ett dataset/datagrid (cell för cell) och lägga till dessa i ett excel-dokument. Jag vill inte spara ner datan som en fil. Tacksam för hjälp!
exportera dataset/datagrid till excel
12 svar · 345 visningar · startad av Mc Fetto
tackar, med den länken hittade jag en annan: http://support.microsoft.com/kb/302096/EN-US/
Som jag gör nu så loopar jag igenom datasetet, och lägger datan i en object-matris. Har ni tips på smidigare sätt så hojta till. :)
men vad du ska krångla till allting hörrö, den där länken använder ju COM för att komma åt excel filen, ADO.NET har så att man kan komma åt grejerna ändå. :)
gör såhär istället att loopa igenom tabellernas kolumner i dataset:et, skapa en text som skapar tabellerna i excel arket CREATE TABLE och skjut iväg det med ett command objekt mot excefilen ... . . . . . .
och sen använder du en dataadapter som mappar dataset:ets kolumner mot det nyligen gjorda exceltabellerna.
Så här gör jag när jag skall skriva till excel. Jag tycker i a f att det är enkelt. Fattar inte Nöffs sista sätt, så det får han gärna förklara ytterligare. Kanske är det bättre än mitt.
1. Lägg till en referens till excel. Finns under com.
Sedan är det bara att koda på.
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim oExcel As New Excel.Application
' Dim oSheet As Excel.Worksheet
Dim oDataset As DataSet
Dim iRow As Integer
Dim iCol As Integer
'Måste gå över till engelska inställningar om man kör 'Engelskt med svenska i Regional Settings
Threading.Thread.CurrentThread.CurrentCulture = Globalization.CultureInfo.CreateSpecificCulture("en-US")
oExcel.Workbooks.Add()
oExcel.ActiveWorkbook.Sheets(1).range("a1").select()
oExcel.Visible = True
For iRow = 0 To oDataset.Tables(0).Rows.Count - 1
For iCol = 0 To oDataset.Tables(0).Columns.Count - 1
oExcel.ActiveCell.Offset(iRow, iCol).Value = oDataset.Tables(0).Rows(iRow).Item(iCol)
Next
Next
'Gå tillbaka till svenska
Threading.Thread.CurrentThread.CurrentCulture = Globalization.CultureInfo.CreateSpecificCulture("sv-SE")
End Sub
Detta är grundprincipen...
Så här gör jag när jag skall skriva till excel. Jag tycker i a f att det är enkelt. Fattar inte Nöffs sista sätt, så det får han gärna förklara ytterligare. Kanske är det bättre än mitt.
Det finns drivrutiner till ADO som gör att du kan ha EXECL som din "databas". Alltså fungerar "alla" SQL kommando mot EXECL filen. Det betyder att du kan använda SELECT för att hämta data, INSERT för att sätta in data och CREATE för att skapa en ny "tabell" i ditt EXCEL ark.
- M
Japp, ungefär på samma sätt som jag gör, här kommer liten snipp:
range = objSheet.get_Range("A2", Missing.Value);
range = range.get_Resize(Rows, columns.Count);
object[,] saRet = new object[Rows, columns.Count];
for (int i=0;i<Rows;i++)
for (int k = 0; k<columns.Count;k++)
if (columns.Contains(k))
saRet[i,k] = _grid[i, k];
range.set_Value(Missing.Value, saRet );
objApp.Visible = true;
Nöff du får gärna upplysa oss mer :)
Ta en titt på Carlos Aguilar Mares ExcelXmlWriter och ExcelXmlWriter Code Generator. Kan nog vara till användning.
Gladh skrev:
Så här gör jag när jag skall skriva till excel. Jag tycker i a f att det är enkelt. Fattar inte Nöffs sista sätt, så det får han gärna förklara ytterligare. Kanske är det bättre än mitt.
Det finns drivrutiner till ADO som gör att du kan ha EXECL som din "databas". Alltså fungerar "alla" SQL kommando mot EXECL filen. Det betyder att du kan använda SELECT för att hämta data, INSERT för att sätta in data och CREATE för att skapa en ny "tabell" i ditt EXCEL ark.
- M
OK, var det det han menade. Det har jag ju gjort själv en gång...dock körde jag bara en SELECT. Skall man bara skriva ut data i Excel känns mitt exempel smidigare.
Mc Fetto skrev:
Japp, ungefär på samma sätt som jag gör, här kommer liten snipp:
range = objSheet.get_Range("A2", Missing.Value); range = range.get_Resize(Rows, columns.Count); object[,] saRet = new object[Rows, columns.Count]; for (int i=0;i<Rows;i++) for (int k = 0; k<columns.Count;k++) if (columns.Contains(k)) saRet[i,k] = _grid[i, k]; range.set_Value(Missing.Value, saRet ); objApp.Visible = true;Nöff du får gärna upplysa oss mer :)
Släng in en
application.screenupdating=false
så får du bättre prestanda
I slutet slår du på den igen:
application.screenupdating=true
clarkbones skrev:
Släng in en
application.screenupdating=false
så får du bättre prestanda
I slutet slår du på den igen:
application.screenupdating=true
Tackar, ska prova det imorgon! :bire
Som det är nu, så formateras data till det fomat som verkar lämpligt, men hur sätter jag formatet på en kolumn? Har en del siffervärde som ska vara text och ine siffervärde i excel, även datumformatering är önskvärt. Detta borde ju vara busenkelt, men excel api'et är ju rätt omfattande :)
Mc Fetto skrev:
Detta borde ju vara busenkelt, men Excel api'et är ju rätt omfattande :)
Det är busenkelt, spela in ett makro där du gör formateringen. Om du formaterar en kolumn för text
så skall du ha följande tror jag:
MyExcelApplication.columns("A:A").NumberFormat="@"
Dock verkar det som om formatkoderna kan skilja sig mellan .NET och excel så man får hålla tungan i rätt mun...
