我正在编写一个 Delphi (10.4) 程序来将数据库导出为 XML。目的是将 .xml 文件直接打开到 Excel 中。我正在使用工作 .xml 作为需要导出内容的基础。当我尝试打开导出的文件时,出现错误“此文件因错误而无法打开。”我已经将它缩小到 .xml 中的一行。
<Styles xmlns="urn:schemas-microsoft-com:office:office">
在原来的这只是如下:
<Styles>
这是根的子节点。在此之前的子节点在原始文件和导出文件中具有相同的xmlns。
下面是我正在使用的代码。
procedure TForm1.btnSaveClick(Sender: TObject);
var
XML : IXMLDOCUMENT;
RootNode, CurNode, ChildNode, ChildNode2, ChildNode3 : IXMLNODE;
ns, nso, nsx, nsss, nshtml : String;
begin
XML := NewXMLDocument;
XML.Options := [doNodeAutoIndent]; // looks better in Editor ;)
ns := 'urn:schemas-microsoft-com:office:spreadsheet';
nso := 'urn:schemas-microsoft-com:office:office';
nsx:= 'urn:schemas-microsoft-com:office:excel';
nsss := 'urn:schemas-microsoft-com:office:spreadsheet';
nshtml := 'http://www.w3.org/TR/REC-html40';
RootNode := XML.AddChild('Workbook');
RootNode.DeclareNamespace('', ns);
RootNode.DeclareNamespace('o', nso);
RootNode.DeclareNamespace('x', nsx);
RootNode.DeclareNamespace('ss', nsss);
RootNode.DeclareNamespace('html', nshtml);
CurNode := RootNode.AddChild('DocumentProperties');/////////////////////////DocumentProperties
CurNode.DeclareNamespace('', nso);
ChildNode := CurNode.AddChild('Author', nso);
ChildNode.Text := 'File Author';
ChildNode := CurNode.AddChild('LastAuthor', nso);
ChildNode.Text := 'File Editor';
ChildNode := CurNode.AddChild('Created', nso);
ChildNode.Text := DateToStr(Now);
ChildNode := CurNode.AddChild('LastSaved', nso);
ChildNode.Text := DateToStr(Now);
ChildNode := CurNode.AddChild('Version', nso);
ChildNode.Text := '16.00';
CurNode := RootNode.AddChild('OfficeDocumentSettings');/////////////////////OfficeDocumentSettings
CurNode.DeclareNamespace('', nso);
ChildNode := CurNode.AddChild('AllowPNG', nso);
CurNode := RootNode.AddChild('ExcelWorkbook');/////////////////////////////ExcelWorkbook
CurNode.DeclareNamespace('', nso);
ChildNode := CurNode.AddChild('WindowHeight', nso);
ChildNode.Text := '8976';
ChildNode := CurNode.AddChild('WindowWidth', nso);
ChildNode.Text := '23040';
ChildNode := CurNode.AddChild('WindowTopX', nso);
ChildNode.Text := '32767';
ChildNode := CurNode.AddChild('WindowTopY', nso);
ChildNode.Text := '32767';
ChildNode := CurNode.AddChild('ProtectStructure', nso);
ChildNode.Text := 'False';
ChildNode := CurNode.AddChild('ProtectWindows', nso);
ChildNode.Text := 'False';
CurNode := RootNode.AddChild('Styles');/////////////////////////////////////Styles
ChildNode := CurNode.AddChild('Style', nso);
ChildNode.Attributes['ss:ID'] := 'Default';
ChildNode.Attributes['ss:Name'] := 'Normal';
ChildNode2 := ChildNode.AddChild('Alignment', nso);
ChildNode2.Attributes['ss:Vertical'] := 'Bottom';
ChildNode2 := ChildNode.AddChild('Borders', nso);
ChildNode2 := ChildNode.AddChild('Font', nso);
ChildNode2.Attributes['ss:FontName'] := 'Calibri';
ChildNode2.Attributes['x:Family'] := 'Swiss';
ChildNode2.Attributes['ss:Size'] := '11';
ChildNode2.Attributes['ss:Color'] := '#000000';
ChildNode2 := ChildNode.AddChild('Interior', nso);
ChildNode2 := ChildNode.AddChild('NumberFormat', nso);
ChildNode2 := ChildNode.AddChild('Protection', nso);
ChildNode := CurNode.AddChild('Style', nso);
ChildNode.Attributes['ss:ID'] := 's64';
ChildNode2 := ChildNode.AddChild('Alignment', nso);
ChildNode2.Attributes['ss:Vertical'] := 'Center';
ChildNode2.Attributes['ss:WrapText'] := '1';
ChildNode2 := ChildNode.AddChild('Borders', nso);
ChildNode3 := ChildNode2.AddChild('Border', nso);
ChildNode3.Attributes['ss:Position'] := 'Right';
ChildNode3.Attributes['ss:LineStyle'] := 'Continuous';
ChildNode3.Attributes['ss:Weight'] := '1';
ChildNode3.Attributes['ss:Color'] := '#FFFFFF';
ChildNode2 := ChildNode.AddChild('Font', nso);
ChildNode2.Attributes['ss:FontName'] := 'Calibri';
ChildNode2.Attributes['x:Family'] := 'Swiss';
ChildNode2.Attributes['ss:Size'] := '11';
ChildNode2.Attributes['ss:Color'] := '#FFFFFF';
ChildNode2 := ChildNode.AddChild('Interior', nso);
ChildNode2.Attributes['ss:Color'] := '#44546A';
ChildNode2.Attributes['ss:Pattern'] := 'Solid';
ChildNode := CurNode.AddChild('Style', nso);
ChildNode.Attributes['ss:ID'] := 's65';
ChildNode2 := ChildNode.AddChild('Alignment', nso);
ChildNode2.Attributes['ss:Vertical'] := 'Center';
ChildNode2.Attributes['ss:WrapText'] := '1';
ChildNode2 := ChildNode.AddChild('Borders', nso);
ChildNode3 := ChildNode2.AddChild('Border', nso);
ChildNode3.Attributes['ss:Position'] := 'Left';
ChildNode3.Attributes['ss:LineStyle'] := 'Continuous';
ChildNode3.Attributes['ss:Weight'] := '1';
ChildNode3.Attributes['ss:Color'] := '#FFFFFF';
ChildNode3 := ChildNode2.AddChild('Border', nso);
ChildNode3.Attributes['ss:Position'] := 'Right';
ChildNode3.Attributes['ss:LineStyle'] := 'Continuous';
ChildNode3.Attributes['ss:Weight'] := '1';
ChildNode3.Attributes['ss:Color'] := '#FFFFFF';
ChildNode2 := ChildNode.AddChild('Font', nso);
ChildNode2.Attributes['ss:FontName'] := 'Calibri';
ChildNode2.Attributes['x:Family'] := 'Swiss';
ChildNode2.Attributes['ss:Size'] := '11';
ChildNode2.Attributes['ss:Color'] := '#FFFFFF';
ChildNode2 := ChildNode.AddChild('Interior', nso);
ChildNode2.Attributes['ss:Color'] := '#44546A';
ChildNode2.Attributes['ss:Pattern'] := 'Solid';
ChildNode := CurNode.AddChild('Style', nso);
ChildNode.Attributes['ss:ID'] := 's66';
ChildNode2 := ChildNode.AddChild('Alignment', nso);
ChildNode2.Attributes['ss:Vertical'] := 'Bottom';
ChildNode2.Attributes['ss:WrapText'] := '1';
XMl.SaveToFile('export.xml');
end;
我折叠了原始和导出的XML文件的屏幕截图以显示子节点。
我尝试添加和删除命名空间,但我无法让
<Styles>
没有任何 xmlns - 我得到的最好的是 <Styles xmlns="">
这给了我同样的错误。
请注意:Worksheet 子节点不在程序中,因为我仍然需要到达该部分。为了测试,我从原始 XML 文件中复制了数据。