使用 J# .NET 控制 Excel 2003 的简介






4.96/5 (15投票s)
2004年11月14日
4分钟阅读

143687

280
一篇关于如何使用 J# .NET 控制 MSFT Excel 2003 的文章
引言
在本文中,我们将重点介绍如何通过 COM 自动化使用 J# 语言控制 Microsoft Excel 2003。我们将目标定为 .NET 框架 1.1 版本(Visual Studio 2003)。
打开 Visual Studio 并选择一个新的 J# Windows 应用程序。
添加对“Microsoft Excel 11.0 Object Library”的引用。
向应用程序添加一个 Button
和一个 PictureBox
Win form 控件。单击 Button
两次以实现按钮处理程序。
应用程序实例
最重要的类是 application
、workbook
、worksheet
和 range
类。application
类表示带有工作簿的 Excel 应用程序。Workbook
包含带有单元格的 worksheet
。单元格可以用 range
表示。
要打开 Excel 实例,请输入
Microsoft.Office.Interop.Excel.ApplicationClass excel =
new Microsoft.Office.Interop.Excel.ApplicationClass();
这不会在桌面上显示 Excel,而是将其在后台运行。如果要使其在桌面上可见,请将以下属性设置为 true
。除了 Excel 将在桌面上可见之外,没有其他区别。这在调试时可能很有用。
excel.set_Visible( true );
如果要退出 Excel,请输入
excel.Quit();
一个非常重要的属性,可以使您的系统运行得更快,那就是在进行操作时禁用屏幕更新。在完成后启用屏幕更新非常重要。Excel 不会为您执行此操作。请记住在代码中切换屏幕更新,无论是否发生异常。
try
{
excel.set_ScreenUpdating( false );
// ... do excel operations here
}
finally
{
excel.set_ScreenUpdating( true );
}
另一个非常重要的属性是 alert
属性。此属性控制 Excel 是否显示警告对话框,例如,如果您在退出 Excel 前忘记保存工作簿时出现的“另存为”对话框。就像屏幕更新属性一样,alert
属性在您完成后也不会为您重置。
try
{
excel.set_DisplayAlerts( false );
// do excel operations here...
}
finally
{
excel.set_DisplayAlerts( true );
}
Excel 还有其他几个显示属性,您可能想了解一下。在 Visual Studio IDE 中,输入 excel.set_D
以显示所有属性。
如果您希望用户能够编辑工作簿,请执行以下命令
excel.set_UserControl( true );
工作簿
正如您可能已经发现的,没有工作簿您无法进行太多工作。工作簿集合使您可以打开新工作簿、保存工作簿以及执行其他重要操作。
打开新工作簿
要打开新工作簿,请执行以下操作
Microsoft.Office.Interop.Excel.Workbook workbook =
excel.get_Workbooks().Add(System.Reflection.Missing.Value );
关闭工作簿
当您想关闭工作簿时,请输入
workbook.Close(
System.Reflection.Missing.Value,
System.Reflection.Missing.Value,
System.Reflection.Missing.Value );
这将假定您不想保存对工作簿的任何更改。如果您对工作簿进行了任何更改,可以使用此命令关闭它并保存任何更改
workbook.Close( (System.Boolean)true, "C:\\test.xls",
System.Type.Missing );
请注意 Java 布尔类型的 .NET 装箱。第二个参数是文件名。
保存、另存为和另存为副本
要保存工作簿,只需调用
workbook.Save();
更高级的保存调用是 SaveAs
。此调用使您可以指定文件名和路径、文件格式、密码、文件访问模式等。此示例将工作簿以 Excel 格式保存在 C:\test.xls 中,无密码。
workbook.SaveAs( "c:\\test.xls",
Microsoft.Office.Interop.Excel.XlFileFormat.xlXMLSpreadsheet,
System.Reflection.Missing.Value,
System.Reflection.Missing.Value,
System.Reflection.Missing.Value,
System.Reflection.Missing.Value,
Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange,
System.Reflection.Missing.Value,
System.Reflection.Missing.Value,
System.Reflection.Missing.Value,
System.Reflection.Missing.Value,
System.Reflection.Missing.Value );
如果您想在不更改工作簿实例名称的情况下保存副本,只需执行 SaveCopyAs
调用
workbook.SaveCopyAs( "c:\\copy.xls" );
打印工作簿
我们有两个有用的打印方法:预览和打印。preview
方法将显示一个窗口,显示纸张的外观。print
方法将在打印机上打印工作簿中指定的页面。
preview
方法如下。请注意 Java 布尔值的 .NET 装箱。
workbook.PrintPreview( (System.Boolean)false );
如果您想打印工作簿
workbook.PrintOut( From page, To page, Copies, Preview,
ActivePrinter, PrintToFile, Collate, PrToFilename );
计算工作簿
有时通过一个命令计算所有工作簿很有用。这可以通过以下命令完成
excel.Calculate();
工作表
工作表包含单元格并位于工作簿内。您可以使用 get_Activesheet()
命令获取对活动工作表的引用。
Microsoft.Office.Interop.Excel.Worksheet sheet =
excel.get_ActiveSheet();
在单元格中填充数据
有许多方法可以填充工作表中的单元格。一种方法是使用二维数组。
示例一
要将数字 1 到 10 填充到 A1
到 J1
中,请执行以下操作
int values[,] = new int[1,10];
values[0,0] = 1;
values[0,1] = 2;
values[0,2] = 3;
values[0,3] = 4;
values[0,4] = 5;
values[0,5] = 6;
values[0,6] = 7;
values[0,7] = 8;
values[0,8] = 9;
values[0,9] = 10;
sheet.get_Range("A1", "J1").set_Value2( values );
示例二
代码将如下所示
int values[,] = new int[10,1];
values[0,0] = 1;
values[1,0] = 2;
values[2,0] = 3;
values[3,0] = 4;
values[4,0] = 5;
values[5,0] = 6;
values[6,0] = 7;
values[7,0] = 8;
values[8,0] = 9;
values[9,0] = 10;
sheet.get_Range("A1", "A10").set_Value2( values );
示例三
在此示例中,我们将创建一个 10x10 的工作表,其中包含一个文本标题和 10x9 的随机整数数组。
String headline[,] = new String[1,10];
headline[0,0] = new String("Dave");
headline[0,1] = new String("Tom");
headline[0,2] = new String("Thomas");
headline[0,3] = new String("Michael");
headline[0,4] = new String("Bob");
headline[0,5] = new String("John");
headline[0,6] = new String("Peter");
headline[0,7] = new String("Lars");
headline[0,8] = new String("Jay");
headline[0,9] = new String("Brian");
sheet.get_Range("A1", "J10").set_Value2( headline );
int value[,] = new int[9,10];
System.Random random = new System.Random( );
for( int counterA = 0; counterA < 9 ; counterA++ )
for( int counterB = 0; counterB < 10; counterB++ )
value[counterA, counterB] = random.Next(100);
sheet.get_Range("A2", "J10").set_Value2( value );
公式
此示例将对 A2 到 A10(B2 到 B10、C2 到 C10 等)中的所有数字进行求和,并将结果存储在 A11
(B11
、C11
等)中,文本为粗体。
Microsoft.Office.Interop.Excel.Font font =
sheet.get_Range("A11", "J11").get_Font();
font.set_Bold( (System.Boolean)true );
sheet.get_Range("A11", "J11").set_Formula("=SUM(A2..A10)");
Charts
图表对于以图形方式显示信息很有用。要打开新图表,请执行
Microsoft.Office.Interop.Excel.Chart chart =
(Microsoft.Office.Interop.Excel.Chart)excel.get_Charts().Add(
System.Reflection.Missing.Value,
System.Reflection.Missing.Value,
System.Reflection.Missing.Value,
System.Reflection.Missing.Value );
chart.ChartWizard( sheet.get_Range("A1", "J10"),
Microsoft.Office.Interop.Excel.XlChartType.xl3DColumn,
System.Reflection.Missing.Value,
Microsoft.Office.Interop.Excel.XlRowCol.xlRows,
System.Reflection.Missing.Value,
System.Reflection.Missing.Value,
System.Reflection.Missing.Value,
"Sales",
"Employee",
"Export in percent",
System.Reflection.Missing.Value );
使用以下命令将图表移动到工作表中
chart.Location( Microsoft.Office.Interop.Excel.XlChartLocation.xlLocationAsObject, sheet.get_Name() );
要在工作表中移动图表,请执行
sheet.get_Shapes().Item("Chart 1").set_Left( 2.10f );
sheet.get_Shapes().Item("Chart 1").set_Top( 150.0f );
使用以下命令调整图表大小
sheet.get_Shapes().Item("Chart 1").set_Width( 500.0f );
sheet.get_Shapes().Item("Chart 1").set_Height( 300.0f );
一个有趣的方法是 CopyPicture()
。此方法允许您复制工作表中的任何内容并将其存储在剪贴板上,例如,作为位图。此位图可以复制到任何 J# 项目中进行进一步处理和转换。
sheet.get_Shapes().Item("Chart 1").CopyPicture(
Microsoft.Office.Interop.Excel.XlPictureAppearance.xlScreen,
Microsoft.Office.Interop.Excel.XlCopyPictureFormat.xlBitmap );
如果您将 PictureBox
控件添加到应用程序中,您可以使用以下代码将图表粘贴到 J# 应用程序中
System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(
(System.Drawing.Image)Clipboard.GetDataObject().GetData(
System.Windows.Forms.DataFormats.Bitmap ));
this.pictureBox1.set_Image( bitmap );