简体   繁体   English

如何使用 phpoffice 从 .xlsx 文件中提取特定工作表并从中创建新的 .xlsx?

[英]How can I use phpoffice to extract a specific worksheet from an .xlsx file and create a new .xlsx from it?

I have one.xlsx file containing several worksheets.我有一个包含多个工作表的 one.xlsx 文件。 This.xlsx is generated using the php library phpoffice / phpspreadsheet. This.xlsx 是使用 php 库 phpoffice / phpspreadsheet 生成的。 What I need to do is extract a specific worksheet from this file and create a new one - a separate.xlsx file.我需要做的是从此文件中提取一个特定的工作表并创建一个新的 - 一个单独的 .xlsx 文件。

My PHP code look like this:我的 PHP 代码如下所示:

<?php
// autoload of phpoffice library
require 'vendor/autoload.php';
use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
use PhpOffice\PhpSpreadsheet\Spreadsheet;

// load .xlsx file from html form
$reader = IOFactory::createReader('Xlsx');
$spreadsheet = $reader->load($_FILES['in_file']['tmp_name']);

// setting the required sheet
$sheet = $spreadsheet->getSheetByName('required sheet');

// instance of the Worksheet object
$ws = new Worksheet($sheet);

// creating a new spreadsheet
$newSpreadsheet = new Spreadsheet();

// adding a worksheet to a new spreadsheet
$newSpreadsheet->addSheet($ws, 1);

// remove the worksheet in the first position
$newSpreadsheet->removeSheetByIndex(0);

// save the new .xlsx file
$writer = IOFactory::createWritter($newSpreadsheet, 'Xlsx');
$writer->save('new_xlsx.xlsx');

A new.xlsx file is generated, the worksheet name of this new file is set, but this worksheet is not populated with data.生成了一个新的.xlsx 文件,设置了这个新文件的工作表名称,但是这个工作表没有填充数据。 Why?为什么? What's missing me?我缺什么? Did I forget something?我忘了什么吗?

You were close to getting the solution!您即将获得解决方案! PhpSpreadsheet allows you to use the clone keyword on sheet objects and then add them to other spreadsheets. PhpSpreadsheet 允许您在工作表对象上使用clone关键字,然后将它们添加到其他电子表格。 I see you're getting this from an uploaded form so a simple check of the MIME Type is probably a good idea.我看到您是从上传的表单中获取的,因此简单检查 MIME 类型可能是个好主意。

$required_sheet = 'Test3';
$input_file = 'test.xlsx';

$mime_type = mime_content_type($input_file);
if ($mime_type !== 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
    die('Not an Xlsx file');

$reader = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx;
$reader->setReadDataOnly(true);

$original = $reader->load($input_file);

$cloned_worksheet = clone $original->getSheetByName($required_sheet);

$new = new \PhpOffice\PhpSpreadsheet\Spreadsheet();
$new->addSheet($cloned_worksheet);
$sheetIndex = $new->getIndex(
    $new->getSheetByName('Worksheet')
);
$new->removeSheetByIndex($sheetIndex);

$writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($new, "Xlsx");
$writer->save($required_sheet . '.xlsx');

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM