2017-05-23 118 views
0

我正在使用PHP_XLSXWriter代码来生成XLSX文件。该文件正在生成罚款,并在Excel中打开罚款,但我用这个文件上传到DHL服务器生成送货单。问题是,他们的服务抱怨无效的行。该行中的数据实际上非常好,Excel可以像我之前提到的那样读取它。但是,作为测试,我所做的是将PHP生成的电子表格保存为单独的文件,从而使Microsoft Excel保存为自己的格式。当我将微软工作表上传到DHL服务器时,它接受了它,没有任何问题。PHP XLSXWriter - 不同格式化

经过对两者进行十六进制比较后,它们完全不同,这使我相信PHP生成的XLSX文件使用的是DHL尚未使用的OpenOffice或LibreOffice格式。

有没有什么办法来解决这个问题? 我有一个想法,就是抛开PHP XLSXWriter的功能,并将数据保存为带有制表符分隔数据的原始文本文件(DHL也接受)。

这里是在我的代码的主要功能的一个简单的例子:

$filename = "test.xlsx"; header('Access-Control-Allow-Origin: mysite.com'); header('Content-disposition: attachment; filename="'.XLSXWriter::sanitize_filename($filename).'"'); header("Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); header('Content-Transfer-Encoding: binary'); header('Cache-Control: must-revalidate'); header('Pragma: public');

$rows = array(
     array('Pick-up Account Number', 'Sales Channel', 'Shipment Order ID', 'Tracking Number', 'Shipping Service Code', 'Company',      'Consignee Name',            'Address Line 1',    'Address Line 2',    'Address Line 3',    'City',     'State',      'Postal Code',     'Destination Country Code',  'Phone Number',   'Email Address',  'Shipment Weight (g)', 'Length (cm)', 'Width (cm)', 'Height (cm)', 'Currency Code', 'Total Declared Value',  'Incoterm', 'Freight', 'Is Insured', 'Insurance', 'Is COD', 'Cash on Delivery Value', 'Recipient ID', 'Recipient ID Type', 'Duties', 'Taxes', 'Workshare Indicator', 'Shipment Description', 'Shipment Import Description', 'Shipment Export Description', 'Shipment Content Indicator', 'Content Description', 'Content Import Description', 'Content Export Description', 'Content Unit Price', 'Content Origin Country', 'Content Quantity', 'Content Weight (g)', 'Content Code', 'HS Code', 'Content Indicator', 'Remarks', 'Shipper Company', 'Shipper Name', 'Shipper Address1', 'Shipper Address2', 'Shipper Address3', 'Shipper City', 'Shipper State', 'Shipper Postal Code', 'Shipper CountryCode', 'Shipper Phone Number', 'Shipper Email address', 'Return Company', 'Return Name', 'Return Address Line 1', 'Return Address Line 2', 'Return Address Line 3', 'Return City', 'Return State', 'Return Postal Code', 'Return Destination Country Code', 'Return Phone Number', 'Return Email Address', 'Service1', 'Service2', 'Service3', 'Service4', 'Service5', 'Grouping Reference1', 'Grouping Reference2', 'Customer Reference 1', 'Customer Reference 2',),    
     array('123456789',    '',     $order_id,    '',     'PPS',      $order->shipping_company,  $order->shipping_first_name.' '.$order->shipping_last_name,  $order->shipping_address_1,  $order->shipping_address_2,  $order->shipping_address_3,  $order->shipping_city, $order->shipping_state,   $order->shipping_postcode,  $order->shipping_country,  $order->billing_phone, $order->billing_email, '160',     '18',   '13',   '6',   'AUD',    '70',      '',   '',   '',    '',    '',   '',       '',    '',      '',   '',   '',      'Printer Cartridge', '',        '',        '',        'Printer Cartridge', '',        '',        '70',     'AU',      '1',    '',      'TEST_2214', '',   '',      '',   '',     '',    '',     '',     '',     '',    '',     '',      '',      '',      '',       '',     '',    '',       '',       '',       '',    '',    '',      '',         '',      '',      '',   '',   '',   '',   '',   '',      '',      '',      '',),    
    ); 

    $writer = new XLSXWriter(); 
    $writer->setAuthor('TEST'); 

    foreach($rows as $row) 
    $writer->writeSheetRow('Sheet1', $row); 
    $writer->writeToStdOut();` 

作为一个说明,该DHL服务器似乎抱怨含有“PPS”的行中的数据。

谢谢。

回答

0

通过写标签解决分隔文件:

header("Content-type: text/csv"); 
    header("Content-Disposition: attachment; filename=example.txt"); 
    header("Pragma: no-cache"); 
    header("Expires: 0"); 

    $rows = array(
    array('Pick-up Account Number', 'Sales Channel', 'Shipment Order ID', 'Tracking Number', 'Shipping Service Code', 'Company',      'Consignee Name',            'Address Line 1',    'Address Line 2',    'Address Line 3',    'City',     'State',      'Postal Code',     'Destination Country Code',  'Phone Number',   'Email Address',  'Shipment Weight (g)', 'Length (cm)', 'Width (cm)', 'Height (cm)', 'Currency Code', 'Total Declared Value',  'Incoterm', 'Freight', 'Is Insured', 'Insurance', 'Is COD', 'Cash on Delivery Value', 'Recipient ID', 'Recipient ID Type', 'Duties', 'Taxes', 'Workshare Indicator', 'Shipment Description', 'Shipment Import Description', 'Shipment Export Description', 'Shipment Content Indicator', 'Content Description', 'Content Import Description', 'Content Export Description', 'Content Unit Price', 'Content Origin Country', 'Content Quantity', 'Content Weight (g)', 'Content Code', 'HS Code', 'Content Indicator', 'Remarks', 'Shipper Company', 'Shipper Name', 'Shipper Address1', 'Shipper Address2', 'Shipper Address3', 'Shipper City', 'Shipper State', 'Shipper Postal Code', 'Shipper CountryCode', 'Shipper Phone Number', 'Shipper Email address', 'Return Company', 'Return Name', 'Return Address Line 1', 'Return Address Line 2', 'Return Address Line 3', 'Return City', 'Return State', 'Return Postal Code', 'Return Destination Country Code', 'Return Phone Number', 'Return Email Address', 'Service1', 'Service2', 'Service3', 'Service4', 'Service5', 'Grouping Reference1', 'Grouping Reference2', 'Customer Reference 1', 'Customer Reference 2',),    
    array('123456789',    '',     $order_id,    '',     'PPS',      $order->shipping_company,  $order->shipping_first_name.' '.$order->shipping_last_name,  $order->shipping_address_1,  $order->shipping_address_2,  $order->shipping_address_3,  $order->shipping_city, $order->shipping_state,   $order->shipping_postcode,  $order->shipping_country,  $order->billing_phone, $order->billing_email, '160',     '18',   '13',   '6',   'AUD',    '70',      '',   '',   '',    '',    '',   '',       '',    '',      '',   '',   '',      'Printer Cartridge', '',        '',        '',        'Printer Cartridge', '',        '',        '70',     'AU',      '1',    '',      'TEST_2214', '',   '',      '',   '',     '',    '',     '',     '',     '',    '',     '',      '',      '',      '',       '',     '',    '',       '',       '',       '',    '',    '',      '',         '',      '',      '',   '',   '',   '',   '',   '',      '',      '',      '',),    
); 

    foreach ($rows as $arr) 
    { 
     $row = implode("\t", $arr); 
     $row.="\n"; 
     echo $row; 
    } 

这生成了正确的数据和DHL接受它。谢谢。