Проблема с загрузкой данных в Excel с помощью функции PHP "pack" - PullRequest
2 голосов
/ 12 августа 2011

У меня есть приложение PHP, которое загружает данные таблиц MySQL в электронную таблицу на клиентском компьютере.Я нашел код во многих местах в Интернете, который отлично работает для Open Office Scalc на машине с Redhat.Проблема, с которой я столкнулся, заключалась в том, что я пытался загрузить в MS Excel на ПК с Windows, а не в электронную таблицу Open Office.Проблема, кажется, связана с длиной строки, вставленной в ячейку.Если он слишком длинный, Excel считает, что файл поврежден и не загружает его.«Слишком длинный», кажется, составляет около 255 символов, хотя спецификации MS Excel говорят, что максимальная длина - 32 000.

Для дальнейшего изучения проблемы я попытался загрузить те же данные, что и файл значений, разделенных табуляцией, и позволить Excel преобразовать их в электронную таблицу.Используя этот метод, не было проблем с загрузкой очень длинных строк в ячейки электронной таблицы.Таким образом, строки, длина которых превышает 255 символов, фактически могут быть вставлены в ячейки Excel, но только с кодом, который я использую, даже если этот код работает с Open Office.Использование файлов tsv не решило бы нашу проблему, потому что длинные строки имеют возврат каретки, который мы хотим сохранить, и возврат каретки интерпретируются как разделители строк, когда файл tsv загружается в электронную таблицу.

Функция PHP, котораязаписывает строку в ячейку электронной таблицы:

 function xlsWriteLabel($Row, $Col, $Value ) {
     $L = strlen($Value);
     echo pack("ssssss", 0x204, 8 + $L, $Row, $Col, 0x0, $L);
     echo $Value;
     return;
 }

Другой необходимый код для переноса в электронные таблицы в дополнение к указанной выше функции можно найти по адресу:

http://www.appservnetwork.com/modules.php?name=News&file=article&sid=8

Я не нашел никаких объяснений значения различных аргументов, передаваемых функции «pack» в приведенном выше коде, и мне интересно, может ли изменение одного из аргументов в функции выше решить проблему.

Итак, если у кого-то есть решение этой проблемы, мне было бы интересно услышать его.

Ответы [ 3 ]

1 голос
/ 06 января 2012

... если в вашем тексте нет двойных кавычек.

Вам следует использовать правильные разделители из набора символов ASCII.

Seq    Dec    Hex    Acro   Name
^\     28     1C     FS     File Separator      
^]     29     1D     GS     Group separator     
^^     30     1E     RS     Record Separator    
^_     31     1F     US     Unit separator  

Я не знаю php, но в perl оператор print может выглядеть так:


    print chr(30), "Field1", chr(30), "Field2", chr(30), "Field3", chr(31);

1 голос
/ 27 сентября 2012

Я написал простой подход для генерации абсолютного файла Excel.

Простая функция.

Сначала вы конвертируете свое содержимое в массив (это очень просто и все знают).Затем передайте массив моей функции, приведенной ниже.

<?php
//array to excel
function arrayToExcel($array, $filename='List') 
{
    if (!is_array($array) or !is_array($array[0])) return false;

    $xl = pack("ssssss", 0x809, 0x8, 0x0, 0x10, 0x0, 0x0); //begining of excel file 

    $i = 0;
    foreach ($array as $key => $val)
        {
            $j=0;
            foreach ($val as $cell_key => $cell_val)
                {
                    $cell_val = trim($cell_val);
                    $length = strlen($cell_val);
                        //checking cell value is a number and the length not equal to zero
                            if(preg_match('/^[0-9]*(\.[0-9]+)?$/', $cell_val) && $length!=0) {
                                $xl .= pack("sssss", 0x203, 14, $i, $j, 0x0); //writing number column
                                $xl .= pack("d", $cell_val);
                            }
                            else {
                                $xl .= pack("ssssss", 0x204, 8 + $length, $i, $j, 0x0, $length); //writing string column
                                $xl .= $cell_val;
                            }
                    $j++;
                } //end of 2nd foreach
            $i++;
        } //end of first foreach
    $xl .= pack("ss", 0x0A, 0x00);  //end of excel file
    $filename = $filename.".xls";
    header("Pragma: public");
    header('Content-Type: application/vnd.ms-excel');
    header("Content-Disposition: attachment; filename=$filename");
    header("Cache-Control: no-cache"); 
    echo $xl;
} //end of arrayToExcel function


//eg: arrayToExcel($myarray, "contact_list");
?>
0 голосов
/ 12 августа 2011

Окружите значения вашей ячейки двойными кавычками "", это позволит вам импортировать данные в формате tsv или csv, не беспокоясь о том, что возврат каретки интерпретируется как новая строка.Вы также можете использовать функцию fputcsv из PHP для экспорта файлов TSV или CSV, которые Excel может читать.

Это немного более эффективная версия их функций, спасибо, что вы также связали их, но яне знаю, правильный ли формат вывода для Excel или нет.

function xlsBOF(){
    echo pack("s6", 0x809, 0x8, 0x0, 0x10, 0x0, 0x0);
}

function xlsEOF(){
    echo pack("ss", 0x0A, 0x00);
}

function xlsWriteNumber($Row, $Col, $Value){
    echo pack("s5d", 0x203, 14, $Row, $Col, 0x0, $Value);
}

function xlsWriteLabel($Row, $Col, $Value){
    $L = strlen($Value);
    echo pack("s6A*", 0x204, 8 + $L, $Row, $Col, 0x0, $L, $Value);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...