webForumDet fria alternativet

exportera dataset/datagrid till excel

.NET

12 svar · 345 visningar · startad av Mc Fetto

Medlem sedan nov. 20022 355 inlägg
Frågan#1

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!

Medlem sedan nov. 2003569 inlägg
#2

Här har du lite att läsa:

http://support.microsoft.com/kb/316934

Medlem sedan nov. 20022 355 inlägg
#3

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. :)

Medlem sedan nov. 2003569 inlägg
#4

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.

Medlem sedan feb. 20013 023 inlägg
#5

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...

Medlem sedan maj 20012 812 inlägg
#6

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

Medlem sedan nov. 20022 355 inlägg
#7

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 :)

Medlem sedan sep. 20011 914 inlägg
#8

Ta en titt på Carlos Aguilar Mares ExcelXmlWriter och ExcelXmlWriter Code Generator. Kan nog vara till användning.

Medlem sedan feb. 20013 023 inlägg
#9

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.

Medlem sedan feb. 20013 023 inlägg
#10

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

Medlem sedan nov. 20022 355 inlägg
#11

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

Medlem sedan nov. 20022 355 inlägg
#12

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 :)

Medlem sedan feb. 20013 023 inlägg
#13

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...

258 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
125 ms — deklarationer (db)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)
124 ms — ändringar (db)