Я использую PHP_XLSXWriter код для создания файла XLSX. Файл генерируется нормально, и он прекрасно открывается в Excel, но я использую этот файл для загрузки на сервер DHL для генерации заказов на доставку. Проблема в том, что их служба жалуется на неверный ряд. Данные в этой строке на самом деле прекрасно, и Excel может прочитать их, как я уже говорил. Однако в качестве теста я сохранил электронную таблицу, сгенерированную на PHP, в виде отдельного файла, что позволило сохранить Microsoft Excel в своем собственном формате. Когда я загрузил лист Microsoft на сервер DHL, он принял его без каких-либо проблем.
После шестнадцатеричного сравнения двух, они были совершенно разными, что заставило меня поверить, что сгенерированный PHP файл XLSX использует формат OpenOffice или LibreOffice, который DHL не использовал.
Есть ли способ исправить эту проблему?
У меня есть одна идея — просто отказаться от функциональности 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».
Благодарю.
Решается написанием файла с разделителями табуляции:
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 принимает их. Благодарю.
Других решений пока нет …