我正在尝试使用 .net 4.0内置类创建一个2007+ Excel文档(.xlsx)。 所以我不能使用任何第三方库。
实际上它已经完成了大部分,我现在面临的唯一问题是,我创建的包似乎在创建 [Content_Types] .xml 文件时失败了,我的意思是它缺少所有< Override> 元素,并且只创建了< Default> 元素。
我很确定问题是在我创建软件包之间的关系时,但我不知道如何使它工作,以及软件包上的文档和示例 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>
答案 0 :(得分:2)
一旦存在使用默认扩展名但具有不同内容类型的部分,“覆盖”元素将被放入类型列表中。
这是一个更新版本,它将为File1Part创建“覆盖”元素:
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>