C# DataTable.WriteXML输出到Excel导入
无法从DataTable对象导出XML,然后使用File->Open将其导入Excel。主要问题是,如果我编写模式,Excel拒绝识别它。如果我不写模式,Excel就不会“发明”正确的模式。首先,一些代码:C# DataTable.WriteXML输出到Excel导入,c#,.net,xml,excel,C#,.net,Xml,Excel,无法从DataTable对象导出XML,然后使用File->Open将其导入Excel。主要问题是,如果我编写模式,Excel拒绝识别它。如果我不写模式,Excel就不会“发明”正确的模式。首先,一些代码: DataTable dt; DataRow dr; dt = new DataTable("Employee", "xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance"); dt.Columns.Add("First Nam
DataTable dt;
DataRow dr;
dt = new DataTable("Employee", "xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance");
dt.Columns.Add("First Name", typeof(string));
dt.Columns.Add("Last Name", typeof(string));
dt.Columns.Add("Job Title", typeof(string));
dt.Columns.Add("Annual Salary", typeof(int));
dt.Columns.Add("Hourly Wage", typeof(int));
dt.Columns.Add("Termination Date", typeof(DateTime));
dt.Columns["Termination Date"].DateTimeMode = DataSetDateTime.Unspecified;
dt.Columns.Add("Hire Date", typeof(DateTime));
dt.Columns["Hire Date"].DateTimeMode = DataSetDateTime.Unspecified;
dr = dt.NewRow();
dr[0] = "Joe";
dr[1] = "Blow";
dr[2] = "Grunt";
dr[4] = 15;
dr[6] = new DateTime(1998, 3, 17);
dt.Rows.Add(dr);
dr = dt.NewRow();
dr[0] = "Jane";
dr[1] = "Doe";
dr[2] = "Manager";
dr[3] = 75000;
dr[5] = new DateTime(2015, 6, 26);
dr[6] = new DateTime(2014, 2, 12);
dt.Rows.Add(dr);
dt.WriteXml(@"C:\Users\Public\DataTable1.xml", XmlWriteMode.IgnoreSchema);
dt.WriteXml(@"C:\Users\Public\DataTable2.xml", XmlWriteMode.WriteSchema);
dt.WriteXmlSchema(@"C:\Users\Public\DataTable.xsd");
请注意我添加到表中的列的顺序,请注意我的数据是专门构造的,在某些单元格中以非常特定的顺序具有空值。现在有一些输出:
DataTable1.xml
<?xml version="1.0" standalone="yes"?>
<DocumentElement xmlns="xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance">
<Employee>
<First_x0020_Name>Joe</First_x0020_Name>
<Last_x0020_Name>Blow</Last_x0020_Name>
<Job_x0020_Title>Grunt</Job_x0020_Title>
<Hourly_x0020_Wage>15</Hourly_x0020_Wage>
<Hire_x0020_Date>1998-03-17T00:00:00</Hire_x0020_Date>
</Employee>
<Employee>
<First_x0020_Name>Jane</First_x0020_Name>
<Last_x0020_Name>Doe</Last_x0020_Name>
<Job_x0020_Title>Manager</Job_x0020_Title>
<Annual_x0020_Salary>75000</Annual_x0020_Salary>
<Termination_x0020_Date>2015-06-26T00:00:00</Termination_x0020_Date>
<Hire_x0020_Date>2014-02-12T00:00:00</Hire_x0020_Date>
</Employee>
</DocumentElement>
乔
吹
咕哝
15
1998-03-17T00:00:00
简
雌鹿
经理
75000
2015-06-26T00:00:00
2014-02-12T00:00:00
DataTable2.xml
<?xml version="1.0" standalone="yes"?>
<NewDataSet xmlns="xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance">
<xs:schema id="NewDataSet" targetNamespace="xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance" xmlns:mstns="xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance" xmlns="xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" attributeFormDefault="qualified" elementFormDefault="qualified">
<xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:MainDataTable="xmlns_x003A_xsi_x003D_http_x003A__x002F__x002F_www.w3.org_x002F_2001_x002F_XMLSchema-instance_x003A_Employee" msdata:UseCurrentLocale="true">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="Employee">
<xs:complexType>
<xs:sequence>
<xs:element name="First_x0020_Name" type="xs:string" minOccurs="0" />
<xs:element name="Last_x0020_Name" type="xs:string" minOccurs="0" />
<xs:element name="Job_x0020_Title" type="xs:string" minOccurs="0" />
<xs:element name="Annual_x0020_Salary" type="xs:int" minOccurs="0" />
<xs:element name="Hourly_x0020_Wage" type="xs:int" minOccurs="0" />
<xs:element name="Termination_x0020_Date" msdata:DateTimeMode="Unspecified" type="xs:dateTime" minOccurs="0" />
<xs:element name="Hire_x0020_Date" msdata:DateTimeMode="Unspecified" type="xs:dateTime" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
<Employee>
<First_x0020_Name>Joe</First_x0020_Name>
<Last_x0020_Name>Blow</Last_x0020_Name>
<Job_x0020_Title>Grunt</Job_x0020_Title>
<Hourly_x0020_Wage>15</Hourly_x0020_Wage>
<Hire_x0020_Date>1998-03-17T00:00:00</Hire_x0020_Date>
</Employee>
<Employee>
<First_x0020_Name>Jane</First_x0020_Name>
<Last_x0020_Name>Doe</Last_x0020_Name>
<Job_x0020_Title>Manager</Job_x0020_Title>
<Annual_x0020_Salary>75000</Annual_x0020_Salary>
<Termination_x0020_Date>2015-06-26T00:00:00</Termination_x0020_Date>
<Hire_x0020_Date>2014-02-12T00:00:00</Hire_x0020_Date>
</Employee>
</NewDataSet>
乔
吹
咕哝
15
1998-03-17T00:00:00
简
雌鹿
经理
75000
2015-06-26T00:00:00
2014-02-12T00:00:00
DataTable.xsd
<?xml version="1.0" standalone="yes"?>
<xs:schema id="NewDataSet" targetNamespace="xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance" xmlns:mstns="xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance" xmlns="xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" attributeFormDefault="qualified" elementFormDefault="qualified">
<xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:MainDataTable="xmlns_x003A_xsi_x003D_http_x003A__x002F__x002F_www.w3.org_x002F_2001_x002F_XMLSchema-instance_x003A_Employee" msdata:UseCurrentLocale="true">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="Employee">
<xs:complexType>
<xs:sequence>
<xs:element name="First_x0020_Name" type="xs:string" minOccurs="0" />
<xs:element name="Last_x0020_Name" type="xs:string" minOccurs="0" />
<xs:element name="Job_x0020_Title" type="xs:string" minOccurs="0" />
<xs:element name="Annual_x0020_Salary" type="xs:int" minOccurs="0" />
<xs:element name="Hourly_x0020_Wage" type="xs:int" minOccurs="0" />
<xs:element name="Termination_x0020_Date" msdata:DateTimeMode="Unspecified" type="xs:dateTime" minOccurs="0" />
<xs:element name="Hire_x0020_Date" msdata:DateTimeMode="Unspecified" type="xs:dateTime" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
WriteXML函数显然没有输出格式正确的模式代码(或者Excel太笨而无法识别)。所以Excel声称DataTable2.xml没有模式,但不用担心我Excel,全能者会为您发明一个模式。然后,它继续,得到这个,像导入数据一样导入模式,然后导入列中的实际数据,这些列位于将模式误报为数据所需的任何列的右侧。这就引出了第二个问题。WriteXML函数“Brilliant”省去了任何空值成员,因此Excel(记住,它是万能的)“发明”了一个模式,它只是开始读取元素并创建它需要的任何列。如果已经存在相同的命名列,它将重用这些列,但在右侧添加列。由于我的第一个元素包含索引3和索引5中的列的空值,所以在第二条记录添加这些值之前,这些值将被忽略。这有效地交换了列顺序。如果我在DataTable构造函数调用中有一个名称空间值,那就更不用说附加到列名的哑“ns1:”前缀了。顺便说一句,“DataSetDateTime.Unspecified”位用于防止XML日期时间出现在“2007-10-22T09:55:45-05:00”格式中,Excel无法从文本解析回日期时间。。。它被迫这么做。。。没有模式。。。它看不懂。我尝试为列输入一个默认值(new DateTime()),但这不起作用,因为我使用的是来自另一个表的ImportRow,我不想要goofy'0001-1-1:00:00:00'默认日期时间,因为,猜猜看,Excel也无法将其解释为日期时间。虽然它能够将“1900-1-1:00:00:00”解释为日期时间,但我认为这是T-SQL的默认值。如果有任何帮助,我将不胜感激,因为我希望摆脱当前的解决方法,即在所有列中填充默认值的虚拟第一行,以强制Excel构建正确的架构,然后告诉用户将其删除。如果您创建了一个数据集,该怎么办。。然后使用下面的
yourDataSet.ReadXml(文件XmlReadMode.InferSchema)读入XML代码>@MethodMan:我正在尝试将XML读入Excel。它是从DataTable导出的。请尝试此链接