用PHP读写XLSM文件
我想用PHP读写XLSM类型文件。我试着使用PHPSpreadsheet,但它不支持XLSM扩展 一种可能的解决方案是使用EasyXLS用PHP读写XLSM文件,php,phpspreadsheet,xlsm,Php,Phpspreadsheet,Xlsm,我想用PHP读写XLSM类型文件。我试着使用PHPSpreadsheet,但它不支持XLSM扩展 一种可能的解决方案是使用EasyXLS //创建导入XLSM文件的类的实例 $workbook=new COM(“EasyXLS.ExcelDocument”); //导入XLSM文件 $workbook->easy_LoadXLSXFile(“C:\\Samples\\Excel to import.xlsm”); //获取第二个工作表的表格 $xlsSecondTable=$workbook->
//创建导入XLSM文件的类的实例
$workbook=new COM(“EasyXLS.ExcelDocument”);
//导入XLSM文件
$workbook->easy_LoadXLSXFile(“C:\\Samples\\Excel to import.xlsm”);
//获取第二个工作表的表格
$xlsSecondTable=$workbook->easy_getSheet(“第二个选项卡”)->easy_getExcelTable();
//向第二张图纸添加更多数据
$xlsSecondTable->easy_getCell_2(“A1”)->setValue(“由教程37添加的数据”);
对于($column=0;$columneasy_getCell(1,$column)->setValue(“数据”)($column+1));
}
//生成XLSM文件
$workbook->easy_WriteXLSXFile(“C:\Samples\Excel with macro.xlsm”);
但我找不到这方面的图书馆
是否有人对此有任何可能的解决方案或其他方法?函数excel($excelfile,$sheet=false){//from stores.blade.php
$tempfile=resource_path(“uploads/excel.xlsm”);//它只需要一个临时存储XML文件的地方,此函数仅在Laravel中起作用,替换为文件名
如果($sheet){//加载XML文件
//$XML=文件获取内容($tempfile);
$XML=simplexml\u加载文件($excelfile);
$XML=json_decode(json_encode((数组)$XML),TRUE);
$excelfile=pathinfo($sheet)['basename'];
如果($excelfile==“workbook.xml”){
$RET=[];
foreach($XML[“sheets”][“sheet”]作为$data){
$RET[$data[“@attributes”][“sheetId”]=$data[“@attributes”][“name”];
}
返回[
'Filename'=>$excelfile,
“SheetName”=>“系统工作簿”,
“SheetData”=>RET美元,
];
}else if($excelfile==“sharedStrings.xml”){
foreach($XML[“si”]as$index=>$value){
如果(isset($value[“t”])){
$value=$value[“t”];
}否则{
foreach($value[“r”]作为$index2=>$value2){
if(是_数组($value2[“t”])){
$value2[“t”]=$value2[“t”][0];
}
$value[“r”][$index2]=$value2[“t”];
}
$value=内爆(“,$value[“r”]);
}
if(是_数组($value)){
$value=$value[0];
}
$XML[“si”][$index]=$value;
}
返回[
'Filename'=>$excelfile,
“SheetName”=>“系统字符串”,
“SheetData”=>$XML[“si”],
];
}else if(isset($XML[“sheetPr”])){
返回[
'Filename'=>$excelfile,
'SheetName'=>$XML[“sheetPr”][“@attributes”][“codeName”],
“SheetData”=>$XML[“SheetData”][“行”],
];
}
返回false;
}else{//加载压缩的XLSM文件
$files=[];
$zip=新的ZipArchive;
如果($zip->open($excelfile)==TRUE){
对于($i=0;$i<$zip->numFiles;$i++){
$filename=$zip->getNameIndex($i);
如果(从($filename,“xl/worksheets/”)开始,| |$filename==“xl/workbook.xml”| |$filename=“xl/sharedStrings.xml”){
复制(“zip://”。$excelfile。”#“$filename,$tempfile);
$XML=excel($tempfile,$filename);
如果($XML!==false){
$files[$XML[“SheetName”]=$XML[“SheetData”];
}
}
}
@取消链接($tempfile);
$zip->close();
}
var_dump($files);
模具();
}
}
我开始做这方面的工作,我走了这么远。问题是,我不知道共享字符串(sys_字符串)是如何被引用的,你需要一个等式计算器来处理函数。我希望,工作表是有序的,因此Sheet1成为sys_工作簿中的第一个数组值。你有什么操作系统?我使用的是Ubuntu(Linux)此外,我还发现COM是一个仅限窗口的扩展,在我的情况下无法工作。事实上,您需要用于Ubuntu的EasyXLS java版本
// Create an instance of the class that imports XLSM files
$workbook = new COM("EasyXLS.ExcelDocument");
// Import XLSM file
$workbook->easy_LoadXLSXFile("C:\\Samples\\Excel to import.xlsm");
// Get the table of the second worksheet
$xlsSecondTable = $workbook->easy_getSheet("Second tab")->easy_getExcelTable();
// Add more data to the second sheet
$xlsSecondTable->easy_getCell_2("A1")->setValue("Data added by Tutorial37");
for ($column=0; $column<5; $column++)
{
$xlsSecondTable->easy_getCell(1, $column)->setValue("Data " . ($column + 1));
}
// Generate the XLSM file
$workbook->easy_WriteXLSXFile("C:\Samples\Excel with macro.xlsm");
function excel($excelfile, $sheet = false){//from stores.blade.php
$tempfile = resource_path("uploads/excel.xlsm");//it just needs a place to store the XML file temporarily, this function only works in Laravel, replace with a filename
if($sheet){//load XML file
//$XML = file_get_contents($tempfile);
$XML = simplexml_load_file($excelfile);
$XML = json_decode(json_encode((array)$XML), TRUE);
$excelfile = pathinfo($sheet)['basename'];
if($excelfile == "workbook.xml"){
$RET = [];
foreach($XML["sheets"]["sheet"] as $data){
$RET[ $data["@attributes"]["sheetId"] ] = $data["@attributes"]["name"];
}
return [
'Filename' => $excelfile,
'SheetName' => "sys_workbook",
'SheetData' => $RET,
];
} else if($excelfile == "sharedStrings.xml"){
foreach($XML["si"] as $index => $value){
if(isset($value["t"])){
$value = $value["t"];
} else {
foreach($value["r"] as $index2 => $value2){
if(is_array($value2["t"])){
$value2["t"] = $value2["t"][0];
}
$value["r"][$index2] = $value2["t"];
}
$value = implode("", $value["r"]);
}
if(is_array($value)){
$value = $value[0];
}
$XML["si"][$index] = $value;
}
return [
'Filename' => $excelfile,
'SheetName' => "sys_strings",
'SheetData' => $XML["si"],
];
} else if(isset($XML["sheetPr"])){
return [
'Filename' => $excelfile,
'SheetName' => $XML["sheetPr"]["@attributes"]["codeName"],
'SheetData' => $XML["sheetData"]["row"],
];
}
return false;
} else {//load ZIPped XLSM file
$files = [];
$zip = new ZipArchive;
if ($zip->open($excelfile) === TRUE) {
for($i = 0; $i < $zip->numFiles; $i++) {
$filename = $zip->getNameIndex($i);
if(startswith($filename, "xl/worksheets/") || $filename == "xl/workbook.xml" || $filename = "xl/sharedStrings.xml"){
copy("zip://" . $excelfile . "#" . $filename, $tempfile);
$XML = excel($tempfile, $filename);
if($XML !== false){
$files[ $XML["SheetName"] ] = $XML["SheetData"];
}
}
}
@unlink($tempfile);
$zip->close();
}
var_dump($files);
die();
}
}