楊鑫
摘要:在信息系統(tǒng)的開發(fā)過程中,經(jīng)常要將電子表格導(dǎo)入到網(wǎng)站數(shù)據(jù)庫(kù)表,有時(shí)候還需要將數(shù)據(jù)庫(kù)表中的內(nèi)容導(dǎo)出到Excel電子表格。該文介紹了一種基于PHP的電子表格導(dǎo)入導(dǎo)出技術(shù):將電子表格保存為CSV格式,再讀出每行數(shù)據(jù),分隔每行數(shù)據(jù)為不同的字段,再把字段寫入數(shù)據(jù)庫(kù)表;此外,PHP還提供了寫Excel電子表格的功能。
關(guān)鍵詞:Excel電子表格;MySql數(shù)據(jù)表;導(dǎo)入;導(dǎo)出
中圖分類號(hào):TP317 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2016)18-0091-02
PHP Implementation of Data Import and Export in the Online Examination System
YANG Xin
(Department of Computer Science,Wuhan Polytechnic, Wuhan 430074, China)
Abstract: In the development process of information system, often need to import the spreadsheet to the website database table, and sometimes also need to export the contents of the database table to Excel electronic form. This paper introduces a kind of based on PHP spreadsheet import and export technology: save the spreadsheet as a file in CSV format, read out data for each line, separating each row of data for different field, then the field is written as a database table; in addition, PHP also provides functionality to write Excel spreadsheet.
Key words:Excel table; MySQL table; import; export
本網(wǎng)絡(luò)在線考試系統(tǒng)采用LAMP(Linux+Apache+MySQL+PHP)平臺(tái)。采用B/S架構(gòu),根據(jù)武漢職業(yè)技術(shù)學(xué)院精品資源共享課《管理信息系統(tǒng)開發(fā)》在線考試系統(tǒng)需求,本考試系統(tǒng)支持單選題、多選題、判斷題等客觀題題型,支持將考生信息和試題從Excel中導(dǎo)入到系統(tǒng)(MySQL數(shù)據(jù)庫(kù)),還支持將成績(jī)信息(MySQL數(shù)據(jù)表)導(dǎo)出到Excel電子表格。
1 從Excel電子表格導(dǎo)入到MySQL數(shù)據(jù)表
將電子表格Excel導(dǎo)入到MySQL數(shù)據(jù)庫(kù)表。為了最簡(jiǎn)潔地把問題講述清楚,我們以最簡(jiǎn)單的電子表格stu.xls為例,stu.xls中保存中考生的信息,包括學(xué)號(hào)、姓名和成績(jī),其中考前成績(jī)?yōu)榭?,考試結(jié)束后成績(jī)不為空。
1.1 電子表格轉(zhuǎn)變?yōu)榧兾谋靖袷?/p>
第一步,使用辦公軟件Excel將電子表格stu.xls另存為stu.csv格式,如圖1所示。CSV格式實(shí)際上是一種以逗號(hào)為分隔的純文本格式,如果使用記事本打開stu.csv文件則顯示為如圖2的純文本格式。
1.2 純文本文件的分割
第二步:分割純文本文件stu.csv。因?yàn)樵撐募羌兾谋疚募?,容易想到將該文件分割為不同的行,每一行就是一個(gè)考生信息的記錄(除首行是標(biāo)題信息外)。然后再用逗號(hào)將每一行繼續(xù)分割為不同的字段值。在php中提供了字符串分割函數(shù)explode。該函數(shù)的功能是分割字符串為字符型數(shù)組。例如:執(zhí)行語(yǔ)句$st=explode(“,”,”01,劉備”)后,可以得到$st[0]=”01”,$st[1]=”劉備”。
關(guān)鍵代碼為:
$content=file_get_contents("cj.csv");
$temp = explode("\r\n",$content);
$content就是文本文件中的內(nèi)容,包含特殊字符回車和換行。因此可以考慮使用回車和換行字符將$content分割為字符型數(shù)組。上面兩行代碼執(zhí)行之后,$temp[0]=”學(xué)號(hào),姓名,成績(jī)”;$tem[1]=”01,劉備”;$temp[2]=”02,關(guān)羽”;$temp[3]=”03,張飛”;$temp[4]=”04,趙云”;
1.3 繼續(xù)分割記錄,并寫入MySQL數(shù)據(jù)庫(kù)表
第三步:繼續(xù)分割文本文件的每一行。即分割$temp數(shù)組的每一個(gè)元素。使用逗號(hào)來分割。分割得到的結(jié)果是不同的字段,例如可以得到“01”、“劉備”、“03”、“趙云”等等信息。然后順便寫入到MySQL數(shù)據(jù)庫(kù)表中。關(guān)鍵代碼為:
$conn=mysql_connect("127.0.0.1","root","root") or die ("connect mysql false");
mysql_select_db("db_chengji", $conn);
mysql_query("set names utf8");
for ($j=1;$j { $st=explode(",",$temp[$j]); $sql3="insert into tb_cj (xuehao,xingming,score) values( '".$st[0]."','".$st[1]."','-1')";
mysql_query($sql3,$conn);
}
上面的代碼,將Excel表中的內(nèi)容分割為多行,每一行保存在數(shù)組$temp中,再將字符型數(shù)組的每一個(gè)元素分割為單個(gè)的字段信息。
考慮到標(biāo)題無需導(dǎo)入到數(shù)據(jù)庫(kù)表,因此上面的循環(huán)變量$j從1開始(有意跳過0,忽略標(biāo)題信息),再將記錄插入MySQL數(shù)據(jù)表的時(shí)候,將成績(jī)項(xiàng)用字符串-1來填充(-1表示考試前)。
Excel文件stu.csv導(dǎo)入到數(shù)據(jù)表tb_cj后結(jié)果如圖3所示。
2 從MySQL數(shù)據(jù)表導(dǎo)出到Excel電子表格
考試后需要將考生的成績(jī)導(dǎo)出到Excel 文件。導(dǎo)出為Excel文件非常簡(jiǎn)單,只需要把成績(jī)顯示在html的table中,然后在php文件的前面加上下面兩個(gè)語(yǔ)句即可:
header("Content-type:application/vnd.ms=excel");
header("Content-Disposition:attachment;filename=cj.xls");
完整代碼如下:
<?php
header("Content-type:application/vnd.ms=excel");
header("Content-Disposition:attachment;filename=cj.xls");
$conn=mysql_connect("127.0.0.1","root","root") or die ("connect mysql false");
mysql_query("set names utf8");
$db_selected = mysql_select_db("db_chengji", $conn);
$sql=mysql_query("select * from tb_cj",$conn);
?>
<?php while($info=mysql_fetch_array($sql)){ ?>
<?php } ?>
<?php echo "學(xué)生成績(jī)表";?> | ||
考號(hào) | 姓名 | 分?jǐn)?shù) |
<?php echo $info[1];?> | <?php echo $info[2];?> | <?php echo $info[3];?> |
導(dǎo)出后的Excel文件如圖4所示:
備注:圖中0分、89分和78分是考試成績(jī),而-1則表示該生沒有參加考試。
3 結(jié)束語(yǔ)
關(guān)于導(dǎo)入:可以采用通用式的方法。比如導(dǎo)入考試試題的時(shí)候,有些題目有兩個(gè)選項(xiàng)(判斷題)有些題目是四個(gè)選項(xiàng)(單選題),有些則是五個(gè)選項(xiàng),可以采用文件域打開Excel 文件,并對(duì)打開的文件的數(shù)據(jù)進(jìn)行自動(dòng)判斷,在導(dǎo)入文件中的數(shù)據(jù)進(jìn)行檢測(cè),篩選,等等。
關(guān)于導(dǎo)出:因?yàn)閔tml中的表格table是可以設(shè)置為各種各樣的,導(dǎo)出后的Excel 文件會(huì)與table表格完全一致,因此,完全可以將最高分、最低分、不及格分?jǐn)?shù)、不及格人數(shù)、平均分,缺考考生姓名等以不同顏色字體顯示出來,還可以詳細(xì)地分析成績(jī)并以餅圖的形式顯示出來,因?yàn)槠?,本文不做介紹。
參考文獻(xiàn):
[1] 軟件開發(fā)技術(shù)聯(lián)盟.PHP開發(fā)實(shí)例大全[M].北京:清華大學(xué)出版社,2016.
[2] 徐康明, 辛洪郁.實(shí)戰(zhàn)突擊PHP項(xiàng)目開發(fā)案例整合[M]. 2版.北京:電子工業(yè)出版社, 2014.