Moi,
käytän alla olevaa skriptiä, jotta saan tiedot haettua kannasta exceliin. Alla oleva koodi on jostain löydetty. Olen tuota koodia muokannut omaan käyttööni sopivaksi, mutta koska siinä tehdään joukko erilaisia päättelyitä käyttäjän toiveiden mukaan, en sitä tähän lisännyt, vaan alkuperäisen aihion. Sekä aihio, että minun jatkojalostamani versio tekevät sen mitä pitääkin eli tiedot siirtyy kannasta Exceliin.
Mutta... Ongelman ydin onkin siinä, että tietokannassa käsitellään ääkkösiä sisältävää tekstiä ja se ei tulostu oikein exceliin. Perinteinen ääkkösongelma vaivaa exceliä. Hötömölösivulle saan toki ääkköset näkymään, UTF-8 -koodauksella. Sitä myös kokeilen tuonne koodin loppuun:
header('Content-type: text/html; charset=utf-8');
Tämä ei kuitenkaan auta.
Skriptin alussa oleva db_connection.php pitää sisällään yhteyden luomiseen tarvittavat tiedot. Olen sinne määritellyt myös:
mysql_set_charset("utf8");
Tämäkään ei ratkaise tilannetta. Mikähän avuksi?
Tässä siis se alkuperäinen aihio:
<?php include('db_connection.php'); $select = "SELECT col1,col2,col3 FROM table"; $export = mysql_query ( $select ) or die ( "Sql error : $select" . mysql_error( ) ); $fields = mysql_num_fields ( $export ); /* for ( $i = 0; $i < $fields; $i++ ) { $header .= mysql_field_name( $export , $i ) . "\t"; } */ for ($i = 0; $i < 19; $i++){ // Sarakkeiden otsikot $array = array("sarake1","sarake2","sarake3"); $header .= $array[$i] ."\t"; } while( $row = mysql_fetch_row( $export ) ) { $line = ''; foreach( $row as $value ) { if ( ( !isset( $value ) ) || ( $value == "" ) ) { $value = "\t"; } else { $value = str_replace( '"' , '""' , $value ); $value = '"' . $value . '"' . "\t"; } $line .= $value; } $data .= trim( $line ) . "\n"; } $data = str_replace( "\r" , "" , $data ); if ( $data == "" ) { $data = "\n(0) Records Found!\n"; } $current_date = date("d_m_Y"); $header_text = "Content-Disposition: attachment; filename=tiedoston-nimi_".$current_date.".xls"; header('Content-type: text/html; charset=utf-8'); header("Content-type: application/octet-stream"); header($header_text); header("Pragma: no-cache"); header("Expires: 0"); print "$header\n$data"; ?>
Taisitko edes ymmärtää mitä koodi oikeasti tekee? Se tuottaa CSV tiedoston, eikä XLS tiedostoa.
Sharppis kirjoitti:
Tuossa koodinpätkässä määrittelet ensin, että tiedosto on UTF-8 enkoodattu HTML tiedosto, mutta seuraavaksi määrittelet sen binääridataksi. Ei ihme ettei ääkköset toimi.
<?php include('db_connection.php'); $select = "SELECT col1,col2,col3 FROM table"; $export = mysql_query ( $select ) or die ( "Sql error : $select" . mysql_error( ) ); $fields = mysql_num_fields ( $export ); for ($i = 0; $i < 19; $i++){ // Sarakkeiden otsikot $array = array("sarake1","sarake2","sarake3"); $header .= $array[$i] ."\t"; } while( $row = mysql_fetch_row( $export ) ) { $line = ''; foreach( $row as $value ) { if ( ( !isset( $value ) ) || ( $value == "" ) ) { $value = "\t"; } else { $value = str_replace( '"' , '""' , $value ); $value = '"' . $value . '"' . "\t"; } $line .= $value; } $data .= trim( $line ) . "\n"; } $data = str_replace( "\r" , "" , $data ); if ( $data == "" ) { $data = "\n(0) Records Found!\n"; } $current_date = date("d_m_Y"); header('Content-type: text/csv; charset=utf-8'); header('Content-Disposition: attachment; filename=tiedoston-nimi_'.$current_date.'.csv'); header('Pragma: no-cache'); header('Expires: 0'); print "$header\n$data"; ?>
Tuon pitäisi toimia.
Voit kokeilla jos ISO-8859-1:n konvertointi auttais asiaan. Itsellä oli CSV tiedoston kans ongelmia excelissä avatessa, niin auttoi ainakin.
header('Content-Disposition: attachment; charset=UTF-8; filename="' . $filename . '"'); $utf8_content = mb_convert_encoding($csv_data, "ISO-8859-1", "UTF-8"); echo $utf8_content;
Muuten käsittelin dataa samaan tapaan UTF8:na. Excelissä tietty sitten valitaan encoodaukseks tuo ISO-8859-1, jos erikseen kysyy.
Aihe on jo aika vanha, joten et voi enää vastata siihen.