在本文中,将探讨如何使用J#语言通过COM自动化操作Excel 2003。将以.NET框架版本1.1(Visual Studio2003)为目标进行开发。
首先,打开Visual Studio并创建一个新的J# Windows应用程序。接下来,需要添加对"Microsoft Excel 11.0 Object Library"的引用。然后,向应用程序中添加一个按钮(Button)和一个图片框(PictureBox)控件。双击按钮以实现按钮处理程序。
在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。