将 Excel 转换为 XML 文件/XML Schema,并通过 XML Schema 验证 Excel






4.63/5 (35投票s)
2005年6月3日
4分钟阅读

562539

33089
提供一个实用工具和代码库,用于将 Excel 文件转换为 XML 文件以及生成 XML Schema。它会根据 XML Schema 验证 Excel 文件。
引言
我们经常需要将 Excel 数据转换为 XML 流/XML 文件,以便将其用作各种应用程序(如 Web 服务或 BizTalk 2004 等中间件)的源。在许多情况下,我们需要根据指定的 XML Schema 来验证 Excel 数据表的格式。我们还需要根据 Excel 工作表生成 XML Schema。此实用工具及库将帮助您完成这些任务。
该库的突出特点如下:
- 使用 Microsoft Jet 引擎连接 Excel。
- 将 Excel 工作表/工作簿转换为 XML 文件和 XML Schema。
- 根据提供的范围生成 XML 文件和 XML Schema。
- 根据提供的 XML Schema 验证 Excel 工作表/工作簿。
- 提供批量处理功能。
在本文中,我们将讨论该库函数的实现。该库包含访问和操作 Excel 数据的核心功能。
该实用工具将仅调用库中的相应函数。这样,您也可以在 ASP.NET 应用程序中使用此库,只需稍作修改。
连接选项
有两种方法可以操作 Excel 文件。可以使用 Microsoft Office 组件 (在此处查看) 或使用 Microsoft Jet 引擎。
根据微软的建议,不建议在服务器上使用 Office 组件。这意味着如果您想将此库用于服务器应用程序,使用 Office 组件不是一个好主意。因此,连接将通过 Jet 引擎完成。
使用 Jet 引擎连接 Excel
要连接到 Excel,可以使用 OleDb 对象,这些对象会将 Excel 视为数据库,然后通过使用 SQL 查询轻松获取所需信息。连接 Excel 时需要考虑的重要步骤如下:
- 连接字符串
连接字符串应设置为
OleDbConnection
对象。这一点至关重要,因为如果未提供正确详细信息,Jet 引擎可能不会给出正确的错误消息。语法:
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=<Excel 文件完整路径>; Extended Properties="Excel 8.0; HDR=No; IMEX=1"
。 - Extended Properties 的定义
Excel
= <编号>此处应指定 Excel 工作表的版本。对于 Excel 2000 及以上版本,设置为 Excel 8.0;对于其他版本,则设置为 Excel 5.0。
HDR
= <是/否>此属性用于指定每列的标题定义。如果值为“Yes”,则第一行将被视为标题。否则,系统将生成 F1、F2 等标题。
IMEX
= <0/1/2>IMEX
指的是 IMport EXport 模式。它可以取三个可能的值。
IMEX
=0 和IMEX
=2 将导致ImportMixedTypes
被忽略,并使用默认值“Majority Types”。在这种情况下,它将选取前 8 行,然后确定每列的数据类型。IMEX
=1 是将ImportMixedTypes
值设置为Text
的唯一方法。在这种情况下,所有内容都将被视为文本。
有关 Extended Properties 的更多信息,请在此处查看。
将数据加载到 Dataset 中
使用 Jet 引擎成功连接到 Excel 后,就可以轻松地将数据加载到 DataSet
中。需要编写一个类似于 ANSI-92 的查询,唯一的不同之处在于每个 Excel 工作表将被视为一个表,表名就是工作表名加上“$”。“$”号后面还可以指定范围。
public DataTable GetDataTable(string strSheetName)
{
try
{
string strComand;
if(strSheetName.IndexOf("|") > 0)
{
/* if Range is provided.*/
SheetName = strSheetName.Substring(0,strSheetName.IndexOf("|"));
Range = strSheetName.Substring(strSheetName.IndexOf("|")+1);
strComand="select * from ["+SheetName+"$"+Range+"]";
}
else
{
strComand="select * from ["+strSheetName+"$]";
}
daAdapter=new OleDbDataAdapter(strComand,cn);
DataTable dt=new DataTable(strSheetName);
daAdapter.FillSchema(dt,SchemaType.Source);
daAdapter.Fill(dt);
cn.Close();
return dt ;
}
catch(Exception ex)
{
throw new Exception(ex.Message);
}
}
将 Dataset 转换为 XML 数据和 XML Schema
将数据加载到 DataSet
后,将使用 GetXML
和 GetXMLSchema
函数来生成 XML 数据和 XML Schema。此工具还可以用于生成一个包含 XML Schema 和 XML 数据的文件。但这样做不应被推荐,因为 XML Schema 本身也是 XML 数据。以下代码片段显示了这种情况,应不惜一切代价避免。
public string GetXML(string strSheetName, Boolean _blnSchema)
{
DataSet ds=new DataSet();
ds.Tables.Add(this.GetDataTable(strSheetName));
if(_blnSchema)
return ds.GetXmlSchema()+ds.GetXml();
else
return ds.GetXml();
}
根据 XML Schema 进行验证
一旦数据以 XML 形式生成,我们就可以使用 System.Xml.Schema
中的 XmlValidatingReader
对象来验证它。
public string ValidateXML(string strSchemaFile,string WorkSheet)
{
strParseError="";
XmlParserContext context = new XmlParserContext(null,
new XmlNamespaceManager(new NameTable()),
null, XmlSpace.None);
XmlTextReader xmlReader = new XmlTextReader(this.GetXML(WorkSheet,
false), XmlNodeType.Element, context);
XmlValidatingReader objValidator = new XmlValidatingReader(xmlReader);
/* set the validation type to use an XSD schema */
objValidator.ValidationType = ValidationType.Schema;
XmlSchemaCollection objSchemaCol = new XmlSchemaCollection();
objSchemaCol.Add("", strSchemaFile);
objValidator.Schemas.Add(objSchemaCol);
objValidator.ValidationEventHandler +=
new ValidationEventHandler(ShowCompileErrors);
try
{
while (objValidator.Read()) { }
}
catch(Exception objError)
{
throw new Exception(objError.Message);
}
finally
{
xmlReader.Close();
}
return strParseError;
}
private void ShowCompileErrors(object sender, ValidationEventArgs args)
{
strParseError+="::"+args.Message+"\r\n" ;
}
批量处理
批量处理将接收字符串数组,然后利用上述函数为每个工作簿生成 XML 文件和 Schema。
未来的增强
根据给定的 XML Schema 生成 Excel 工作表。
下载二进制文件
您可以 在此处 下载可运行的应用程序 [9.48 Kb]。
历史
- 1.0 版本发布于 2005 年 6 月 3 日。