好学IT学院:IT信息技术分享交流平台
标签:.NET  来源:Microsoft  作者:本站整理  发布时间:2007-02-04  ★★★加入收藏〗〖手机版
如何使用Visual C# 2005或Visual C# .NET向Excel工作簿传输数据
摘要:本文分步介绍了多种从 Microsoft Visual C# 2005 或 Microsoft Visual C# .NET 程序向 Microsoft Excel 2002 传输数据的方法。本文还提供了每种方法的优点和缺点,以便您可以选择最适合您的情况的解决…

使用 Windows 剪贴板

可以使用 Windows 剪贴板来向工作表传输数据。要将数据粘贴到工作表上的多个单元格中,可以复制具有以下格式的字符串:在该字符串中,列由制表符分隔,行由回车符分隔。下面的代码说明了 Visual C# .NET 如何使用 Windows 剪贴板来向 Excel 传输数据:

// Copy a string to the Windows clipboard.
string sData = "FirstName\tLastName\tBirthdate\r\n"  +
 "Bill\tBrown\t2/5/85\r\n"  +
 "Joe\tThomas\t1/1/91";
System.Windows.Forms.Clipboard.SetDataObject(sData);

// Start a new workbook in Excel.
m_objExcel = new Excel.Application();
m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks;
m_objBook = (Excel._Workbook)(m_objBooks.Add(m_objOpt));

// Paste the data starting at cell A1.
m_objSheets = (Excel.Sheets)m_objBook.Worksheets;
m_objSheet = (Excel._Worksheet)(m_objSheets.get_Item(1));
m_objRange = m_objSheet.get_Range("A1", m_objOpt);
m_objSheet.Paste(m_objRange, false);

// Save the workbook and quit Excel.
m_objBook.SaveAs(m_strSampleFolder + "Book5.xls", m_objOpt, m_objOpt,
 m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange, m_objOpt, m_objOpt,
 m_objOpt, m_objOpt);
m_objBook.Close(false, m_objOpt, m_objOpt);
m_objExcel.Quit();
  
创建可由 Excel 分析为行和列的带分隔符的文本文件

Excel 可以打开由制表符或逗号分隔的文件并正确地将数据分析为单元格。当您希望向工作表传输大量数据而只使用少量(如果有的话)自动化功能时,可以使用此功能。这对于客户端-服务器程序而言可能是一个好方法,因为文本文件可以在服务器端生成。然后,可以在客户端根据需要使用“自动化”功能来打开文本文件。

下面的代码说明了如何从利用 ADO.NET 读取的数据生成制表符分隔的文本文件:

// Connect to the data source.
System.Data.OleDb.OleDbConnection objConn = new System.Data.OleDb.OleDbConnection(
 "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + m_strNorthwind + ";");
objConn.Open();

// Execute a command to retrieve all records from the Employees table.
System.Data.OleDb.OleDbCommand objCmd = new System.Data.OleDb.OleDbCommand(
 "Select * From Employees", objConn);
System.Data.OleDb.OleDbDataReader objReader;
objReader = objCmd.ExecuteReader();

// Create the FileStream and StreamWriter object to write
// the recordset contents to file.
System.IO.FileStream fs = new System.IO.FileStream(
 m_strSampleFolder + "Book6.txt", System.IO.FileMode.Create);
System.IO.StreamWriter sw = new System.IO.StreamWriter(
 fs, System.Text.Encoding.Unicode);

// Write the field names (headers) as the first line in the text file.
sw.WriteLine(objReader.GetName(0) +  "\t" + objReader.GetName(1) +
 "\t" + objReader.GetName(2) + "\t" + objReader.GetName(3) +
 "\t" + objReader.GetName(4) + "\t" + objReader.GetName(5));

// Write the first six columns in the recordset to a text file as
// tab-delimited.
while(objReader.Read())
{
 for(int i=0;i<=5;i++)
 {
  if(!objReader.IsDBNull(i))
  {
   string s;
   s = objReader.GetDataTypeName(i);
   if(objReader.GetDataTypeName(i)=="DBTYPE_I4")
   {
  sw.Write(objReader.GetInt32(i).ToString());
   }
   else if(objReader.GetDataTypeName(i)=="DBTYPE_DATE")
   {
  sw.Write(objReader.GetDateTime(i).ToString("d"));
   }
   else if (objReader.GetDataTypeName(i)=="DBTYPE_WVARCHAR")
   {
  sw.Write(objReader.GetString(i));
   }
  }
  if(i<5) sw.Write("\t");
 }
 sw.WriteLine();
}
sw.Flush(); // Write the buffered data to the filestream.

// Close the FileStream.
fs.Close();

// Close the reader and the connection.
objReader.Close();
objConn.Close();
  
上述代码没有使用“自动化”功能。不过,如果您愿意,您可以按如下方式使用“自动化”功能来打开文本文件,并以 Excel 工作簿格式保存该文件:

// Open the text file in Excel.
m_objExcel = new Excel.Application();
m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks;
m_objBooks.OpenText(m_strSampleFolder + "Book6.txt", Excel.XlPlatform.xlWindows, 1,
 Excel.XlTextParsingType.xlDelimited, Excel.XlTextQualifier.xlTextQualifierDoubleQuote,
 false, true, false, false, false, false, m_objOpt, m_objOpt,
 m_objOpt, m_objOpt, m_objOpt);

m_objBook = m_objExcel.ActiveWorkbook;

// Save the text file in the typical workbook format and quit Excel.
m_objBook.SaveAs(m_strSampleFolder + "Book6.xls", Excel.XlFileFormat.xlWorkbookNormal,
 m_objOpt, m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange, m_objOpt, m_objOpt, m_objOpt, m_objOpt);
m_objBook.Close(false, m_objOpt, m_objOpt);
m_objExcel.Quit();

使用 ADO.NET 将数据传输到工作表

您可以使用 Microsoft Jet OLE DB 提供程序向现有的 Excel 工作簿中的表中添加记录。Excel 中的表只是由单元格组成的区域;该区域可能具有定义的名称。通常,区域的第一行包含标题(或字段名),该区域中所有以后的行都包含记录。

下面的代码向 Book7.xls 中的表中添加了两个新记录。在此示例中,该表是 Sheet1:

// Establish a connection to the data source.
System.Data.OleDb.OleDbConnection objConn = new System.Data.OleDb.OleDbConnection(
 "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + m_strSampleFolder +
 "Book7.xls;Extended Properties=Excel 8.0;");
objConn.Open();

// Add two records to the table named 'MyTable'.
System.Data.OleDb.OleDbCommand objCmd = new System.Data.OleDb.OleDbCommand();
objCmd.Connection = objConn;
objCmd.CommandText = "Insert into MyTable (FirstName, LastName)" +
 " values ('Bill', 'Brown')";
objCmd.ExecuteNonQuery();
objCmd.CommandText = "Insert into MyTable (FirstName, LastName)" +
 " values ('Joe', 'Thomas')";
objCmd.ExecuteNonQuery();

// Close the connection.
objConn.Close();
  
当您按本示例所示的方法利用 ADO.NET 添加记录时,工作簿中的格式将被保持。添加到行中的每个记录都将继承它前面的行的格式。

有关使用 ADO.NET 的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
306636 (http://support.microsoft.com/kb/306636/) 如何使用 ADO.NET 2005 和 Visual C# 2005 或者 ADO.NET 和 Visual C# .NET 连接到数据库并运行命令
314145 (http://support.microsoft.com/kb/314145/) 如何使用 Visual C# .NET 从数据库填充 DataSet 对象
307587 (http://support.microsoft.com/kb/307587/) 如何使用 Visual C# 2005 或 Visual C# .NET 从 DataSet 对象更新数据库
有关如何将 Jet OLEDB 提供程序与 Excel 数据源一起使用的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章。
316934 (http://support.microsoft.com/kb/316934/) 如何在 Visual Basic .NET 中使用 ADO.NET 检索和修改 Excel 工作簿中的记录
278973 (http://support.microsoft.com/kb/278973/) ExcelADO 演示如何在 Excel 工作簿中使用 ADO 来读写数据
257819 (http://support.microsoft.com/kb/257819/) 如何在 Visual Basic 或 VBA 中使用 ADO 来处理 Excel 数据

传输 XML 数据(Excel 2002 和 Excel 2003)

Excel 2002 和 2003 可以打开格式完好的任何 XML 文件。您可以使用“文件”菜单上的“打开”命令直接打开 XML 文件,也可以使用“Workbooks”集合的“Open”或“OpenXML”方法以编程方式打开 XML 文件。如果您创建供在 Excel 中使用的 XML 文件,您还可以创建样式表来设置数据的格式。

有关如何将 XML 与 Excel 2002 一起使用的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
307029 (http://support.microsoft.com/kb/307029/) 如何使用 Visual C# 向 Microsoft Excel 2002 传输 XML 数据
288215 (http://support.microsoft.com/kb/288215/) INFO:Microsoft Excel 2002 和 XML

创建完整的示例 Visual C# .NET 项目

1. 创建一个名为 C:\ExcelData 的新文件夹。示例程序将在此文件夹中存储 Excel 工作簿。

2. 创建一个新工作簿,以供示例向其中写入数据:

a.  在 Excel 中启动一个新工作簿。
b.  在新工作簿的 Sheet1 上,在单元格 A1 中键入 FirstName,在单元格 B1 中键入 LastName。
c.  选择 A1:B1。
d.  在“插入”菜单上,指向“名称”,然后单击“定义”。键入名称 MyTable,然后单击“确定”。
e.  将该工作簿另存为 C:\Exceldata\Book7.xls。
f.  退出 Excel。
 
3. 启动 Microsoft Visual Studio 2005 或 Microsoft Visual Studio .NET。在“文件”菜单上,指向“新建”,然后单击“项目”。在“Visual C# 项目”或“Visual C#”下,选择“Windows 应用程序”。默认情况下会创建 Form1。

4. 添加对 Excel 对象库和 ADODB 主互操作程序集的引用。为此,请按照下列步骤操作:

a.  在“项目”菜单上,单击“添加引用”。
b.  在“NET”选项卡上,找到“ADODB”,然后单击“选择”。
c.  在“COM”选项卡上,找到“Microsoft Excel 10.0 对象库或 Microsoft Excel 11.0 对象库”,然后单击“选择”。

注意:在 Visual Studio 2005 中,您不需要单击“选择”。

注意:如果您正在使用 Microsoft Excel 2002,并且尚未这样做,Microsoft 建议您下载并安装 Microsoft Office XP 主互操作 程序集 (PIA)。有关 Office XP PIA 的更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
328912 (http://support.microsoft.com/kb/328912/) Microsoft Office XP主互操作程序集 (PIA) 可供下载

d.  在“添加引用”对话框中,单击“确定”以接受您的选择。
 
5. 向 Form1 中添加一个“Combo Box”控件和一个“Button”控件。

6. 为该窗体的“Load”事件和 Button 控件的“Click”事件添加事件处理程序:

a.  在 Form1.cs 的设计视图中,双击“Form1”。此时将创建该窗体的“Load”事件的处理程序,该处理程序出现在 Form1.cs 中。
b.  在“视图”菜单上,单击“设计器”以切换到设计视图。
c.  双击“Button1”。

此时将创建该按钮的“Click”事件的处理程序,该处理程序出现在 Form1.cs 中。