1

.net 4.0 組み込みクラスのみを使用して、2007 年以降の Excel ドキュメント (.xlsx) を作成しようとしています。そのため、サードパーティのライブラリは使用できません

実際、ほとんどの部分は完了しています。現在直面している唯一の問題は、作成中のパッケージが[Content_Types].xmlファイルの作成に失敗しているように見えることです。つまり、すべての<Override>要素が欠けているということです。、および<Default>要素のみが作成されます。

問題はパッケージ間の関係を作成する時点にあると確信していますが、それを機能させる方法がわからないだけで、PackageおよびZipPackageクラスのドキュメントと例は驚くほど不足しています。

多分私は別のステップを逃しています...誰かが何か手がかりを持っていますか? お願いします

これは、まったく同じ問題を引き起こす同様のコードです

public void CreatePackage()
        {
            string Dir = @"F:\Proyectos\Excel_StackOverflow\WindowsFormsApplication1\WindowsFormsApplication1\Resources";

        Uri File1_abs = new Uri(String.Format(@"{0}\1.xml", Dir), UriKind.Absolute);
                Uri File1_rel = new Uri(@"/OddContent/File1.xml", UriKind.Relative);

                using (ZipPackage exPkg = (ZipPackage)Package.Open(String.Format(@"{0}\Temp.zip", Dir), FileMode.Create))
                {
                    ZipPackagePart File1Part = (ZipPackagePart)exPkg.CreatePart(File1_rel, System.Net.Mime.MediaTypeNames.Text.Xml);
                    using (FileStream fs1 = new FileStream(File1_abs.LocalPath, FileMode.Open, FileAccess.Read))
                    {
                        Form1.CopyStream(fs1, File1Part.GetStream());
                    }
                    exPkg.CreateRelationship(File1_rel, TargetMode.Internal, "SomeType");
                    exPkg.Flush();
                    exPkg.Close();
                    }
            }

        private static void CopyStream(Stream source, Stream target)
        {
            const int bufSize = 0x1000;
            byte[] buf = new byte[bufSize];
            int bytesRead = 0;
            while ((bytesRead = source.Read(buf, 0, bufSize)) > 0)
                target.Write(buf, 0, bytesRead);
        }

また、指定されたコードに対して生成される [Content_Types].xml ファイルは次のとおりです。

<?xml version="1.0" encoding="UTF-8"?>
<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">
<Default ContentType="text/xml" Extension="xml"/>
</Types>

しかし、実際には、次のようなものが [Content_Types].xml ファイルの内容になると予想しています。

<?xml version="1.0" encoding="UTF-8"?>
<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">
<Default ContentType="text/xml" Extension="xml"/>
<Override PartName="...................."/>
</Types>
4

1 に答える 1

2

「Override」要素は、デフォルトの拡張子で別のコンテンツ タイプで保存されているパーツがあると、タイプ リストに追加されます。

File1Part の "Override" 要素を作成する更新バージョンを次に示します。

        Uri File1_rel = new Uri(@"/OddContent/File1.xml", UriKind.Relative);
        Uri File2_rel = new Uri(@"/OddContent/File2.xml", UriKind.Relative);

        using (ZipPackage exPkg = (ZipPackage)Package.Open(String.Format(@"{0}\Temp.zip", Dir), FileMode.Create))
        {
            ZipPackagePart p2 = (ZipPackagePart)exPkg.CreatePart(File2_rel, System.Net.Mime.MediaTypeNames.Text.Xml);
            ZipPackagePart File1Part = (ZipPackagePart)exPkg.CreatePart(File1_rel, "application/vnd.openxmlformats-officedocument.wordprocessingml.documents.main+xml");

注:vndのMIMEタイプをタイプコピーしました...画像から、タイプミスがある可能性がありますので、お気軽に修正してください。

作成された [Content_Types].xml は次のようになります。

<?xml version="1.0" encoding="utf-8"?>
<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">
<Default Extension="xml" ContentType="text/xml" />
<Default Extension="rels" ContentType="application/vnd.openxmlformats-package.relationships+xml" />
<Override PartName="/OddContent/File1.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.documents.main+xml" />
</Types>
于 2013-03-13T04:08:18.963 に答える