Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# DataTable.WriteXML输出到Excel导入_C#_.net_Xml_Excel - Fatal编程技术网

C# DataTable.WriteXML输出到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对象导出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 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导出的。请尝试此链接