一:
项目目的,通过php4将Excel数据导出到MySQL中。
解决方法:
1、Excel另存为CSV格式。然后将CSV格式直接导入MySQL中(可以通过PHPMyAdmin导入CSV,改分隔符为“,”)。但是如果Excel文件中含多工作表(多个Sheet中都含数据)那么用CSV是不太方便的。因为Excel直接稻城CSV时是不支持多工作表的,只能将每个工作表的数据复制到新建的Excel文件中然后分别导出。
2、Excel另存为XML格式。XML文件天生就是干异构系统数据迁移用的。同时Excel导出XML文件时支持多工作表。
所以决定用XML文件格式导入。
注:(XML从Excel中导出后是UTF-8格式,PHP操作XML时默认编码是ISO-8859-1,而本人的php程序是GB2312编码,所以在操作时注意文件格式的声明和转换。)
二:
PHP4操作XML的步骤:
(1)创建XML编辑器
$parser = xml_parser_create("Encode"); //参数可填写xml文件的编码格式,该参数可选;
(2)设置处理开始标记和结束标记的方法,方法名称以字符串形式提供
xml_set_element_handler($parser, "startElement", "endElement");
//指定遇到XML中的任意开始标记是运行 function startElement,
遇到任意结束标记()时运行function endElement; $parser 代表XML编辑器;和image函数类似
(3)设置遇到数据(开始标记和结束标记之间的值)时的处理方式
xml_set_character_data_handler($parser, "characterData"); //设立数据读取时调用function characterData
设置完处理函数後就要打开XML文件,然后用 xml_parse 解析XML文件。xml_parse的调用需要在设置完以上三步后才能调用,否则报错
(4) fopen 打开xml 然后 fread 读xml文件
$filehandler = fopen(“xml文件路径”, "r"); //打开文件
while ($data = fread($filehandler, filesize($xml_file)))
//读xml文件,读取内容长度为filesize($xml_file)个字节 --xml文件长度
{
xml_parse($parser, $data, feof($filehandler)); //(5) 解析获得的data数据,该过程将会调用上面设置的相应处理方式
}
三、以上是操作步骤,接下来贴出实际样例
<?php error_reporting(E_ALL | E_WARNING); ini_set('display_errors',1);
$parser = xml_parser_create("UTF-8"); //创建一个parser编辑器
xml_set_element_handler($parser, "startElement", "endElement");//设立标签触发时的相应函数 这里分别为startElement和endElenment
xml_set_character_data_handler($parser, "characterData");//设立数据读取时的相应函数
$xml_file="try.xml";//指定所要读取的xml文件,可以是url
$filehandler = fopen($xml_file, "r");//打开文件
while ($data = fread($filehandler, filesize($xml_file))) { xml_parse($parser,$data, feof($filehandler)); } fclose($filehandler); $fla =& xml_parser_free($parser);//关闭和释放parser解析器
if ($fla){ print_r($re); }else { echo "XML解析器关闭失败!"; } $name=false; $position=false;
function startElement($parser_instance, $element_name, $attrs) //起始标签事件的函数,只读取开始标记
{ global $Data,$att; if($element_name=="DATA") { $Data = true; switch ($attrs["SS:TYPE"]){ case "Number": $att = "listed_SC"; break; case "String": $att = "operationType"; break; } }else { $Data = false; } }
function characterData($parser_instance, $xml_data) //读取数据时的函数
{ global $Data,$att; if($Data){ $a=iconv("UTF-8","GB2312",$xml_data); getData($att,$a); }//End if
$Data = false; }
function endElement($parser_instance, $element_name) //结束标签事件的函数
{ } function getData($att,$va){ global $re; $re[$att][] = $va; } ?>
|
读取的xml文件try.xml为(该文件是Excel导出的)
<?xml version="1.0"?> <?mso-application progid="Excel.Sheet"?> <Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:html=""> <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office"> <Author>CFXY-ZJ</Author> <LastAuthor>CFXY-ZJ</LastAuthor> <Created>2007-11-29T02:47:50Z</Created> <LastSaved>2007-11-29T02:48:23Z</LastSaved> <Company>CFXY</Company> <Version>11.5606</Version> </DocumentProperties> <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel"> <WindowHeight>8895</WindowHeight> <WindowWidth>13875</WindowWidth> <WindowTopX>120</WindowTopX> <WindowTopY>30</WindowTopY> <ProtectStructure>False</ProtectStructure> <ProtectWindows>False</ProtectWindows> </ExcelWorkbook> <Styles> <Style ss:ID="Default" ss:Name="Normal"> <Alignment ss:Vertical="Center"/> <Borders/> <Font ss:FontName="宋体" x:CharSet="134" ss:Size="12"/> <Interior/> <NumberFormat/> <Protection/> </Style> </Styles> <Worksheet ss:Name="Sheet1"> <Table ss:ExpandedColumnCount="2" ss:ExpandedRowCount="3" x:FullColumns="1" x:FullRows="1" ss:DefaultColumnWidth="54" ss:DefaultRowHeight="14.25"> <Row> <Cell><Data ss:Type="Number">60001</Data></Cell> <Cell><Data ss:Type="String">A</Data></Cell> </Row> <Row> <Cell><Data ss:Type="Number">60002</Data></Cell> <Cell><Data ss:Type="String">B</Data></Cell> </Row> <Row> <Cell><Data ss:Type="Number">60004</Data></Cell> <Cell><Data ss:Type="String">G</Data></Cell> </Row> </Table> <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel"> <Selected/> <Panes> <Pane> <Number>3</Number> <ActiveRow>2</ActiveRow> <ActiveCol>1</ActiveCol> </Pane> </Panes> <ProtectObjects>False</ProtectObjects> <ProtectScenarios>False</ProtectScenarios> </WorksheetOptions> </Worksheet> <Worksheet ss:Name="Sheet2"> <Table ss:ExpandedColumnCount="0" ss:ExpandedRowCount="0" x:FullColumns="1" x:FullRows="1" ss:DefaultColumnWidth="54" ss:DefaultRowHeight="14.25"/> <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel"> <ProtectObjects>False</ProtectObjects> <ProtectScenarios>False</ProtectScenarios> </WorksheetOptions> </Worksheet> <Worksheet ss:Name="Sheet3"> <Table ss:ExpandedColumnCount="0" ss:ExpandedRowCount="0" x:FullColumns="1" x:FullRows="1" ss:DefaultColumnWidth="54" ss:DefaultRowHeight="14.25"/> <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel"> <ProtectObjects>False</ProtectObjects> <ProtectScenarios>False</ProtectScenarios> </WorksheetOptions> </Worksheet> </Workbook>
|
输出结果为:
Array ( [listed_SC] => Array ( [0] => 60001 [1] => 60002 [2] => 60004 ) [operationType] => Array ( [0] => A [1] => B [2] => G ) )
阅读(4058) | 评论(0) | 转发(0) |