Excel/CSV bug
Ik ben vandaag op een probleemPJE gestuit met betrekking tot het genereren van CSV bestanden. Ik haal data uit twee tabellen en..... ach, allemaal onbelangrijk.
Het feit:
Als ik de eerste kolom van het csv bestand ID noem, geeft exel een error bij het inlezen. Verder werkt alles. Ook staat er gewoon netjes ID in de eerste kolom. Gebruik ik Id, id of iD, is er niks aan de hand. Kan het zijn dat ik een bug heb ondekt? Of wordt ID door exel gereserveerd als functie o.i.d.????
Gewijzigd op 01/01/1970 01:00:00 door Bas Matthee
Heb je het over het microsoft office programma excel of over een programma wat ik totaal niet ken?
Gewijzigd op 01/01/1970 01:00:00 door Bas Matthee
Nee niet logisch want je kan het bijv ook over openoffice calc hebben
Edit: (bron: Wikipedia) Calc is een digitaal rekenblad dat sterk lijkt op Excel en ongeveer dezelfde functies bezit.
EN HEET DUS GEEN EXEL! ;)
Gewijzigd op 01/01/1970 01:00:00 door Bas Matthee
exel != excel
Mij oprechte excuses (mag ook gezegd worden).
PS: Error komt eraan (wordt printscreen) (2 errors btw.)
EDIT!!!!! : http://congrez.difmedia.nl/errors.gif
Gewijzigd op 01/01/1970 01:00:00 door Bas Matthee
http://support.microsoft.com/kb/215591
Quote:
WORKAROUND
To open your file in Microsoft Excel, first open the file in a text editor and insert an apostrophe at the beginning of the first line of text.
To open your file in Microsoft Excel, first open the file in a text editor and insert an apostrophe at the beginning of the first line of text.
Jan Koehoorn schreef op 08.04.2008 17:27:
Als ik fputcsv gebruik voor een array en ik geef ; op als scheidingsteken, slikt Excel het wel als CSV:
Het is bij mij het geval dat ik van de ene tabel NAW gegevens moet halen, netjes met bijvoorbeeld voornaam, achternaam, etc... als velden. Maar van de andere tabel moet ik ook gegevens hebben, en die zijn niet op deze manier in de tabel te vinden. Ik heb namelijk een tabel met als kolommen: id, veldnaam, veldtype, opties etc... en in een andere tabel de gegevens die bij die velden horen, bijvoorbeeld: veld_id, waarde, etc... Dus deze gegevens moet ik combineren en vervolgens achter de rij met NAW gegevens in het csv bestand zetten. Dit is in mijn geval de beste oplossing om klanten dynamisch een formulier te laten samenstellen.
Veelt tekst en uitleg en misschien nieteens duidelijk. maar ik zal de voorlopige code even plaatsen. (haal dus data uit de deelnemers tabel en data uit de deelnemers_extra tabel).
ExportCSV.php
Code (php)
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
<?php
class ExportCSV {
var $FirstCollumn = 1;
var $FirstRow = 0;
var $CSVFile = NULL;
var $CollumnCount = 0;
var $RowPosition = 1;
function AddCollumns($CollumnName) {
if ($this->FirstCollumn == 1) {
// Dit is dus de eerste kolom, wanneer deze in hoofdletters is, gaf hij de fout.
$this->CSVFile .= 'id';
$this->CSVFile .= ';'.$CollumnName;
$this->FirstCollumn++;
$this->CollumnCount++;
} else {
$this->CSVFile .= ';'.$CollumnName;
$this->CollumnCount++;
}
}
function CloseCollumns() {
$this->CSVFile .= "\r\n";
$this->FirstCollumn = 1;
}
function WriteRowExtra($Query) {
$result_set = mysql_query($Query);
$test = array();
if (mysql_num_rows($result_set) > 1) {
$aantal = 0;
$start = 0;
while ($result = mysql_fetch_object($result_set)) {
if (array_key_exists($result->veld_id, $test)) {
$test[$result->veld_id] .= ' // '.$result->value;
} else {
$test[$result->veld_id] = $result->value;
}
}
foreach ($test as $waarde) {
$this->AddData($waarde);
}
return true;
} elseif (mysql_num_rows($result_set) == 1) {
$this->AddData($value);
} elseif (mysql_num_rows($result_set) == 0) {
return false;
}
}
function WriteRow($Query) {
$result_set = mysql_query($Query);
if (mysql_num_rows($result_set) == 1) {
$result = mysql_fetch_array($result_set);
foreach ($result as $key => $value) {
if (!is_int($key)) {
$this->AddData($value);
}
}
} elseif (mysql_num_rows($result_set) == 0) {
return false;
}
}
function AddData($Data) {
if ($this->RowPosition <= $this->CollumnCount) {
if ($this->FirstRow == 0) {
$this->CSVFile .= $Data;
$this->FirstRow++;
$this->RowPosition++;
} else {
$this->CSVFile .= ';'.$Data;
$this->RowPosition++;
}
} else {
$this->CSVFile .= ';'.$Data;
$this->NewLine();
}
}
function NewLine() {
$this->CSVFile .= "\r\n";
$this->FirstRow = 0;
$this->RowPosition = 1;
}
function WriteFile($FileName) {
$file = fopen($FileName,'w');
fwrite($file,$this->CSVFile);
fclose($file);
chmod($FileName,0777);
}
}
?>
class ExportCSV {
var $FirstCollumn = 1;
var $FirstRow = 0;
var $CSVFile = NULL;
var $CollumnCount = 0;
var $RowPosition = 1;
function AddCollumns($CollumnName) {
if ($this->FirstCollumn == 1) {
// Dit is dus de eerste kolom, wanneer deze in hoofdletters is, gaf hij de fout.
$this->CSVFile .= 'id';
$this->CSVFile .= ';'.$CollumnName;
$this->FirstCollumn++;
$this->CollumnCount++;
} else {
$this->CSVFile .= ';'.$CollumnName;
$this->CollumnCount++;
}
}
function CloseCollumns() {
$this->CSVFile .= "\r\n";
$this->FirstCollumn = 1;
}
function WriteRowExtra($Query) {
$result_set = mysql_query($Query);
$test = array();
if (mysql_num_rows($result_set) > 1) {
$aantal = 0;
$start = 0;
while ($result = mysql_fetch_object($result_set)) {
if (array_key_exists($result->veld_id, $test)) {
$test[$result->veld_id] .= ' // '.$result->value;
} else {
$test[$result->veld_id] = $result->value;
}
}
foreach ($test as $waarde) {
$this->AddData($waarde);
}
return true;
} elseif (mysql_num_rows($result_set) == 1) {
$this->AddData($value);
} elseif (mysql_num_rows($result_set) == 0) {
return false;
}
}
function WriteRow($Query) {
$result_set = mysql_query($Query);
if (mysql_num_rows($result_set) == 1) {
$result = mysql_fetch_array($result_set);
foreach ($result as $key => $value) {
if (!is_int($key)) {
$this->AddData($value);
}
}
} elseif (mysql_num_rows($result_set) == 0) {
return false;
}
}
function AddData($Data) {
if ($this->RowPosition <= $this->CollumnCount) {
if ($this->FirstRow == 0) {
$this->CSVFile .= $Data;
$this->FirstRow++;
$this->RowPosition++;
} else {
$this->CSVFile .= ';'.$Data;
$this->RowPosition++;
}
} else {
$this->CSVFile .= ';'.$Data;
$this->NewLine();
}
}
function NewLine() {
$this->CSVFile .= "\r\n";
$this->FirstRow = 0;
$this->RowPosition = 1;
}
function WriteFile($FileName) {
$file = fopen($FileName,'w');
fwrite($file,$this->CSVFile);
fclose($file);
chmod($FileName,0777);
}
}
?>
gedeelte van deelnemers_export_csv.php
Code (php)
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
28
29
30
31
32
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
28
29
30
31
32
<?php
$File = new ExportCSV;
$query = "SELECT label FROM formulier WHERE congres_id = ".$congres_id." ORDER BY positie ASC";
$label_set = mysql_query($query);
while ($label = mysql_fetch_object($label_set)) {
$File->AddCollumns($label->label);
}
$File->CloseCollumns();
$query = 'SELECT naw_id FROM congres_deelnemers WHERE congres_id = ' . $congres_id;
$result_set = mysql_query($query);
if (mysql_num_rows($result_set) == 1) {
$result = mysql_fetch_object($result_set);
$File->WriteRow('SELECT * FROM deelnemers_naw WHERE id = '.$result->naw_id);
$File->WriteRowExtra('SELECT value, veld_id FROM deelnemers_extra WHERE deelnemer_id = '.$result->naw_id .' ORDER BY veld_id ASC');
} else {
while ($result = mysql_fetch_object($result_set)) {
$File->WriteRow('SELECT * FROM deelnemers_naw WHERE id = '.$result->naw_id);
$File->WriteRowExtra('SELECT value, veld_id FROM deelnemers_extra WHERE deelnemer_id = '.$result->naw_id .' ORDER BY veld_id ASC');
}
}
$File->WriteFile('custom/csv_export/'.$congres_id.'_'.$con_result->congresnaam.'.csv');
// Alle gegevens van $con_result worden al eerder uit de database gehaald (buiten deze code)
?>
$File = new ExportCSV;
$query = "SELECT label FROM formulier WHERE congres_id = ".$congres_id." ORDER BY positie ASC";
$label_set = mysql_query($query);
while ($label = mysql_fetch_object($label_set)) {
$File->AddCollumns($label->label);
}
$File->CloseCollumns();
$query = 'SELECT naw_id FROM congres_deelnemers WHERE congres_id = ' . $congres_id;
$result_set = mysql_query($query);
if (mysql_num_rows($result_set) == 1) {
$result = mysql_fetch_object($result_set);
$File->WriteRow('SELECT * FROM deelnemers_naw WHERE id = '.$result->naw_id);
$File->WriteRowExtra('SELECT value, veld_id FROM deelnemers_extra WHERE deelnemer_id = '.$result->naw_id .' ORDER BY veld_id ASC');
} else {
while ($result = mysql_fetch_object($result_set)) {
$File->WriteRow('SELECT * FROM deelnemers_naw WHERE id = '.$result->naw_id);
$File->WriteRowExtra('SELECT value, veld_id FROM deelnemers_extra WHERE deelnemer_id = '.$result->naw_id .' ORDER BY veld_id ASC');
}
}
$File->WriteFile('custom/csv_export/'.$congres_id.'_'.$con_result->congresnaam.'.csv');
// Alle gegevens van $con_result worden al eerder uit de database gehaald (buiten deze code)
?>
Gewijzigd op 01/01/1970 01:00:00 door Bas Matthee
Je gegevens komen uit meer dan 1 tabel, maar het moet toch mogelijk zijn om alle velden die je op 1 Excel rij wilt hebben in een array te krijgen? Zodra dat je lukt kun je namelijk met die fputcsv aan de gang en dan neemt die je al het werk uit handen.
Vooralsnog is de huidige code mijn enige werkende. En zal eerst mijn andere te verrichten taken aan dit project voltooïen. Alles af? dan is het tijd voor refacturing...