wj / excel
An eloquent way of importing and exporting Excel and CSV with the power of PHPExcel,come from laravel/excel
1.0.3
2017-02-21 05:56 UTC
Requires
- php: >=5.4.0
This package is not auto-updated.
Last update: 2024-12-21 21:03:17 UTC
README
导入文件 要导入一个文件,使用:->load($filename)。配置可选。 Excel::load('file.xls', function($reader) { // reader methods }); 处理导入结果 得到所有表和行 加载一个文件后,用->get()像这样得到结果: Excel::load('file.xls', function($reader) { })->get(); 或者 Excel::load('file.xls', function($reader) { // Getting all results $results = $reader->get(); // ->all() is a wrapper for ->get() and will work the same $results = $reader->all(); }); 根据文件的数量而定,->get() 和 ->all()将返回表或者行集合,可以在import.php里面设置'force_sheets_collection'为true禁用这个功能。当设置为true时将总是返回一个表集合。 表头属性 默认excel文件第一行用作表头属性。 // Get the firstname $row->firstname; 注:默认情况下,这些属性将被转换为一个段塞,在excel::import.heading里可以改变默认内容,可选值有:true|false|slugged|ascii|numeric|hashed|trans|original。当excel::import.to_ascii设置为true时,True 和 slugged 将转换为 ASCII,可以更改默认分隔符以及内部配置。 集合 表,行和单元格都是集合,意味着之后可以跟->get(),能使用所有集合默认的方法。 // E.g. group the results $reader->get()->groupBy('firstname'); 获得第一个表或者第一行 要获得第一个表或者第一行,可以用->first()。 $reader->first(); 注:根据设置'force_sheets_collection'的不同,将返回第一行或者第一个表。 工作薄和表的标题 用->getTitle()检索工作薄和表的标题。 // Get workbook title $workbookTitle = $reader->getTitle(); foreach($reader as $sheet) { // get sheet title $sheetTitle = $sheet->getTitle(); } 限制结果 抓取行 当你只想返回一个表里的X行时,用->take() 或者 ->limit()。 // You can either use ->take() $reader->take(10); // Or ->limit() $reader->limit(10); 跳过行 当你想跳过一定数量的行,可以用->skip() 或者 ->limit(false, 10)。 // Skip 10 results $reader->skip(10); // Skip 10 results with limit, but return all other rows $reader->limit(false, 10); // Skip and take $reader->skip(10)->take(10); // Limit with skip and take $reader->($skip, $take); 修改结果 当你想返回一个数组而不是一个对象时,可以用->toArray()。 $reader->toArray(); 当你想返回一个对象,可以选择(代替get() 或者 all())用->toObject()。 $reader->toObject(); 显示结果 可以将结果转储到可读输出,使用->dump() 或者 ->dd()。 // Dump the results $reader->dump(); // Dump results and die $reader->dd(); 迭代结果 可以用->each()迭代结果。 // Loop through all sheets $reader->each(function($sheet) { // Loop through all rows $sheet->each(function($row) { }); }); 另外,也可以用foreach迭代结果。 选择表和列 选择一个指定表 如果你想选择单个表,可以用->selectSheets($name),仅仅这个表被载入。 Excel::selectSheets('sheet1')->load(); 选择多个表 如果你想选择文件里的多个表,通过在参数里传入一个数组。 Excel::selectSheets('sheet1', 'sheet2')->load(); 用索引选择表 // First sheet Excel::selectSheetsByIndex(0)->load(); // First and second sheet Excel::selectSheetsByIndex(0, 1)->load(); 选择列 如果只想选择一部分列,可以用->select($columns)或者传入一个数组到->get($columns)的第一个参数。 // Select $reader->select(array('firstname', 'lastname'))->get(); // Or $reader->get(array('firstname', 'lastname')); 全部 get 方法 (像 all(), first(), dump(), toArray(), ...)接受一个列的数组。 日期 日期默认被解析为一个Carbon object,可以在import.php里设置dates.enabled 为 false禁用日期格式化编译。 启用/禁用单一导入的日期格式,用->formatDates($boolean, $format) // Format the dates $reader->formatDates(true); // Disable date formatting $reader->formatDates(false); // Format dates + set date format $reader->formatDates(true, 'Y-m-d'); 格式化日期 默认状态日期不格式化,但返回一个Carbon对象,这里有一些选项格式化他们。 在->get()后格式化结果 在循环中,你可以利用Carbon方法->format($dateFormat) $rows->each(function($row) { $created_at = $row->created_at->format('Y-m-d'); }); 设置一个默认日期格式 $reader->setDateFormat('Y-m-d'); 设置自定义日期列 没有日期格式的单元格将不被解析为日期。强迫这种行为(或者用CSV导入)您可以手动设置这些日期列:->setDateColumns() $reader->setDateColumns(array( 'created_at', 'deleted_at' ))->get(); 计算公式 默认文件里的公式将被计算且返回结果,在import.php里设置calculate改变默认行为以达到理想状态。 如果您想启用/禁用它为一个单一的导入,可以用->calculate($boolean) // Enable calculation $reader->calculate(); // Disable calculation $reader->calculate(false); 自定认格式化值 默认 Excel使用PHPExcel的默认值来智能格式化的单元格值。你可以重写以取代这种行为的粘合,以满足特定需求。值粘合必须有PHPExcel_Cell_IValueBinder和一个bindValue方法。也可以扩展PHPExcel_Cell_DefaultValueBinder返回默认行为。 use PHPExcel_Cell; use PHPExcel_Cell_DataType; use PHPExcel_Cell_IValueBinder; use PHPExcel_Cell_DefaultValueBinder; class MyValueBinder extends PHPExcel_Cell_DefaultValueBinder implements PHPExcel_Cell_IValueBinder { public function bindValue(PHPExcel_Cell $cell, $value = null) { if (is_numeric($value)) { $cell->setValueExplicit($value, PHPExcel_Cell_DataType::TYPE_NUMERIC); return true; } // else return default behavior return parent::bindValue($cell, $value); } } $myValueBinder = new MyValueBinder; Excel::setValueBinder($myValueBinder)->load('file.xls', function($reader) { // reader methods }); PHPExcel_Cell_DataType 可用 TYPE_STRING, TYPE_FORMULA, TYPE_NUMERIC, TYPE_BOOL, TYPE_NULL, TYPE_INLINE 和 TYPE_ERROR。 重置默认的值或者调用Laravel Excel前设置一个自定义粘合,需要调用resetValueBinder方法。 1 Excel::resetValueBinder(); 缓存和单元格缓存 单元格缓存 可以配置cache.php开启单元格缓存,可以在两个动动之间选择和设置,默认开启memory驱动。 记住结果 可以用->remember($minutes)记住结果,下次载入相同的文件(如果它仍然在缓存里),将返回缓存结果。 // Remember for 10 minutes $results = $reader->remember(10)->get(); 导入块 处理大文件时,最好导入一大块数据,可以用filter('chunk')开启,要导入块可以用chunk($size, $callback)代替正常的get()。第一个参数是块的尺寸,第二个参数是一个闭包将返回结果。 Excel::filter('chunk')->load('file.csv')->chunk(250, function($results) { foreach($results as $row) { // do stuff } }); 批量导入 导入一个文件夹 要导入整个文件夹(仅仅xls, xlsx 和 csv文件会被导入),第一个参数设置为文件夹。 Excel::batch('app/storage/uploads', function($rows, $file) { // Explain the reader how it should interpret each row, // for every file inside the batch $rows->each(function($row) { // Example: dump the firstname dd($row->firstname); }); }); 导入多个文件 也可以通过指定一个文件数组导入。 $files = array( 'file1.xls', 'file2.xls' ); Excel::batch($files, function($rows, $file) { }); 导入一个文件夹和多个表 当文件包含多个表,还应该循环表 Excel::batch('app/storage/uploads', function($sheets, $file) { $sheets->each(function($sheet) { }); }); 导入设置 当使用高组Excel文件(如,没有任何表头列),这些导入可能比较复杂,->byConfig()将帮助你处理这些问题。 在excel::import.sheets里设置的例子: Excel::load('file.xls')->byConfig('excel::import.sheets', function($sheet) { // The firstname getter will correspond with a cell coordinate set inside the config $firstname = $sheet->firstname; }); 注意:如果你用多个表,->byConfig将循环通过所有表,如果getters仅存在其中一个表,可以一直用->selectSheets()。 编辑现有文件 你可以编辑现有Excel文件,载入然后改性导出它们。 Excel::load('file.csv', function($file) { // modify stuff })->export('csv'); 转换 从一个文件类型转换到另一个文件类型用->convert() Excel::load('file.csv', function($file) { // modify stuff })->convert('xls'); 其他 禁止使用第一行作为集合属性 默认用文件的第一行作为表头(因此,作为集合的属性名称),可以通过import.php里的import.heading改变。 在单个导入里用->noHeading() $reader->noHeading(); 设置单元格名称分隔符 通过在第一行列中查找默认集合属性名称,分隔翻译为:_。 例如:Created at -> created_at 改变import.php里的'separator'改变默认行为,或者可以用->setSeparator($separator)。 $reader->setSeparator('-'); 忽略空单元格 默认没有忽略空单元格,作为空的单元格集合 要改变这个默认行为,改变import.php里的'ignoreEmpty'或者用->ignoreEmpty()。 $reader->ignoreEmpty(); 输入编码 在import.php里设置改变输入编码,大多数情况下UTF-8是最好的选择,当然如果你要确认输出结果是和HTML页面原编码是一致的。 可以在->load()里传入输入编码 // When utilising a closure, you can pass the input encoding as third parameter. Excel::load('filename.csv', function($reader) { }, 'UTF-8'); // or without a closure, you can use it as second parameter. Excel::load('filename.csv', 'UTF-8'); CSV设置 在csv.php文件里,可以修改默认设置,像delimiter, enclosure 和 line_ending。 ############################################################################## 简单导出Excel 基础 用create方法设置第一个参数是文件名可以创建一个新文件。 Excel::create('Filename'); 要操作创建的文件可以用回调函数。 Excel::create('Filename', function($excel) { // Call writer methods here }); 改变属性 一些属性可以在内置闭包里改变,大多数值是默认设置的,查看 app/config/packages/maatwebsite/excel/config.php。 Excel::create('Filename', function($excel) { // Set the title $excel->setTitle('Our new awesome title'); // Chain the setters $excel->setCreator('Maatwebsite') ->setCompany('Maatwebsite'); // Call them separately $excel->setDescription('A demonstration to change the file properties'); }); 自己去参考指南看到可用属性的列表。 导出 下载生成的文件,用->export($ext) 或者 ->download($ext) 导出Excel5 (xls) Excel::create('Filename', function($excel) { })->export('xls'); // or ->download('xls'); 导出Excel2007 (xlsx) ->export('xlsx'); // or ->download('xlsx'); 导出CSV ->export('csv'); // or ->download('csv'); 可以在配置里设置默认外壳和分隔符。 导出PDF 要导出PDF,要在composer.json里包含"dompdf/dompdf": "~0.6.1", "mpdf/mpdf": "~5.7.3" 或者 "tecnick.com/tcpdf": "~6.0.0",修改export.pdf.driver相应的设置。 1 ->export('pdf'); 新Excel文件注入 自Laravel 5.0后这是个新颖的表单请求注入,这里介绍新Excel文件注入。 新Excel文件类 这个新Excel文件是一个新的Excel文件,在getFilename()里可以声明想要的文件名。 class UserListExport extends \Maatwebsite\Excel\Files\NewExcelFile { public function getFilename() { return 'filename'; } } 使用 可以在__constructor或者方法里注入新Excel文件(使用Laravel 5.0),如这个控制器: class ExampleController extends Controller { public function exportUserList(UserListExport $export) { // work on the export return $export->sheet('sheetName', function($sheet) { })->export('xls'); } } 导出处理 要完全从控制器解耦Excel导出代码,可以用导出处理, class ExampleController extends Controller { public function exportUserList(UserListExport $export) { // Handle the export $export->handleExport(); } } handleExport()方法会动态调用一个处理类,当类名添加Handler时: class UserListExportHandler implements \Maatwebsite\Excel\Files\ExportHandler { public function handle(UserListExport $export) { // work on the export return $export->sheet('sheetName', function($sheet) { })->export('xls'); } } 数据集在服务器 用服务器的数据集生成文件,使用 ->store($ext, $path = false, $returnInfo = false) 或者 ->save()。 正常导出到默认存储路径 默认文件会存储到app/storage/exports文件夹,定义在export.php配置文件。 Excel::create('Filename', function($excel) { // Set sheets })->store('xls'); 正常导出到自定义存储路径 如果想使用自定义存储路径(例如每个客户单独的文件),可以在第二个参数设置文件夹, 1 ->store('xls', storage_path('excel/exports')); 存储和导出 1 ->store('xls')->export('xls'); 存储和返回存储信息 如果想返回存储信息,设置第三个参数为true,或者在配置export.php里改变。 1 ->store('xls', false, true); Key 解释 full 完整路径和文件名 path 不包含文件名的路径 file 文件名 title 文件标题 ext 文件扩展名 确保存储文件夹可写。 表 生成一个表 在我们新创建的文件里生成一个表,用->sheet('Sheetname')。 Excel::create('Filename', function($excel) { $excel->sheet('Sheetname', function($sheet) { // Sheet manipulation }); })->export('xls'); 生成多个表 要在文件里设置多个表。 Excel::create('Filename', function($excel) { // Our first sheet $excel->sheet('First sheet', function($sheet) { }); // Our second sheet $excel->sheet('Second sheet', function($sheet) { }); })->export('xls'); 修改属性 里面有几个属性我们可以改变,他们中的大多数有默认的配置值。查看 app/config/packages/maatwebsite/excel/config.php。 Excel::create('Filename', function($excel) { $excel->sheet('Sheetname', function($sheet) { $sheet->setOrientation('landscape'); }); })->export('xls'); 自己去参考指南看到可用属性的列表。 默认页边距 可以设置默认页面边缘内的配置文件excel::export.sheets。它接受布尔、单值或数组。 可以使用手动设置页面:->setPageMargin() // Set top, right, bottom, left $sheet->setPageMargin(array( 0.25, 0.30, 0.25, 0.30 )); // Set all margins $sheet->setPageMargin(0.25); 密码保护表 表可以用$sheet->protect()设置密码保护: // Default protect $sheet->protect('password'); // Advanced protect $sheet->protect('password', function(\PHPExcel_Worksheet_Protection $protection) { $protection->setSort(true); }); 从一个数组生成表 数组 从一个数组生成新文件用:->fromArray($source, $nullValue, $startCell, $strictNullComparison, $headingGeneration)表内闭包: Excel::create('Filename', function($excel) { $excel->sheet('Sheetname', function($sheet) { $sheet->fromArray(array( array('data1', 'data2'), array('data3', 'data4') )); }); })->export('xls'); 另外可以用:->with() $sheet->with(array( array('data1', 'data2'), array('data3', 'data4') )); 如果想传递属性到闭包,用use($data) $data = array( array('data1', 'data2'), array('data3', 'data4') ); Excel::create('Filename', function($excel) use($data) { $excel->sheet('Sheetname', function($sheet) use($data) { $sheet->fromArray($data); }); })->export('xls'); 空比较 默认0显示为空单元格,如果要改变,传递true到第4个参数: // Will show 0 as 0 $sheet->fromArray($data, null, 'A1', true); 要改变默认行为,可以用excel::export.sheets.strictNullComparison设置。 Eloquent模型 它也可以传递一个Eloquent模型且导出用->fromModel($model)。与fromArray方法一样接受相同的参数。 自动生成表头 默认导出用数组的键(或者模型属性名)作为第一行(表头列)。要改变可以编辑默认配置(excel::export.generate_heading_by_indices)或者传递false到第5个参数。 // Won't auto generate heading columns $sheet->fromArray($data, null, 'A1', false, false); 处理(操作)行 处理部分行 改变单元格值 // Manipulate first row $sheet->row(1, array( 'test1', 'test2' )); // Manipulate 2nd row $sheet->row(2, array( 'test3', 'test4' )); 处理一行单元格 // 设置黑色背景 $sheet->row(1, function($row) { // 设用单元格处理方法 $row->setBackground('#000000'); }); 插入行 // 在第2行后插入 $sheet->appendRow(2, array( 'appended', 'appended' )); // 插入最后 $sheet->appendRow(array( 'appended', 'appended' )); 添加一行 // 添加到第1行前 $sheet->prependRow(1, array( 'prepended', 'prepended' )); // 添加到最前面 $sheet->prependRow(array( 'prepended', 'prepended' )); 添加多行 // 添加多行 $sheet->rows(array( array('test1', 'test2'), array('test3', 'test4') )); // 添加多行 $sheet->rows(array( array('test5', 'test6'), array('test7', 'test8') )); 处理(操作)单元格 $sheet->cell('A1', function($cell) { // manipulate the cell }); $sheet->cells('A1:A5', function($cells) { // manipulate the range of cells }); 设置背景 改变单元格背景用:->setBackground($color, $type, $colorType) // 设置黑色背景 $cells->setBackground('#000000'); 改变字体 / Set with font color $cells->setFontColor('#ffffff'); // Set font family $cells->setFontFamily('Calibri'); // Set font size $cells->setFontSize(16); // Set font weight to bold $cells->setFontWeight('bold'); // Set font $cells->setFont(array( 'family' => 'Calibri', 'size' => '16', 'bold' => true )); 设置边框 // Set all borders (top, right, bottom, left) $cells->setBorder('solid', 'none', 'none', 'solid'); // Set borders with array $cells->setBorder(array( 'borders' => array( 'top' => array( 'style' => 'solid' ), ) )); 设置水平对齐 // Set alignment to center $cells->setAlignment('center'); 设置垂直对齐 // Set vertical alignment to middle $cells->setValignment('middle'); 表格样式 如果你想要改变的一般样式表(不是特定的单元格或范围),用->setStyle()方法: // Set font with ->setStyle()` $sheet->setStyle(array( 'font' => array( 'name' => 'Calibri', 'size' => 15, 'bold' => true ) )); 字体 要改变当前表的字体用:->setFont($array) $sheet->setFont(array( 'family' => 'Calibri', 'size' => '15', 'bold' => true )); 分开设置 // Font family $sheet->setFontFamily('Comic Sans MS'); // Font size $sheet->setFontSize(15); // Font bold $sheet->setFontBold(true); 边框 设置表边框,用: // 设置所有边框 $sheet->setAllBorders('thin'); // 设置单元格边框 $sheet->setBorder('A1', 'thin'); // 指定范围边框 $sheet->setBorder('A1:F10', 'thin'); 自己去参考指南看到可用边框样式的列表。 冻结行 如果想冻结一个单元格,行或者列,用: // Freeze first row $sheet->freezeFirstRow(); // Freeze the first column $sheet->freezeFirstColumn(); // Freeze the first row and column $sheet->freezeFirstRowAndColumn(); // Set freeze $sheet->setFreeze('A2'); 自动过滤 开启自动过滤用:->setAutoFilter($range = false) // Auto filter for entire sheet $sheet->setAutoFilter(); // Set auto filter for a range $sheet->setAutoFilter('A1:E10'); 单元格尺寸 设置列宽 要设置列宽用:->setWidth($cell, $width) // Set width for a single column $sheet->setWidth('A', 5); // Set width for multiple cells $sheet->setWidth(array( 'A' => 5, 'B' => 10 )); 设置行高 设置行高:->setHeight($row, $height) // Set height for a single row $sheet->setHeight(1, 50); // Set height for multiple rows $sheet->setHeight(array( 1 => 50, 2 => 25 )); 设置单元格尺寸 设置单元格尺寸用:->setSize($cell, $width, $height) // Set size for a single cell $sheet->setSize('A1', 500, 50); $sheet->setSize(array( 'A1' => array( 'width' => 50 'height' => 500, ) )); 自动大小 默认情况下导出的文件被自动设置大小,要改变这种行为可以改变配置或使用setter // Set auto size for sheet $sheet->setAutoSize(true); // Disable auto size for sheet $sheet->setAutoSize(false); // Disable auto size for columns $sheet->setAutoSize(array( 'A', 'C' )); 默认配置设置在:export.php。 列合并 合并单元格 要合并单元格,用->mergeCells($range) $sheet->mergeCells('A1:E1'); 合并列和行 合并列和行用:->setMergeColumn($array) $sheet->setMergeColumn(array( 'columns' => array('A','B','C','D'), 'rows' => array( array(2,3), array(5,11), ) )); 列格式化 要告诉Excel它应该如何解释某些列,可以用->setColumnFormat($array) // Format column as percentage $sheet->setColumnFormat(array( 'C' => '0%' )); // Format a range with e.g. leading zeros $sheet->setColumnFormat(array( 'A2:K2' => '0000' )); // Set multiple column formats $sheet->setColumnFormat(array( 'B' => '0', 'D' => '0.00', 'F' => '@', 'F' => 'yyyy-mm-dd', )); 自己去参考指南看可用于列格式化的列表。 设用PHPExcel的本地方法 可以在$excel 和 $sheet对象调用所有PHPExcel的本地方法。 调用工作薄方法 例子: // 获得工作薄默认风格 $excel->getDefaultStyle(); 调用工作表方法 例子: // 保护单元格 $sheet->protectCells('A1', $password);