:::

9. 產生word檔、壓縮及解壓

一、 產生docx檔

  1. PHPWord同屬PHPOffice的系列,官網:https://github.com/PHPOffice/PHPWord
  2. PHPWord 0.14手冊:http://phpword.readthedocs.io/en/latest/
  3. PHPWord 0.13手冊:http://karbone-intranet.readthedocs.io/en/latest/
  4. 需要的環境如下:PHP 5.3.3 以上、ZipArchive、xmllib等PHP函式庫
  5. 若是您的MS Office是2007以下,那麼可能需要Microsoft Office Compatibility Pack(https://www.microsoft.com/zh-TW/download/details.aspx?id=27836)才能開啟之。PHPWord無法產生2003的doc檔(因為非公開格式)。
  6. 建立一個word檔的基本結構如下:
    require_once XOOPS_ROOT_PATH . '/modules/tadtools/vendor/autoload.php';
    $phpWord = new \PhpOffice\PhpWord\PhpWord();
    $filename  = iconv("UTF-8", "Big5", $filename);
    $objWriter = \PhpOffice\PhpWord\IOFactory::createWriter($phpWord, 'Word2007');
    header('Content-Type: application/vnd.ms-word');
    header("Content-Disposition: attachment;filename={$filename}.docx");
    header('Cache-Control: max-age=0');
    $objWriter->save('php://output');
  7. 亦可輸出成開放格式odt檔
    $objWriter = \PhpOffice\PhpWord\IOFactory::createWriter($phpWord, 'ODText');
    header('Content-Type: application/vnd.oasis.opendocument.text');
    header("Content-Disposition: attachment;filename={$filename}.odt");
  8. 一些預設及建立頁面、設定頁面邊界功能
    $phpWord->setDefaultFontName('標楷體'); //設定預設字型
    $phpWord->setDefaultFontSize(9); //設定預設字型大小
  9. 設定頁面邊界功能並新增編輯區域
    $sectionStyle = array(
        'orientation'        => 'portrait', //landscape(橫);portrait(直)
        'marginTop'          => 1133.858268, //上邊界 2cm*566.929134
        'colsNum'            => 2, //幾欄
        'pageNumberingStart' => 1, //第幾頁
        'borderTopSize'      => 2, //上邊框
        'borderTopColor'     => '0000FF', //上邊框顏色
        'lineNumbering'      => array('start' => 1, 'increment' => 1), //行號設定
    );
    $section = $phpWord->addSection($sectionStyle); //建立一個區域
    • (1) 樣式參數可參考:http://karbone-intranet.readthedocs.io/en/latest/styles.html
    • (2) 其中有方向性的分別還有Top、Bottom、Left、Right,自行新增或修改即可。
    • (3) 若有用到長度,其單位為twip,1 cm = 566.929134 twip,1 twip = 0.001764 cm,亦可用底下方式將公分轉換為twip
      \PhpOffice\PhpWord\Shared\Converter::cmToTwip(2.5)

二、 phpword的各種元件

  1. 可用元件可參考:http://karbone-intranet.readthedocs.io/en/latest/elements.html
  2. 新增文字及相關文字設定,可用設定詳細請看
    $fontStyle      = array('color' => '000000', 'size' => 10, 'bold' => false);
    $paragraphStyle = array('align' => 'both', 'valign' => 'center');
    $section->addText($title, $fontStyle, $paragraphStyle);
    $textrun = $section->addTextRun($paragraphStyle);
    • (1) addTextRun()用來將同一段落中的文字,分別套用不同文字設定,為物件。
  3. 新增標題($depth 是指標題N)
    $phpWord->addTitleStyle( $depth, $fontStyle, $paragraphStyle); //設定標題N樣式
    $section->addTitle( '標題文字', $depth ); //新增標題
  4. 換行及換頁
    $section->addTextBreak(2, $fontStyle, $paragraphStyle); //換行,可指定換幾行
    $section->addPageBreak();  //換頁
  5. 插入連結和圖片,$style 可用設定:widthheightalign,單位為px
    $section->addLink( $linkSrc, $linkName, $fontStyle, $paragraphStyle); //加入連結
    $section->addImage( $src, $style ); //插入圖片
  6. 若要將HTML轉為word檔,圖檔部份會用到的函數:
    //從網頁語法中抓出圖片連結的函數
    function linkExtractor($html){
        $linkArray = array();
        if (preg_match_all('/<img\s+.*?src=[\"\']?([^\"\' >]*)[\"\']?[^>]*>/i', $html, $matches, PREG_SET_ORDER)) {
            foreach ($matches as $match) {
                array_push($linkArray, $match[1]);
            }
        }
        return $linkArray;
    }
    //將網頁語法中的圖片語法取代為自訂文字,
    function replace_images($html){
        $html = preg_replace('/<img\s+.*?src=[\"\']?([^\"\' >]*)[\"\']?[^>]*>/i', '圖片', $html);
        return $html;
    }
  7. 插入有序或無序清單, 設定有序(TYPE_NUMBER)或無序(TYPE_BULLET_FILLED)清單,$depth為階層,從0開始。
    $listStyle = array('listType' => PHPWord_Style_ListItem::TYPE_NUMBER);
    $section->addListItem( $text, $depth, $fontStyle, $listStyle, $paragraphStyle );

三、 表格

  1. 建立表格
    $tableStyle = array('borderColor' => '000000', 'borderSize' => 6, 'cellMargin' => 80);
    $table      = $section->addTable($tableStyle);
  2. 建立一個橫列
    $rowStyle   = array('cantSplit' => true, 'tblHeader' => true);
    $table->addRow(10, $rowStyle);
  3. 建立儲存格
    $cellStyle      = array('bgColor' => 'CFCFCF');
    $fontStyle      = array('size' => 12, 'bold' => true);
    $paragraphStyle = array('alignment' => \PhpOffice\PhpWord\SimpleType\Jc::CENTER);
    $table->addCell(2000, $cellStyle)->addText('分類', $fontStyle, $paragraphStyle);
  4. 合併儲存格(套用不同儲存格樣式即可達成)
    $cellRowSpan  = array('vMerge' => 'restart'); //垂直合併
    $cellContinue = array('vMerge' => 'continue'); //略過
    $cellColSpan  = array('gridSpan' => 2); //水平合併

四、 頁首頁尾

  1. 加入頁首或頁尾
    //$header         = $section->addHeader(); //頁首
    $footer         = $section->addFooter(); //頁尾
    $footer->addPreserveText('{PAGE} / {NUMPAGES}', $fontStyle, $paragraphStyle);

五、 用pclzip壓縮及解壓縮

  1. 官網:http://www.phpconcept.net/pclzip
  2. 請下載解壓後,將pclzip.lib.php複製到class目錄下
  3. 將多個目錄壓縮(亦可單一目錄)
    <?php
    include_once "header.php";
    include_once 'class/pclzip.lib.php';
    $bak_dir      = array(XOOPS_ROOT_PATH . "/uploads/snews/image", XOOPS_ROOT_PATH . "/uploads/snews/file");
    $remove_path  = XOOPS_ROOT_PATH . "/uploads/";
    $bak_file     = XOOPS_ROOT_PATH . "/uploads/bak_" . date("YmdHi") . ".zip";
    $bak_file_url = XOOPS_URL . "/uploads/bak_" . date("YmdHi") . ".zip";
    $zipfile      = new PclZip($bak_file);
    $zip_list     = $zipfile->create($bak_dir, PCLZIP_OPT_REMOVE_PATH, $remove_path);
    if ($zip_list == 0) {
        die("Error : " . $zipfile->errorInfo(true));
    } else {
        header("location: {$bak_file_url}");
        exit;
    }
    • (1) 需要修改的部份僅有$bak_dir(可用字串或陣列),亦即需要加入壓縮檔的目錄或檔案
    • (2) $remove_path意思是去掉壓縮檔中的路徑,避免解壓縮後會有好幾層目錄
    • (3) $bak_file是壓縮檔要存放的主機實體位置
    • (4) $bak_file_url是壓縮檔的下載網址,壓縮完可以直接下載。
  4. 將上傳的zip檔解壓縮(上傳表單的name='zipfile'
    $extract_path = XOOPS_ROOT_PATH . "/uploads/";
    $decompress   = new PclZip($_FILES['zipfile']['tmp_name']);
    $decompress->extract($extract_path);
    • (1) 一樣要先引入pclzip.lib.php 物件檔
    • (2) 直接從表單上傳的暫存檔案($_FILES['zipfile']['tmp_name'])解壓縮
    • (3) $extract_path是設定要解壓縮的實體路徑

六、下載最後的模組完整包


:::

搜尋

QR Code 區塊

https%3A%2F%2Ftad0616.net%2Fmodules%2Ftad_book3%2Fpage.php%3Ftbdsn%3D1498

書籍目錄

展開 | 闔起

線上使用者

35人線上 (4人在瀏覽線上書籍)

會員: 0

訪客: 35

更多…