Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.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# 从EXCEL到C中XSD生成的类_C#_Visual Studio_Serialization_Xsd_Xml Deserialization - Fatal编程技术网

C# 从EXCEL到C中XSD生成的类

C# 从EXCEL到C中XSD生成的类,c#,visual-studio,serialization,xsd,xml-deserialization,C#,Visual Studio,Serialization,Xsd,Xml Deserialization,在这种情况下,我得到了一个由四个XSD文件组成的XSD模式,我能够使用XSD.exe工具将其转换为一个类,并将其包含在我的项目中,例如,这个类被命名为testxsd。另一方面,我有一个填充的excel工作表,由10列组成,需要映射到文本XSD中的某些元素。Test_XSD模式很复杂,但是如果我将10列映射到它们的相关元素就足够了,因为许多其他元素不是必需的。我搜索了又搜索,但找不到一个简单的例子来开始构建它 我能够在VisualStudio中读取excel文件并将其转换为XML,但是这不符合XS

在这种情况下,我得到了一个由四个XSD文件组成的XSD模式,我能够使用XSD.exe工具将其转换为一个类,并将其包含在我的项目中,例如,这个类被命名为testxsd。另一方面,我有一个填充的excel工作表,由10列组成,需要映射到文本XSD中的某些元素。Test_XSD模式很复杂,但是如果我将10列映射到它们的相关元素就足够了,因为许多其他元素不是必需的。我搜索了又搜索,但找不到一个简单的例子来开始构建它

我能够在VisualStudio中读取excel文件并将其转换为XML,但是这不符合XSD生成的类。我知道我必须创建testxsd的一个实例,并用Excel中的数据加载它,但我不知道从哪里开始。有人能解释一下需要做什么吗

这就是我迄今为止所做的,我承认不太多,但这对我来说是全新的,老实说,尽管我做了很多研究,但我还不知道前进的方向

static void Main(string[] args)
    {
        // Using an OleDbConnection to connect to excel
        var cs = $@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={@"C:\AAAA\Report.xlsx"};Extended Properties=""Excel 12.0 Xml; HDR = Yes; IMEX = 2"";Persist Security Info=False";
        var con = new OleDbConnection(cs);
        con.Open();

    // Using OleDbCommand to read data of the sheet(sheetName)
    var cmd = new OleDbCommand($"select * from [Sheet1$]", con);
    var ds = new DataSet();
    var da = new OleDbDataAdapter(cmd);
    da.Fill(ds);

    //// Convert DataSet to Xml
    //using (var fs = new FileStream(@"C:\Users\MT2362\Downloads\CRS_XML.xml", FileMode.CreateNew))
    //{
    //    using (var xw = new XmlTextWriter(fs, Encoding.UTF8))
    //    {
    //        ds.WriteXml(xw);
    //    }
    //}

    XSD xsd = new XSD();
    xsd.version = "TEST VERSION";

    Console.WriteLine(xsd.version);
    Console.ReadKey();

}
我注意到XSD测试生成的类由多个分部类组成,因此我认为必须为每个类创建一个实例


提前感谢,非常感谢您的代码片段。

您的XSD类的对象将具有公共属性。如果将这些属性的值设置为与示例中的.version类似,则对象已完全填充


这就是您想要的吗?

运行XSD.exe工具后,输出将是一个可供您使用的C类列表

因为您能够成功地读取Excel文件并为数据集创建XML文件

执行以下操作:

将新类添加到项目中,如下所示:

public class ExcelNameSpaceXmlTextReader : XmlTextReader
{          

     public ExcelNameSpaceXmlTextReader(System.IO.TextReader reader)
        : base(reader) { }

    public override string NamespaceURI
    {
        get { return ""; }
    }
}
然后在一个单独的Utitlity类中添加一个反序列化器函数,如下所示

public class Utility
{

        public T FromXml<T>(String xml)
        {
            T returnedXmlClass = default(T);

            using (TextReader reader = new StringReader(xml))
            {                
               returnedXmlClass = (T)new XmlSerializer(typeof(T)).Deserialize(new ExcelNameSpaceXmlTextReader(reader)); 
            } 


        return returnedXmlClass;
    }

}
现在添加代码,通过使用通用实用程序函数,将从XML读入的数据作为要序列化数据的对象使用

所以你的代码应该是

static void Main(string[] args)
{
    // Using an OleDbConnection to connect to excel
    var cs = $@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={@"C:\AAAA\Report.xlsx"};Extended Properties=""Excel 12.0 Xml; HDR = Yes; IMEX = 2"";Persist Security Info=False";
    var con = new OleDbConnection(cs);
    con.Open();

// Using OleDbCommand to read data of the sheet(sheetName)
var cmd = new OleDbCommand($"select * from [Sheet1$]", con);
var ds = new DataSet();
var da = new OleDbDataAdapter(cmd);
da.Fill(ds);

   // Convert DataSet to Xml
using (var fs = new FileStream(@"C:\Users\MT2362\Downloads\CRS_XML.xml", FileMode.CreateNew))
{
    using (var xw = new XmlTextWriter(fs, Encoding.UTF8))
    {
        ds.WriteXml(xw);
    }
}

     XDocument doc = XDocument.Load("C:\Users\MT2362\Downloads\CRS_XML.xml");

Test_XSD test_XSD = Utility.FromXml<Test_XSD>(doc.Document.ToString()); 

XSD xsd = new XSD();
xsd.version = "TEST VERSION";

Console.WriteLine(xsd.version);
Console.ReadKey();

}

如果您提供一些代码来显示您尝试过的内容,以便获得一些上下文并提供更多引导性反馈,则可能会有所帮助。您是否尝试从Excel工作表中获取数据并根据架构将其输出为XML?您可能会使用xsd.exe创建类,添加一些自定义代码,然后需要重新生成类,因为一个小的模式更改。这就是为什么它们被生成为分部类。它允许您将自定义代码放在一个单独的文件中,如果需要从架构重新生成类,该文件不会被删除。@Scott Hannen,是的,这就是我试图做的,但是使用XSD.exe工具从XSD生成的类非常复杂,我不知道如何在这个类中填充对象。你能发布一些源数据的示例吗?