8

これは私が今使っているものです。

$mimeType = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';
header('Content-Description: File Transfer');
header('Content-Type: ' . $mimeType);
header('Content-Disposition: attachment; filename='.basename($type.'.xlsx'));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');   
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
print "$header\n$data";
exit;

$header変数には、生成されるExcelのヘッダー行が含まれており、次のようになります

$header= "Business_Name\tBusiness_Type\tType";

で区切られた\t

$dataヘッダー列の下に生成される行が含まれています。それらは で区切られ\t、行は で終了し\nます。

現在のセットアップ ファイルはダウンロードされますが、ms Excel で開かず、このメッセージが表示されません。

ファイル形式またはファイル拡張子が無効なため、Excel はファイル "ファイル名" を開くことができません。ファイル形式が破損していないこと、およびファイル拡張子がファイルの形式と一致していることを確認してください。

サーバーに送信するヘッダーは何ですか? または、そのファイルをどのように生成しますか?

4

3 に答える 3

20

私はこれを手っ取り早く、安っぽい方法で実現します。長くて曲がりくねっているので、コードではなく概念で説明します。

XLSX は ISO 29500 に準拠しており、php でドキュメントを完全に操作したい場合に公開されています。それ以外の場合、xlsx ファイルは一連の xml ファイルの zip アーカイブであることに注意してください。

必要なテンプレートを作成します。たとえば、さまざまなタイプのスタイルを持つ交互の行があり、それを Excel または何らかの説明の開いている xml エディターで作成します。そこにいくつかのデータを入れて、いくつかのフィールドが等しいことを確認してください (学習目的のためだけに)。

次に、ファイルを xlsx として保存し、名前を .zip に変更するか、アーカイブ エクストラクターでファイルを開いて内容を観察します。

まず、[Content_Types].xml ファイルに注意してください。これは、アーカイブ内の主要なファイルの場所と、それ自体が準拠している標準、およびそれらのファイルのコンテンツ タイプを記述しています。

フォルダの外にあるものはすべて、xl/実際には単なるメタ データです。しかし、observedocProps/core.xmlには作成者、変更、およびタイムスタンプ情報が含まれています。これらは、このファイルを再作成するときに php で置き換えることができます。また、指摘されていることはすべてdocProps/core.xml、好みに合わせて名前を変更できますが、[Content_Types].xmlできません。

さて、あなたはこれを理解したので、場所の周りに投げられたIDを観察し始めます. 彼らはこれをファイル形式で使用するのが大好きで、すべてが特定の xml プロパティ リストなどのインデックスによって他のすべてを参照します。また、通常、そのようなリスト内のアイテムの数量についても説明します。

xl/表示されますthemes.xml, styles.xml, workbook.xml, sharedStrings.xml, _rels/, worksheets/

Styles は、デフォルトで Excel ビルドを使用すると、不要なスタイルが大量に膨らみます。ただし、独自のスタイルをカスタマイズできるように、これらのスタイルがどのように機能するかを確認できるはずです。

私にとってテーマはかなり無意味なので、それとその参照されたIDを全体的に削除します。

次に、ワークブックが表示されます。これは、明らかに複数のシートを持つことができるため、スプレッドシート ドキュメント内にあるシートに関する情報を含むファイルです。また、サイズなどのシート メタデータも含まれています。

最初に出会う大華です。sharedStrings.xml静的スプレッドシートのセルに挿入されるすべての情報を保存する奇妙なファイルです。それらは索引付けされていますが、ドキュメントを読み取るエンジンはそれらの索引が何であるかを把握します。繰り返されるものはすべて、シート自体 (ワークシート フォルダー内) の古いインデックスを参照して、値が繰り返される大きなドキュメントのファイル サイズを節約できます。属性countuniquecountはなく、sst要素内およびそれらが明らかに意味するもの。

これは、シートに必要なものを含むデータの配列を入力し、このファイルのような xml 形式のリストにダンプする php の段階です。また、これらのファイルは改行や改行文字なしで詰まる必要がないことに注意してください。xml の有無にかかわらず有効であり、関係なくリーダーで機能します。

_rels フォルダーを確認してください。これも明らかです。

最後はシートそのものです。ここのフィールドの数字は、 内の文字列のインデックス付きの場所を参照していますsharedStrings.xml。属性 s はスタイル、t はフィールド内のデータのタイプです。R はセルの場所ですが、なぜそれが必要なのかは、実際にはかなり簡単に理解できるのに、私にはわかりません。

このファイルを php で作成することもそれほど難しくありません。ファイルの作成に使用したデータ配列のインデックスを使用するだけsharedStrings.xmlです。

また、シートには列幅情報が含まれており、使用したフォントに基づいて把握し、必要に応じて PHP で自動的にサイズを変更できます。

最後に、すべてを php でパッケージ化します。

私のコードは、単純にするためにExcelで作成したデータと特定の保存ファイルを受け取るクラスにあります。

$this->folder_structure_simple = Array(
    "_rels/.rels" => "_rels__rels",
    "docProps/app.xml" => "docProps_app_xml",
    "docProps/core.xml" => "docProps_core_xml",
    "xl/_rels/workbook.xml.rels",
        "xl/theme/theme1.xml",
        "xl/worksheets/sheet1.xml",
        "xl/sharedStrings.xml",
        "xl/styles.xml",
        "xl/workbook.xml",
    "[Content_Types].xml" => "Content_Types_xml"
);

$zip = new ZipArchive;
$res = $zip->open($this->file_name, ZipArchive::CREATE);
if($res === TRUE){
    foreach($this->folder_structure_simple as $file => $function){
            $zip->addFromString($file, $this->$funtion);
    }
    $zip->close();
    echo 'ok';
}else{
    return FALSE;
}

関数は必要なデータを生成します。非常に高速ですが、あまり柔軟ではありません。

于 2013-09-16T04:26:12.687 に答える
3

XLSXファイルではなく、CSVを持っているもの。XLSX は、ZIP ラップされた XML のブロブです。MIME タイプを text/csv に変更します。

于 2011-05-19T07:52:40.023 に答える