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

时间:2017-06-12 12:24:54

标签: c# visual-studio serialization xsd xml-deserialization

我有这种情况,我已经提供了一个由四个XSD文件组成的XSD架构,我可以使用XSD.exe工具将其转换为类并将其包含在我的项目中,对于此示例,此类已命名“Test_XSD”。另一方面,我有一个由10列组成的填充excel表格表,我需要将其映射到“Text XSD”中的某些元素。 “Test_XSD”架构很复杂但是如果我将10列映射到它们的相关元素就足够了,因为许多其他元素不是必需的。我搜索过并搜索过但找不到一个简单的例子来开始构建它。

我能够在Visual Studio中读取excel文件并转换为XML,但这不符合XSD生成的类。我知道我必须创建一个“Test_XSD”的实例并使用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生成的类(“Test_XSD”)由多个部分类组成,因此我认为必须创建每个类的实例。

提前致谢,我们非常感谢您提供代码段。

2 个答案:

答案 0 :(得分:0)

XSD类的对象将具有公共属性。如果您设置这些属性的值(类似于您的示例中的.version),那么您的对象将完全填充。

这是你想要的吗?

答案 1 :(得分:0)

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

由于您能够成功读取Excel文件并为数据集创建XML文件。

执行以下操作:

  1. 按如下方式向项目添加新类:

    public class ExcelNameSpaceXmlTextReader : XmlTextReader
    {          
    
         public ExcelNameSpaceXmlTextReader(System.IO.TextReader reader)
            : base(reader) { }
    
        public override string NamespaceURI
        {
            get { return ""; }
        }
    }
    
  2. 然后在单独的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();
    
    }