[ADO.NET] dataset eenvoudig omzetten naar Excel of csv

Pagina: 1
Acties:

  • MrHighStone
  • Registratie: November 2001
  • Laatst online: 03-02-2023
Zit wat te zoeken op het web, maar kom alleen de optie tegen om een dataset te exporteren naar XML. Wat ik zou willen is een dataset (of beter nog datareader indien mogelijk) op een eenvoudige wijze opslaan als Excel bestand en, indien dit te ingewikkeld is, naar CSV (comma separated values) bestand.

Heeft iemand een idee in welke richting ik dit moet zoeken in (ADO).NET? Het kan toch niet zo zijn dat ik hiervoor zelf een ingewikkelde 'dump' functie voor moet maken?

Een file op de A12 is nooit grappig...


  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 26-06 10:37

OZ-Gump

terug van weggeweest

Heel ingewikkeld hoeft een dergelijke functie niet te zijn: loop door je recordset heen met in de loop de code om een regeltje weg te schrijven met een puntkomma tussen de velden. Volgens mij is dat binnen een paar minuutjes in elkaar geknutseld.

Wat betreft de ebentueel ingebouwde mogelijkheden die je hiervoor hebt binnen ADO.Net kan ik je niet helpen helaas...

My personal website


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

Lijkt op zich eenvoudig te maken. Schrijf een functies; eentje met als input een datareader, output een csv-formatted string.

Plak deze string aan elkaar, stop er aan het einde steeds VBCrLf (of C# equivalent) tussen en schrijf deze naar het bestand.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Verwijderd

StringBuilder is sneller dan gewone string concatenation (maf, hopelijk heb ik dat foutloos geschreven :bonk:). Dat is toch zo in Java en ik heb gehoord dat dat in .NET ook zo is.

(btw: c# equivalent is \r\n maar \n zelf wil ook wel werken..)

en misschien helpt deze link je wel om echte excel te maken:
http://www.c-sharpcorner.com/Code/2002/June/GridViewIV.asp

  • whoami
  • Registratie: December 2000
  • Nu online
Verwijderd schreef op 10 July 2003 @ 18:58:
StringBuilder is sneller dan gewone string concatenation (maf, hopelijk heb ik dat foutloos geschreven :bonk:). Dat is toch zo in Java en ik heb gehoord dat dat in .NET ook zo is.
Een stringbuilder is idd aan te raden als je veel string concats gaat doen.
(btw: c# equivalent is \r\n maar \n zelf wil ook wel werken..)
\n alleen is voldoende.

https://fgheysels.github.io/


  • MrHighStone
  • Registratie: November 2001
  • Laatst online: 03-02-2023
Tnx voor de input, ga er morgen mee aan de gang!
Helaas dus geen kant-en-klare DataSet.SaveAsCsv method :?

Een file op de A12 is nooit grappig...


  • MrHighStone
  • Registratie: November 2001
  • Laatst online: 03-02-2023
Heb het werkend gekregen, data dumpen steld idd niet zoveel voor. Gebruik momenteel echter de StringWriter, en kan zo snel niet vinden wat de relatie van dit ding met een StringBuilder is.
Onderstaande link heeft me verder geholpen met exporteren naar Excel: http://support.microsoft....1/1/94.asp&NoWebContent=1

Een file op de A12 is nooit grappig...


  • MrHighStone
  • Registratie: November 2001
  • Laatst online: 03-02-2023
Voor de liefhebbers hier de truc, gorgi: tnx voor de tip!

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Private Function ConvertDataReaderToExcelString(ByVal drReaderToConvert As SqlDataReader) As String
            Dim sExcelString As New StringWriter()
            Dim sLine As String

            If drReaderToConvert.Read Then
                sLine = ""
                Dim i As Integer = 0
                For i = 0 To drReaderToConvert.FieldCount - 1
                    sLine += drReaderToConvert.GetName(i).ToString + Convert.ToChar(9)
                Next
            End If
            sExcelString.WriteLine(sLine)

            While drReaderToConvert.Read
                sLine = ""
                Dim i As Integer = 0
                For i = 0 To drReaderToConvert.FieldCount - 1
                    sLine += drReaderToConvert.GetValue(i).ToString + Convert.ToChar(9)
                Next
                sExcelString.WriteLine(sLine)

            End While

            Return sExcelString.ToString

            sExcelString.Close()
        End Function


Mocht iemand, zoals gezegd, de oplossing hebben met een stringbuilder (performance!), graag ;)

Een file op de A12 is nooit grappig...


  • whoami
  • Registratie: December 2000
  • Nu online
Ipv een string gebruik je een StringBuilder, en dan ga je strings gaan concatten dmv de Append method op te roepen.
code:
1
2
3
4
5
StringBuilder sLines = new StringBuilder();
for( int i = 0; i < .... )
  sLines.Append (drReader....);

ExcelString.WriteLine(sLines.ToString());


Ik vraag me wel af waarom je 2x door je DataReader looped. Eigenlijk is dat zelfs niet mogelijk.

I see, je read 1x voor je eerste record, en dan doe je until end enzo... ;) Zowiezo kan je die eerste read toch weglaten, en direct met je while beginnen.

code:
1
2
3
4
5
6
7
8
            If drReaderToConvert.Read Then
                sLine = ""
                Dim i As Integer = 0
                For i = 0 To drReaderToConvert.FieldCount - 1
                    sLine += drReaderToConvert.GetName(i).ToString + Convert.ToChar(9)
                Next
            End If
            sExcelString.WriteLine(sLine)


^^ Dit stuk zou dus weg mogen.

Ik vraag me ook af of het statement (de close) na je return wel uitgevoerd wordt. De close van sExcelString kan je beter in een finally block zetten. Dan ben je zeker dat het altijd uitgevoerd wordt:

code:
1
2
3
4
5
6
7
8
9
10
11
12
sExcelString.Open();

try
{
   // do some processing here
}
finally
{
  sExcelString.Close();
}

return string;

[ Voor 78% gewijzigd door whoami op 11-07-2003 16:46 ]

https://fgheysels.github.io/


  • PhoneTech
  • Registratie: Mei 2000
  • Laatst online: 22-08 13:56
whoami was me voor....

[ Voor 99% gewijzigd door PhoneTech op 11-07-2003 16:46 . Reden: whoami was me voor ]


  • MrHighStone
  • Registratie: November 2001
  • Laatst online: 03-02-2023
Of die return uitgevoerd wordt is een goeie, niet bij nagedacht eigenlijk... 8)7 Denk dat try catch idd wel zo fraai is. Zal eens met de stringbuilder aan de gang gaan. Betekent dus dat ik de stringwriter overboord kan gooien? Ik zie ook wel eens een combi hiervan, maar alles wat ik kan vinden is icm XML enzo.
De reden dat ik twee keer de datareader 'bekijk' is om op de eerste regel van het bestand de veldnamen neer te plempen (GetName vs GetValue), zag het de eerste keer ook niet ;)

Een file op de A12 is nooit grappig...


  • whoami
  • Registratie: December 2000
  • Nu online
Waarom denk je dat je die StringWriter dan overboord kunt gooien? Een StringBuilder en StringWriter hebben beiden verschillende functionaliteit en een verschillend doel.

https://fgheysels.github.io/


  • whoami
  • Registratie: December 2000
  • Nu online
In de eerste loop ga je idd de columnheaders wegschrijven, echter, de eerste rij met gegevens ga je niet wegschrijven.

Je doet nl. een read -> je staat op het 1ste record. Daar ga je de columnnames wegschrijven.
Dan doe je opnieuw een read in je while -> je staat op het 2de record. Ondertussen heb je de values van de 1ste row niet weggeschreven.

https://fgheysels.github.io/

Pagina: 1