C# 从EXCEL到C中XSD生成的类
在这种情况下,我得到了一个由四个XSD文件组成的XSD模式,我能够使用XSD.exe工具将其转换为一个类,并将其包含在我的项目中,例如,这个类被命名为testxsd。另一方面,我有一个填充的excel工作表,由10列组成,需要映射到文本XSD中的某些元素。Test_XSD模式很复杂,但是如果我将10列映射到它们的相关元素就足够了,因为许多其他元素不是必需的。我搜索了又搜索,但找不到一个简单的例子来开始构建它 我能够在VisualStudio中读取excel文件并将其转换为XML,但是这不符合XSD生成的类。我知道我必须创建testxsd的一个实例,并用Excel中的数据加载它,但我不知道从哪里开始。有人能解释一下需要做什么吗 这就是我迄今为止所做的,我承认不太多,但这对我来说是全新的,老实说,尽管我做了很多研究,但我还不知道前进的方向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
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生成的类非常复杂,我不知道如何在这个类中填充对象。你能发布一些源数据的示例吗?