Avatar billede anders_cp Nybegynder
18. november 2008 - 22:08 Der er 6 kommentarer og
1 løsning

Problem med konvertering ved eksportering til excel-ark

Hejsa
Jeg ønsker i min CSharp-kode at overføre data til excel-arket. Det lader til at gå fint, bortset fra et af felterne som laves om til et tekstfelt (string?) i regnearket i.s.f. integer, som ønskes.

Hvordan løser jeg dette problem?

Her er lidt forklarende kode:
// Export to excel
string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" +
                    "Data Source=" + uploadedFilename + ";" +
                    "Extended Properties=Excel 8.0;";

OleDbConnection conn = new OleDbConnection(strConn);
OleDbCommand cmd = new OleDbCommand();
cmd.Connection = conn;
conn.Open();

for (int i = 0; i < woDataView.Count-1; i++)
{
cmd.CommandText =
"UPDATE [Data$] SET Måned = " + woDataView[i][(int)queryColumn.LUKKETMAANED]
+ ", Afregning = '" + woDataView[i][(int)queryColumn.AFREGNING] + "'"

+ " WHERE WO = " + woDataView[i][(int)queryColumn.WO];
cmd.ExecuteNonQuery();
}

  conn.Close();

Dataene ligger i et dataview[i][kolonne]. Det er det første felt Måned, som kommer ind som tekst isf. heltal.
Avatar billede aaberg Nybegynder
19. november 2008 - 00:25 #1
Prøv at bruge OleDbParamter klassen i stedet for at parse parametre direkte ind i sql'en.

OleDbConnection conn = new OleDbConnection(strConn);
OleDbCommand cmd = new OleDbCommand();
cmd.Connection = conn;
conn.Open();

OleDbParameter månedParam = new OleDbParam("@Param1", OleDbType.Integer);
OleDbParameter afregningParam = new OleDbParam("@Param2", OleDbType.Integer);
OleDbParameter woParam = new OleDbParameter("@Param3", OleDbType.Integer);

cmd.CommandText = "UPDATE [Data$] SET Måned = ?, Afregning = ? WHERE WO = ?";
cmd.Parameters.Add(månedParam);
cmd.Parameters.Add(afregningParam);
cmd.Parameters.Add(woParam);

for (int i = 0; i < woDataView.Count-1; i++)
{
  månedParam.Value = woDataView[i][(int)queryColumn.LUKKETMAANED];
  afregningParam.Value = woDataView[i][(int)queryColumn.AFREGNING];
  woParam.Value = woDataView[i][(int)queryColumn.WO];
 
  cmd.ExecuteNonQuery();
}

conn.Close();


Jeg har ikke testet om det er derfor Excel ikke fatter datatypen, men det er da et forsøg hvert. Uanset, det er mere rigtigt at bruge parametre fremfor strengbehandling, da det giver bedre performance og sikkerhed.
Avatar billede anders_cp Nybegynder
19. november 2008 - 12:46 #2
Hej
Det hjalp desværre ikke.
Jeg er lidt i tvivl om proplemet ligger et helt andet sted. Jeg har lagt billede af fejlen her:
http://www.henrik-hartig.dk/excel.png
Hvis jeg vælger alle felterne i excel og ændrer til "tal" sker der ikke noget. Jeg skal først klikke på udråbstegnet og vælge "konverter til tal". Ved ikke om det beskriver min fejl godt nok.

Jeg er enorm glad for din beskrivelse af parameteroverførsel, det giver yderligere nemmere overskuelig kode. TAK for det :-)
Avatar billede aaberg Nybegynder
19. november 2008 - 13:20 #3
Jeg kender godt dit problem, Excel er legendarisk til ikke at fatte datatyper.

Prøv at markere hele kolonnen i Excel ved at trykke på 'A'et i kollonnen. højreklik et eller andet sted på det markerede, og tryk "Formatere Celler". Vælg en tal-datatype. Jeg er ikke sikker på dette vil virke, men det er da et forsøg hvert.
Avatar billede anders_cp Nybegynder
19. november 2008 - 15:40 #4
Jeg fandt ud af (som du også kan se af mit skærmdump) at der bliver sat en apostrof. Jeg har så forsøgt at sætte værdien manuelt (med 1 og '1'):
cmd.CommandText = "UPDATE [Data$] SET Måned = 1, Afregning = ?, Lukkedato = ?, Produkt = ? WHERE WO = ?";

Her får jeg samme fejl.

Excel-arket uploades af brugeren og tilføjes programmeringsmæssigt nogle værdier. Herefter skulle pivot-tabeller o.a. være klart. Jeg har prøvet dit forslag inden excel-arket får tilføjet værdier og det går heller ikke.

Alternativt må brugeren selv ændre datatypen i det "færdige" excel-ark - synes bare ikke det er optimalt ;)

Jeg er åben overfor forslag og ellers må brugeren selv klare det sidste..
Avatar billede aaberg Nybegynder
19. november 2008 - 15:47 #5
Jeg har desværre ikke flere forslag lige nu! Men hvis jeg kommer på noget, skal give give en pm.
Avatar billede anders_cp Nybegynder
19. november 2008 - 23:47 #6
Takker..
Jeg har en idé om at løbe kolonnen igennemm og fjerne apostroffen. Noget i stil med replace("'", ""). Ved bare ikke hvordan, men det er en tanke.

Finder jeg selv ud af noget, vil jeg også skrive det her :-)
Avatar billede anders_cp Nybegynder
25. juli 2009 - 22:18 #7
så jeg lukker indtil videre tråden
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester