drupal 生成excel的两种方法

1.利用xml dom 对象,将数据写入一个xml文件,然后利用这个xml文件来生成excel,这样文件读写只需要执行一次,因此效率较高。

/**
 * @param $file
 * @param $header excel,或者说是table的表头
 * @param $rows excel中的数据
 * @return string 
 */
function create_xml($file, $header, $rows) {
    $dom = new DOMDocument('1.0', 'utf-8');
    $path = file_directory_path() . "/" . $file . ".xml";
    $workbook = $dom->createElement('Workbook');
    $workbook->setAttribute('xmlns', 'urn:schemas-microsoft-com:office:spreadsheet');
    $workbook->setAttribute('xmlns:o', 'urn:schemas-microsoft-com:office:office');
    $workbook->setAttribute('xmlns:x', 'urn:schemas-microsoft-com:office:excel');
    $workbook->setAttribute('xmlns:ss', 'urn:schemas-microsoft-com:office:spreadsheet');
    $workbook->setAttribute('xmlns:html', 'http://www.w3.org/TR/REC-html40');
    $dom->appendChild($workbook);
    $documentproperties = $dom->createElement('DocumentProperties');
    $documentproperties->setAttribute('xmlns', 'urn:schemas-microsoft-com:office:office');
    $workbook->appendChild($documentproperties);
    create_text_node($dom, $documentproperties, 'Author', 'xxx');
    create_text_node($dom, $documentproperties, 'LastAuthor', 'xxx');
    create_text_node($dom, $documentproperties, 'Created', date('Y-m-d H:i:s', time()));
    create_text_node($dom, $documentproperties, 'Company', 'xxx');
    create_text_node($dom, $documentproperties, 'Version', '14.0');
    $OfficeDocumentSettings = $dom->createElement('OfficeDocumentSettings');
    $OfficeDocumentSettings->setAttribute('xmlns', 'urn:schemas-microsoft-com:office:office');
    $workbook->appendChild($OfficeDocumentSettings);
    $AllowPNG = $dom->createElement('AllowPNG');
    $OfficeDocumentSettings->appendChild($AllowPNG);
    $ExcelWorkbook = $dom->createElement('ExcelWorkbook');
    $ExcelWorkbook->setAttribute('xmlns', 'urn:schemas-microsoft-com:office:excel');
    $workbook->appendChild($ExcelWorkbook);
    create_text_node($dom, $ExcelWorkbook, 'WindowHeight', '12900');
    create_text_node($dom, $ExcelWorkbook, 'WindowWidth', '25600');
    create_text_node($dom, $ExcelWorkbook, 'WindowTopX', '0');
    create_text_node($dom, $ExcelWorkbook, 'WindowTopY', '0');
    create_text_node($dom, $ExcelWorkbook, 'ProtectStructure', 'False');
    create_text_node($dom, $ExcelWorkbook, 'ProtectWindows', 'False');
    $Styles = $dom->createElement('Styles');
    $workbook->appendChild($Styles);
    $Style = $dom->createElement('Style');
    $Style->setAttribute('ss:ID', 'Default');
    $Style->setAttribute('ss:Name', 'Normal');
    $Styles->appendChild($Style);
    $Alignment = $dom->createElement('Alignment');
    $Alignment->setAttribute('ss:Vertical', 'Bottom');
    $Style->appendChild($Alignment);
    $Borders = $dom->createElement('Borders');
    $Style->appendChild($Borders);
    $Font = $dom->createElement('Font');
    $Font->setAttribute('ss:FontName', '宋体');
    $Font->setAttribute('x:CharSet', '134');
    $Font->setAttribute('x:Family', 'Swiss');
    $Font->setAttribute('ss:Size', '12');
    $Font->setAttribute('ss:Color', '#000000');
    $Style->appendChild($Font);
    $Interior = $dom->createElement('Interior');
    $Style->appendChild($Interior);
    $NumberFormat = $dom->createElement('NumberFormat');
    $Style->appendChild($NumberFormat);
    $Protection = $dom->createElement('Protection');
    $Style->appendChild($Protection);
    $Worksheet = $dom->createElement('Worksheet');
    $Worksheet->setAttribute('ss:Name', 'sheet1');
    $workbook->appendChild($Worksheet);
    $Table = $dom->createElement('Table');
    $Worksheet->appendChild($Table);
    $Row = $dom->createElement('Row');
    $Table->appendChild($Row);

    //make header 
    if (is_array($header) && !empty($header)) {
        foreach ($header as $h) {
            $Cell = $dom->createElement('Cell');
            $Row->appendChild($Cell);
            create_text_node($dom, $Cell, 'Data', $h, array("ss:Type" => "String"));
        }
    }
    if (is_array($rows) && !empty($rows)) {
        foreach ($rows as $row) {
            $Row = $dom->createElement('Row');
            $Table->appendChild($Row);
            if (is_array($row) && !empty($row)) {
                foreach ($row as $val) {
                    $Cell = $dom->createElement('Cell');
                    $Row->appendChild($Cell);
                    if (is_array($val)) {
                        $text_val = $val['value'];
                        $text_type = $val['type'];
                    } else {
                        $text_val = $val;
                        $text_type = 'String';
                    }
                    create_text_node($dom, $Cell, 'Data', $text_val, array("ss:Type" => $text_type));
                }
            }
        }
    }

    $WorksheetOptions = $dom->createElement('WorksheetOptions');
    $WorksheetOptions->setAttribute("xmlns", "urn:schemas-microsoft-com:office:excel");
    $Worksheet->appendChild($WorksheetOptions);


    $output = $dom->saveXML();
    //$dom->save($path);
    return $output;
}

function create_text_node(&$dom, &$parent, $node, $value, $attr = array()) {
    $node = $dom->createElement($node);
    if (is_array($attr) && !empty($attr)) {
        foreach ($attr as $k => $v) {
            $node->setAttribute($k, $v);
        }
    }
    $node_value = $dom->createTextNode($value);
    $node->appendChild($node_value);
    $parent->appendChild($node);
}

2.利用php的读写文件的方法,相当于每一行的数据都需要执行打开写入的操作,因此效率会降低。

<?php
/**
 *excel导出类
 */
class excel_exporter {
    function add_row(&$file_handle, $data) {
    	if (!empty($data)) {
        foreach ($data as $key => $value) {
            $data[$key] = '"'. str_replace('"', '""', str_replace("n", ' ', $value)) .'"';
        }
    	}
        $row = implode("t", $data) . "n";
        if (function_exists('mb_convert_encoding')) {
            $row = mb_convert_encoding($row, 'UTF-16LE', 'UTF-8');
        }
        @fwrite($file_handle, $row);
    }

    function set_headers($filename) {
        drupal_set_header("Content-Type: application/force-download");
        drupal_set_header("Content-Type: application/x-msexcel");
        drupal_set_header("Content-Disposition: attachment; filename=$filename.xls");
    }

    function bof(&$file_handle) {
        $output = '';
        if (function_exists('mb_convert_encoding')) {
            $output = chr(255) . chr(254);
        }
        @fwrite($file_handle, $output);
    }

    function eof(&$file_handle) {
    }
}

/**
 * @param $header excel,table头
 * @param $rows excel数据
 */
function excel_download($header,$rows){
  $exporter = new excel_exporter();
  $file_name = tempnam(variable_get('file_directory_temp', file_directory_temp()), time());
  $handle = @fopen($file_name, 'w');
  $exporter->bof($handle);

  $exporter->add_row($handle, $header);
  foreach ($rows as $value) {
    $exporter->add_row($handle, $value);
  }

  // Add the closing bytes.
  $exporter->eof($handle);
  // Close the file.
  @fclose($handle);
  $export_name = t('Download_excel') . '_' . date('Ymd');
  $exporter->set_headers($export_name);
  @readfile($file_name); // The @ makes it silent.
  @unlink($file_name); // Clean up, the @ makes it silent.
}
?>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值