在Visual C# .Net 中怎样向Microsoft Excel 2002 传输XML数据[译]
英文链接:How To Transfer XML Data to Microsoft Excel 2002 by Using Visual C# .NET
目录:
摘要
通过Excel 2002 或 Excel 2003从数据集DataSet中生成XML数据
用样式表Stylesheet格式化XML数据
编程打开格式后的XML数据
摘要
Excel 2002提供了以XML格式打开文件的功能。一个格式合法的XML文件可以通过用户界面和代码直接在Excel 2002或Excel 2003中直接打开。
通过Visual C#.Net,你可以使用Excel的XML功能将数据传输到工作薄中,并以用户选择的格式和布局显示。本文将演示这些功能的实现。
通过Excel 2002 或 Excel 2003从数据集DataSet中生成XML数据
本节描述怎样创建DataSet对象,并通过WriteXml方法将数据传输到XML文件中。可以通过在Excel中直接打开的方式形成XML文件。为了更好的阐述,我们通过Jet OLEDB Provider连接Access中的Northwind样例数据库赖创建DataSet对象。当然,这与通过C#来创建任意DataSet对象的工作方式是相似的。
1、 启动Visual Studio .Net。点击“文件”菜单,选择“新建”中的“项目”选项。从项目类型中选择“Windows应用程序”,默认将创建Form1对象。
2、 在“查看”菜单,选择“工具箱”以显示工具箱,并添加一个button到窗体Form1中。
3、 双击Button1,显示代码窗口。
4、 添加下面的Using语句到Form1.cs的顶部:
using System.Data.OleDb;
using System.Xml;
5、 在Form1类中添加如下的私有成员变量:
private string strConn ="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
+ " C:\\Program Files\\Microsoft Office\\Office10\\Samples\\"
+ "Northwind.mdb;";
注意:你应该修改在connection中Northwind.mdb的路径,以匹配你的安装。
6、 在button1_Click事件中添加如下的代码:
//Connect to the data source.
OleDbConnection objConn = new OleDbConnection (strConn);
try
{
objConn.Open();
//Fill a dataset with records from the Customers table.
OleDbCommand objCmd = new OleDbCommand(
"Select CustomerID, CompanyName, ContactName, "
+ "Country, Phone from Customers", objConn);
OleDbDataAdapter objAdapter = new OleDbDataAdapter();
objAdapter.SelectCommand = objCmd;
DataSet objDataset = new DataSet();
objAdapter.Fill(objDataset);
//Create the FileStream to write with.
System.IO.FileStream fs = new System.IO.FileStream(
"C:\\Customers.xml", System.IO.FileMode.Create);
//Create an XmlTextWriter for the FileStream.
System.Xml.XmlTextWriter xtw = new System.Xml.XmlTextWriter(
fs, System.Text.Encoding.Unicode);
//Add processing instructions to the beginning of the XML file, one
//of which indicates a style sheet.
xtw.WriteProcessingInstruction("xml", "version='1.0'");
//xtw.WriteProcessingInstruction("xml-stylesheet",
// "type='text/xsl' href='customers.xsl'");
//Write the XML from the dataset to the file.
objDataset.WriteXml(xtw);
xtw.Close();
//Close the database connection.
objConn.Close();
}
catch (System.Exception ex)
{
MessageBox.Show(ex.Message);
}
7、 按F5编译并运行程序。
8、 单击Button1以创建XML文件,关闭窗体结束程序。
9、 启动Excel 2002或Excel 2003,打开上一步创建的Customers.xml文件。
10、你可以看到XML文件已经被解析为新工作薄中的行和列,关闭文件退出Excel。
用样式表Stylesheet格式化XML数据
接下来将演示怎样通过XSL(样式表stylesheet)格式化XML数据使其符合Excel工作薄。
1、 用HTML编辑器或文本编辑器(如记事本),编辑如下的XSL并保存到C:\Customer.xsl中:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
<HTML>
<HEAD>
<STYLE>
.HDR { background-color:bisque;font-weight:bold }
</STYLE>
</HEAD>
<BODY>
<TABLE>
<COLGROUP WIDTH="100" ALIGN="CENTER"></COLGROUP>
<COLGROUP WIDTH="200" ALIGN="LEFT"></COLGROUP>
<COLGROUP WIDTH="200" ALIGN="LEFT"></COLGROUP>
<COLGROUP WIDTH="100" ALIGN="LEFT"></COLGROUP>
<COLGROUP WIDTH="100" ALIGN="LEFT"></COLGROUP>
<TD CLASS="HDR">Customer ID</TD>
<TD CLASS="HDR">Company</TD>
<TD CLASS="HDR">Contact</TD>
<TD CLASS="HDR">Country</TD>
<TD CLASS="HDR">Phone</TD>
<xsl:for-each select="NewDataSet/Table">
<TR>
<TD><xsl:value-of select="CustomerID"/></TD>
<TD><xsl:value-of select="CompanyName"/></TD>
<TD><xsl:value-of select="ContactName"/></TD>
<TD><xsl:value-of select="Country"/></TD>
<TD><xsl:value-of select="Phone"/></TD>
</TR>
</xsl:for-each>
</TABLE>
</BODY>
</HTML>
</xsl:template>
</xsl:stylesheet>
2、 在button1_Click事件中将下面一行代码的注释取消:
xtw.WriteProcessingInstruction("xml-stylesheet",
"type='text/xsl' href='customers.xsl'");
这一行代码为Excel提供了处理向导(a processing instuction),将XML文件定位到样式表文件Customer.xsl上。
3、 按F5编译并运行程序。
4、 单击Button1创建XML文件,关闭Form1结束程序。
5、 启动Excel 2002或Excel 2003,打开上一步创建的Customers.xml文件。
6、 因为Excel检测到XML数据中有对样式表的处理向导,所以当你打开文件时会弹出一个对话框。在“(导入XML)Import XML”对话框中,选择“打开下列样式表文件(Open the file with the following stylesheet applied”。在列表中,选择Customer.xsl并单击确定“OK”。注意该XML数据已被格式化,因此列将根据样式表规定的格式排列。
7、 关闭文件退出Excel。
编程打开格式后的XML数据
在前面,我们是在Excel中通过用户界面直接打开的XML文件。本节将演示怎样通过程序激活Excel以打开工作薄。下面的示例说明怎样打开格式后的XML数据,而不需要通过用户操作将DataSet对象中的XML数据转换为HTML。
1、 添加引用:Microsoft Excel 10.0 Object Library或Microsoft Excel 11.0 Object Library。步骤如下:
a、 在“项目”菜单中,单击“添加引用”。
b、 在“COM”标签中,找到Microsoft Excel 10.0 Object Library或Microsoft Excel 11.0 Object Library,单击“选择”。
2、 在Form1.cs中添加using:
using Excel = Microsoft.Office.Interop.Excel;
3、 在Visula C#.Net项目中,添加另一个按钮到Form1中。
4、 双击Button2。在代码窗口中的Button2_Click事件中添加如下代码:
//Connect to the data source.
OleDbConnection objConn = new OleDbConnection (strConn);
objConn.Open();
//Fill a dataset with records from the Customers table.
OleDbCommand objCmd = new OleDbCommand(
"Select CustomerID, CompanyName, ContactName, "
+ "Country, Phone from Customers", objConn);
OleDbDataAdapter objAdapter = new OleDbDataAdapter();
objAdapter.SelectCommand = objCmd;
DataSet objDataset = new DataSet();
objAdapter.Fill(objDataset);
//Create the FileStream to write with.
System.IO.FileStream fs = new System.IO.FileStream(
"C:\\Customers.htm", System.IO.FileMode.Create);
//Create an XmlTextWriter for the FileStream.
System.Xml.XmlTextWriter xtw = new System.Xml.XmlTextWriter(
fs, System.Text.Encoding.Unicode);
//Transform the XML using the stylesheet.
XmlDataDocument xmlDoc = new XmlDataDocument(objDataset);
System.Xml.Xsl.XslTransform xslTran = new System.Xml.Xsl.XslTransform();
xslTran.Load("C:\\Customers.xsl");
xslTran.Transform(xmlDoc, null, xtw);
//Open the HTML file in Excel.
Excel.Application oExcel = new Excel.Application();
oExcel.Visible=true;
oExcel.UserControl=true;
Excel.Workbooks oBooks = oExcel.Workbooks;
object oOpt = System.Reflection.Missing.Value; //for optional arguments
oBooks.Open("c:\\customers.htm", oOpt, oOpt, oOpt,
oOpt, oOpt, oOpt, oOpt, oOpt, oOpt, oOpt, oOpt,
oOpt, oOpt, oOpt);
5、 按F5编译并运行程序。
6、 单击Button2打开在Excel中已格式化的XML数据。
注意:Excel 2002和Excel 2003对象模式暴露了OpenXML方法,使用户可以通过程序的方式打开应用了样式表的XML文件。上面的例子没有使用该方法是因为在Automation client模式下调用该方法存在问题。当我们从Excel宏(Excel macro)中调用OpenXML方法时,运行是正确的,然而如果以Automation client方式调用,StyleSheet参数会被忽略。如果要了解更多信息,可以参考微软知识库中的这篇文章:
307230 BUG: StyleSheets Parameter of the OpenXML Method Ignored When Automating Excel 2
相关文章: