excel單元格數字變成字符串方法 '1001010002400000,數值前加單引號
當excel文件中的數據設置過,導入的數據和excel顯示的不同,單個修改數據個單元格格式又很麻煩,這時把excel另存爲csv格式即可,用文本方式打開看數據
導入$data->sheets
使用PHP-ExcelReader,下載地址: http://sourceforge.net/projects/phpexcelreader
<?php
//$data_header_var = array(1=>'$incrementId',2=>'$price');
function Excel2Db($fileName, $data_header_var=array()){
require_once 'Excel/reader.php';
$data = new Spreadsheet_Excel_Reader();
$data->setOutputEncoding('utf-8'); //gbk
$data->read($fileName);
$numRows = $data->sheets["0"]['numRows'];
for ($i = 2; $i <= $numRows; $i++) {
foreach ($data_header_var as $j => $var){
eval($var.'= $data->sheets["0"]["cells"][$i][$j];');
}
//save2Db
}
}
/*$data2 = $data->sheets["0"]["cells"];
unset($data2['1']);
foreach ($data2 as $i=> $v) {
foreach ($data_header_var as $j => $var){
eval($var.'= $v[$j];');
}*/
function Excel2Array($fileName, $data_header_var=array()){
require_once 'Excel/reader.php';
$data = new Spreadsheet_Excel_Reader();
$data->setOutputEncoding('utf-8'); //gbk
$data->read($fileName);
$dataRows = $lineData = array();
$numRows = $data->sheets["0"]['numRows'];
for ($i = 2; $i <= $numRows; $i++) {
foreach ($data_header_var as $j => $var){
$lineData[$var] = $data->sheets["0"]["cells"][$i][$j];
}
$dataRows[] = $lineData;
}
return $dataRows;
}
導出
<?php
/*$excel = new Excel();
//$excel->setEncode("utf-8","gb2312"); //設置編碼
$titleData = array("name","price","content","total");//設置標題欄
$data = array(
array("ab","ac","ad","ae"),
array("abc","acc","adc","aec"),
array("abd","acd","add","aed"),
't'=>array("abe","ace","ade","aee"),
);
$excel->getExcel($titleData, $data, "demo");
*/
class Excel {
var $inEncode = "utf-8"; //一般是頁面編碼
var $outEncode = "utf-8"; //一般是Excel文件的編碼
var $content = '';
/**
*設置編碼
*/
public function setEncode($incode, $outcode){
$this->inEncode = $incode;
$this->outEncode = $outcode;
}
/**
*設置Excel的行記錄
*/
public function setRow($lineData){
$title = "";
foreach($lineData as $v){
if($this->inEncode != $this->outEncode){
$title .= iconv($this->inEncode,$this->outEncode,$v)."\t";
}else{
$title .= $v."\t";
}
}
$title .= "\n";
return $title;
}
/**
*設置Excel內容
*/
public function setRows($array){
$content = "";
foreach($array as $k => $v){
$content .= $this->setRow($v);
}
return $content;
}
/**
*生成並自動下載Excel
* $titleData 標題欄數組
* $array 內容數組
* $filename 文件名稱 (爲空,已當前日期爲名稱)
*/
public function getExcel($titleData, $array, $filename = ''){
if($filename==''){
$filename = date("Y-m-d");
}
$title = $this->setRow($titleData);
$content = $this->setRows($array);
header("Content-type:application/vnd.ms-excel");
header("Content-Disposition:filename=".$filename.".xls");
echo $title;
echo $content;
}
}
php讀取淘寶數據包csv文件 unicode
public static function fopen_utf8($filename)
{
$encoding = '';
$handle = fopen($filename, 'r');
$bom = fread($handle, 2);
rewind($handle);
if ($bom === chr(0xff) . chr(0xfe) || $bom === chr(0xfe) . chr(0xff)) {
// UTF16 Byte Order Mark present
$encoding = 'UTF-16';
} else {
$file_sample = fread($handle, 1000) + 'e'; //read first 1000 bytes
rewind($handle);
$encoding = mb_detect_encoding($file_sample, 'UTF-8, UTF-7, ASCII, EUC-JP,SJIS, eucJP-win, SJIS-win, JIS, ISO-2022-JP');
}
if ($encoding) {
stream_filter_append($handle, 'convert.iconv.' . $encoding . '/UTF-8');
}
return ($handle);
}
//得到csv data
public function getCsvFileData($filename)
{
$handle = Helper::fopen_utf8($filename, "r");
$csvData = array();
for ($j = 1; !feof($handle); $j++) {
$line = fgets($handle);
$val = explode("\t", $line);
if ($j > 1) {
$line = array(
'title' => $val[0],
//'cate' => $val[1],
'price' => $val[2], //價格
'inventory' => trim($val [3]), //數量
'descript' => trim($val [4]), //描述
'import_images' => trim($val[5]), //圖片
'sku' => trim($val[6]), //商家編碼
'weight' => trim($val[7]), //重量
);
$csvData[] = $line;
}
}
return $csvData;
}
//校驗數據
public function checkProductImportData($adminId, $csvData)
{
$checkArray = array();
foreach ($csvData as $product) {
$checkArray[] = $product['sku'];
}
$list = 'db中的sku列表在文件sku中的'
$result = array('status' => 10000, 'msg' => '');
if (count($list) == count($checkArray)) {
$result['status'] = 2;
$result['msg'] = '文件裏的商品已經導入過';
} elseif (count($list) > 0) {
$dbhasskulist = array();
$alllist = self::model()->findAllSkuFromDb();
foreach ($alllist as $info) {
if ($info->sku && in_array($info->sku, $checkArray)) {
$dbhasskulist[] = $info->sku;
}
}
$result['status'] = 1;
$result['msg'] = "商品貨號重複:" . implode(",", array_unique($dbhasskulist));
}
return $result;
}