使用J#语言通过COM自动化操作Excel 2003

在本文中,将探讨如何使用J#语言通过COM自动化操作Excel 2003。将以.NET框架版本1.1(Visual Studio2003)为目标进行开发。

创建J# Windows应用程序

首先,打开Visual Studio并创建一个新的J# Windows应用程序。接下来,需要添加对"Microsoft Excel 11.0 Object Library"的引用。然后,向应用程序中添加一个按钮(Button)和一个图片框(PictureBox)控件。双击按钮以实现按钮处理程序。

实例化Excel应用程序

在J#中,最重要的类包括Application、Workbook、Worksheet和Range。Application类代表包含工作簿的Excel应用程序。Workbook包含Worksheet,而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); // ... 在这里执行Excel操作 } finally { excel.set_ScreenUpdating(true); }

另一个非常重要的属性是alert属性。这个属性控制Excel是否应该显示警告对话框,比如如果在退出Excel之前忘记保存工作簿时的“另存为”对话框。就像屏幕更新属性一样,alert属性在操作完成后不会为重置这个属性。

try { excel.set_DisplayAlerts(false); // 在这里执行Excel操作... } finally { excel.set_DisplayAlerts(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);

请注意.NET对Java布尔类型的装箱。第二个参数是文件名。

保存、另存为和另存为副本

要保存工作簿,只需调用:

workbook.Save();

一个更高级的保存调用是SaveAs。这个调用使能够指定文件名和路径、文件格式、密码、文件访问模式等。以下示例将工作簿保存在C:\test.xls作为Excel格式,没有密码。

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");

打印工作簿

有两个有用的方法来打印:预览和打印。预览方法将显示纸张的外观。打印方法将在打印机上打印工作簿中指定的页面。

预览方法如下。请注意.NET对Java布尔类型的装箱。

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();

填充单元格数据有很多方法。一种方法是使用二维数组。

示例一:

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);

示例三:

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)");

图表

图表对于以图形方式显示信息非常有用。要打开一个新的图表,请执行以下操作:

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);

使用ChartWizard方法:

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);

MSDN。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485