Cách đọc dữ liệu có định dạng từ tệp Word bằng PHP

Trong khi làm việc với các dự án bằng PHP thì việc đọc dữ liệu có định dạng từ tệp Word bằng ngôn ngữ lập trình PHP là rất cần thiết. Sau đây VniTeach sẽ hướng dẫn cách đọc dữ liệu có định dạng từ tệp Word (phần mở rộng .docx) một cách chính xác và nhanh nhất.

Để lưu cả định dạng của các câu hỏi, ta có thể sử dụng phương thức saveHTML() của đối tượng DOMDocument để lưu lại định dạng HTML của từng thẻ <p>. Dưới đây là cách sửa đổi để lưu cả định dạng của câu hỏi:

<?php
require 'vendor/autoload.php';

use PhpOffice\PhpWord\IOFactory;

// Đường dẫn đến tệp Word
$inputFile = 'file.docx';

// Tạo một đối tượng IOFactory để đọc tệp Word
$phpWord = IOFactory::load($inputFile);

// Chuyển đổi tài liệu Word thành HTML
$htmlWriter = IOFactory::createWriter($phpWord, 'HTML');
$htmlFile = 'file.html';
$htmlWriter->save($htmlFile);

// Mảng để lưu trữ các câu hỏi và đáp án cùng với định dạng
$questions = array();
$currentQuestion = '';

// Đọc nội dung từ tệp HTML
$htmlContent = file_get_contents($htmlFile);

// Tạo một đối tượng DOMDocument để phân tích HTML
$dom = new DOMDocument();
$dom->loadHTML($htmlContent);

// Lặp qua tất cả các thẻ <p>
foreach ($dom->getElementsByTagName('p') as $paragraph) {
    // Nội dung của thẻ <p> kèm theo định dạng
    $paragraphWithFormat = $dom->saveHTML($paragraph);

    // Kiểm tra nếu dòng bắt đầu bằng "A.", "B.", "C.", "D.", "Câu <số>" hoặc "Question <số>"
    if (preg_match('/^(A\.|B\.|C\.|D\.|Câu\s+\d+\.|Question\s+\d+\.)/', $paragraph->nodeValue)) {
        if (!empty($currentQuestion)) {
            // Lưu câu hỏi hiện tại vào mảng
            $questions[] = $currentQuestion;
            $currentQuestion = ''; // Reset nội dung câu hỏi
        }
    }

    // Thêm dòng vào nội dung câu hỏi hiện tại
    $currentQuestion .= $paragraphWithFormat . "\n";
}

// Kiểm tra và lưu câu hỏi cuối cùng (nếu có)
if (!empty($currentQuestion)) {
    $questions[] = $currentQuestion;
}

// Hiển thị kết quả
print_r($questions);
?>

Như vậy chúng ta đã lấy dữ liệu có định dạng của các thẻ <p> và lưu vào mảng một chiều $questions. Để chuyển về dữ liệu mảng 2 chiều cho dễ xử lý thì bạn làm như sau:

//Chuyển mỗi 5 phần tử của mảng 1 chiều thành 1 phần tử của mảng 2 chiều
$arr = array_chunk($questions, 5);
// Hiển thị kết quả
print_r($arr);

Chúc bạn thành công!

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *