使用 ClosedXml 将 XML 文档转换为 OpenXML 格式

问题描述 投票:0回答:1

我有一个 OpenXML 格式的 XmlDocument。看起来像这样:

<?xml version="1.0" encoding="utf-8"?>
<?mso-application progid="Excel.Sheet"?>
<Workbook>
    <o:DocumentProperties>
        [snip]
    </o:DocumentProperties>
    <Styles>
        [snip]
    </Styles>
    <Worksheet ss:Name="Contract">
        <Table>
            <Row>
                <Cell ss:StyleID="s38">
                    <Data ss:Type="String"/>
                </Cell>
                <Cell ss:StyleID="s38">
                    <Data ss:Type="String">System Number</Data>
                </Cell>
                <Cell ss:StyleID="s38">
                    <Data ss:Type="String">Contract Number</Data>
                </Cell>
                <Cell ss:StyleID="s38">
                    <Data ss:Type="String">Customer Name(s)</Data>
                </Cell>
                <Cell ss:StyleID="s38">
                    <Data ss:Type="String">Customer System Number(s)</Data>
                </Cell>
                [snip]
            </Row>
            <Row>
                [snip]
            </Row>
            [etc]
        </Table>
        <x:WorksheetOptions>
            [snip]
        </x:WorksheetOptions>
    </Worksheet>
</Workbook>

我需要从公司内部网站向用户展示此内容。但是,直接呈现它的代码不起作用:

MemoryStream strm = new MemoryStream();
XmlWriter xmlWriter = XmlWriter.Create(strm);

System.Xml.XPath.XPathNavigator xPathNavigator = xPartCollection.OwnerDocument.CreateNavigator();
xslt.Transform(xPathNavigator, xmlWriter);
strm.Position = 0;

Response.Clear();
Response.Charset = "utf-8";
Response.ContentEncoding = System.Text.Encoding.GetEncoding("windows-1250");
Response.AddHeader("content-disposition", "attachment;filename=" + PartDefGuid.InternalName + Start + ".xlsx");
Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
Response.Charset = "";
Response.ContentEncoding = System.Text.Encoding.Default;
Response.BinaryWrite(strm.ToArray());
Response.Flush();
Response.SuppressContent = true;
Response.End();

Excel 抛出错误“Excel 无法打开此文件,因为文件格式或文件扩展名无效。”我认为这与公司从网上下载 Excel 文件的内部安全有关。他们把它设置得非常高。

但是,在网站的另一个地方,我的 ClosedXML 运行得很好。我可以创建 ClosedXML 工作簿并响应。写入工作簿,Excel 将打开它们。

我想知道是否有办法让 ClosedXML 读取这个 OpenXML 样式的 XML 文档。它将使我不必重做所有用于创建 OpenXML 文档的代码。

我尝试将其转换为数据集,因为 ClosedXML 非常擅长将数据集转换为 Excel 工作簿数据。这带来了更多问题,因为它将每个部分视为不同的表。该数据集最终有 17 个表。

<Worksheet>
<Table>
<Row>
<Cell>
变成了四个独立的桌子。

我可以合并所有表格并使其格式正确,但我认为从 OpenXML 源开始并将其直接转换为 ClosedXML 可能更容易。

c# asp.net excel openxml closedxml
1个回答
0
投票

.xlsx 文件是一个 zip 文件,其中包含 xml(如您拥有的工作表 xml)和“其他元数据”。您不能将 xml 直接发送给客户端并期望 Excel 接受它。我不知道 ClosedXml (或 OpenXml)是否可以帮助解决这个问题。不过,您自己完成此操作应该很容易。以下是将创建“最小”.xlsx 文件的项目的链接: https://github.com/MarkPflug/Sylvan.Data.Excel/tree/main/source/MinimalXlsx

这应该为您提供一个了解 .xlsx zip 文件中需要包含哪些内容的起点。您还可以阅读“开放打包约定”规范,这是构建 Office xml 文件的通用技术。

© www.soinside.com 2019 - 2024. All rights reserved.