0行代码的口才的可打印文档表格

最近,在Laravel + Eloquent的一个项目中,我需要制作可打印形式的文档-发票,Word格式的合同。由于系统中有许多不同的文档,因此我决定将其通用化,以便以后可以在其他项目中使用。



结果是实现了将集成到项目中的成本降至最低的实施。





正如我以前制作可打印表格一样。使用不同的方法



  • 将标签放置在文档模板中,并在生成期间替换它们。
  • 从头开始生成文档文本。
  • 生成html并将其转换为word。
  • 我制作了自己的系统来类似于本文所述的文档生成系统,但是使用了不同的技术。


每个选项都适合其任务。但是,如果您有Eloquent,那么我强烈建议您使用本文中介绍的选项。



所以,我们连接包装



composer require mnvx/eloquent-print-form


并描述口才的模型(如果尚未描述)。假设您有以下模型。



use Illuminate\Database\Eloquent\Model;

/**
 * @property string $number
 * @property string $start_at
 * @property Customer $customer
 * @property ContractAppendix[] $appendixes
 */
class Contract extends Model
{

    public function customer()
    {
        return $this->belongsTo(Customer::class);
    }

    public function appendixes()
    {
        return $this->hasMany(ContractAppendix::class);
    }
}

/**
 * @property string $name
 * @property CustomerCategory $category
 */
class Customer extends Model
{
    public function category()
    {
        return $this->belongsTo(CustomerCategory::class);
    }

}

/**
 * @property string $number
 * @property string $date
 * @property float $tax
 */
class ContractAppendix extends Model
{

    public function getTaxAttribute()
    {
        $tax = 0;
        foreach ($this->items as $item) {
            $tax += $item->total_amount * (1 - 100 / (100+($item->taxStatus->vat_rate ?? 0)));
        }
        return $tax;
    }
}


为了清楚起见,关系图





也就是说,描述了带有合同的表(Contract),合同可以用交易对手(Customer填充,交易对手可以填充类别。合同可以包含多个附件(ContractAppendix)。



生成可打印文件所需要做的只是描述可打印模板中的字段。创建具有此内容的docx文件





Eloquent. , , , ${customer.category.name}.



, |, ${number|placeholder}. , , ${start_at|date|placeholder}.





  • placeholder — "____",
  • date — 24.12.2020,
  • dateTime — - 24.12.2020 23:11,
  • int — 2`145,
  • decimal — 2`145.07.


. ${entities.#row_number}.



既然已经描述了文档,剩下的只是简单地开始生成可打印的



use Mnvx\EloquentPrintForm\PrintFormProcessor;

$entity = Contract::find($id);
$printFormProcessor = new PrintFormProcessor();
$templateFile = resource_path('path_to_print_forms/your_print_form.docx');
$tempFileName = $printFormProcessor->process($templateFile, $entity);


生成的文件$tempFileName将包含准备好的可打印内容。



在Laravel项目中,负责生成可打印内容的控制器方法可能如下所示



public function downloadPrintForm(FormRequest $request)
{
    $id = $request->get('id');
    $entity = Contract::find($id);
    $printFormProcessor = new PrintFormProcessor();
    $templateFile = resource_path('path_to_print_forms/your_print_form.docx');
    $tempFileName = $printFormProcessor->process($templateFile, $entity);
    $filename = 'contract_' . $id;
    return response()
        ->download($tempFileName, $filename . '.docx')
        ->deleteFileAfterSend();
}


总结一下,我会说,我在一个具有很多可打印表格的项目中制作了这个小型库,从而减轻了自己的负担。我不需要为每个代码编写自己的独特代码。我只是如上所述描述变量,并很快得到结果。如果该程序包可以帮助您节省时间,我将很高兴。



链接到github上的项目




All Articles