- 浏览: 281724 次
- 性别:
- 来自: 武汉
文章分类
- 全部博客 (75)
- Extjs (9)
- Java (27)
- 幽默人生 (2)
- IT新闻 (0)
- Extjs4 (5)
- DB2 (1)
- JQuery (3)
- Myeclipse (2)
- Android (3)
- JSON (2)
- Perl (1)
- Javascript json (1)
- Sping (3)
- Struts2 (2)
- HTML (3)
- SQL (1)
- Spring (2)
- Flash builder4.5 (0)
- Hibernate (2)
- Javascript FusionCharts (0)
- FusionCharts (1)
- Javascript (2)
- CSS (1)
- 刷机 (1)
- 数据库 (3)
- 测试 (1)
- Java解惑 (1)
- Oracle (1)
- Ubuntu (3)
- JDK7 (1)
- eclipse (1)
- tomcat (1)
- gis (0)
- arcgis (1)
最新评论
-
hshyy2005:
赞赞赞!!!
Could not load the Tomcat server configuration at /Servers/Tomcat v7.0 Server at -
Butterfeild:
有效果!但是颜色貌似改不了
Extjs中Ext.grid.GridPanel stripeRows斑马纹 没效果 失效 解决办法 -
lliiqiang:
用户不是程序员,行为要被强制引导.
Web安全 -
lliiqiang:
动态的东西不容易分析,服务器动态容易被攻击漏洞。动态处理仅仅是 ...
Web安全 -
jingyemingyue:
砺雪凝霜 写道 没用啊那你可以试试Aptana这个软件,他也有 ...
spket对Extjs4的支持方法 eclipse插件spket安装 extjs4 提示
Java中使用JCOM操作Office对象
通过使用COM技术,我们用微软Office应用程序能够建立很多应用程序扩展,但是Java开发人员却无法享受它带来的便利--除非他们拥有方便的Java访问COM的途径(Java-to-COM桥)。使用JCom的时候,你可以在Java中控制几乎所有的COM对象,而且它还带有一些用于Excel的强大的辅助类。
在你每次编写用HTML表格样式或Java表格对象显示数据的应用程序的时候,通常都需要带有"导出到Excel"功能。那么头疼的问题就出现了。怎么样实现这种功能呢?在HTML中显示的可以在Office 2003中处理吗?没有这么好!你还必须支持Office 97!
你只能去找一个符合当前需求的工具了,但是接着收到更多的要求了。"这能在Word中做到吗?Powerpoint能做到吗?能不能用调制解调器拨号到远程服务器上并发布数据?Java无法实现这些功能是什么意思啊?Java可以实现任何功能。"
感谢作为Java和COM桥梁的框架组件,它使你在遇到这些情况的时候都可以回答"Yes"。Java-COM桥梁使你能够根据自己的需要操作Windows组件--以前这是VB、C++和.NET开发人员的领地。你通过实现一个与DCOM后端(back end)对话的Java前端(front end),可以远离端对端(end-to-end)的COM系统。在本文的末尾,你可以使用其中一个Java-to-COM桥:它可以被命名为JCom。
Excel基础知识
开始之前,你需要首先从Sourceforge网站下载API。它包含了JCom所使用的Java类的所有源代码、C++代码和JCom用于配置Java和COM的编译好的DLL。把这个DLL放到你的Java主目录的/bin/目录下面,否则会出现问题。同时,为了不出现问题,还要正确地设置JAVA_HOME环境变量。JCom的大多数文档目前都是用日语写的,但是翻译工作正在进行中,因此以后会有些改进的。
下载和安装过程完成以后,用列表1中的代码试一试。这段代码会建立到Excel的JCom接口,并把"Hello World"写入第一个单元格中。你可以看到如图1所示的结果。尽管JCom是一个通用的COM类库,但是还是带有很多用于Excel的辅助类,这是因为Excel可能是最常用的自动化COM应用程序。这些辅助类可以为我们节省很多时间,它们使JCOM成为一个更好的类库了。
列表1:开始使用JCOM和Excel
import jp.ne.so_net.ga2.no_ji.jcom.excel8.*;
import jp.ne.so_net.ga2.no_ji.jcom.*;
public class testSimple
{
public static void main(String[] args) throws Exception {
ReleaseManager rm = new ReleaseManager();
try {
System.out.println("EXCEL is Starting...");
ExcelApplication excel = new ExcelApplication(rm);
excel.Visible(true);
ExcelWorkbooks xlBooks = excel.Workbooks();
ExcelWorkbook xlBook = xlBooks.Add();
ExcelWorksheets xlSheets = xlBook.Worksheets();
ExcelWorksheet xlSheet = xlSheets.Item(1);
ExcelRange xlRange = xlSheet.Cells();
xlRange.Item(1,1).Value("Hello, World!" );
}
catch(Exception e) { e.printStackTrace(); }
finally { rm.release(); }
}
}
图1:Java中使用Excel的第一个COM自动化
如果曾经使用VB或VBA来自动化Excel,那么你应该很熟悉列表1中的代码了。ExcelApplication类暴露了Workbooks()属性,它列举出Excel中当前打开的工作薄(workbook),并允许你向运行的Excel副本增加或删除工作薄。使用.Add()方法增加工作薄,这个方法会返回一个工作薄的引用。
在Excel中工作薄用于保存输入的数据。工作薄是XLS文件的基础。一个工作薄由多个工作表(worksheet,在图1中有三个工作表,分别叫做Sheet1、Sheet2和Sheet3)。工作表通过Item属性来枚举。你可以使用这个属性访问特定的工作表。在图1中,Sheet 1是第一个工作表,因此你可以使用xlSheets.Item(1)来获取对它的引用。
有了工作表之后,你就可以使用range(范围)来操作它上面的数据。Range是一个单元格或多个单元格。例如,单元格A1可以使用range (1,1)来引用,接着可以使用Value属性把数据载入单元格中。
更有意义的例子
假设你希望把Excel作为数据库中某些数据的表现层。在Java中你希望通过JDBC获取数据,并把数据显示在Excel前端。这种假设是很好的,因为复杂业务逻辑中的用例(use case)已经用Excel前端显示了,更不用说工作流中的其它的数据项的显示和交互操作了。现在你不需要了解业务逻辑或分析,就可以使用原始的电子表格,并使用Java中的自动化来"填充它们之间的裂痕"。
我将给出一个演示这种操作的简单示例:本文下载中所包含的内容是建立比较销售行为的一个简单的MySQL数据库的。它有三个表:
· Sales是销售的细节信息,包括销售项、数量、销售价格、是谁销售的以及销售地区。
· People包含销售人员的姓名和佣金。
· Districts包含了销售地区的名称和税率。
生成报表的时候,你需要使用下面的业务逻辑来算出真正的数值:
· 毛销售额等于销售项乘以销售价格加上地税金额。
· 纯销售额等于毛销售额减去销售人员提取的税前佣金。
这都是一些在Java中可以实现的简单直接的计算过程,但是我在本文中使用它们的目的是演示如何把这些数据写入Excel电子表格并让Excel自动计算。对于更复杂的情况(使用了更复杂的Excel公式),原理也是一样的。
此外,下载的内容中还包含了如图2所示的电子表格。它是作为"模板"供你填充适当的数据的电子表格。
图2:用于前端填充数据的Excel模板
使用JCOM的时候,查询数据库中所有销售数据需要使用下面的SQL:
SELECT sales.id, sales.description, sales.quantity, sales.price, districts.districtname,districts.salestax,people.name,people.commission
FROM 'sales','districts','people'
WHERE (sales.district = districts.id) AND (sales.salesperson = people.id)
接着使用自动化(automation)把每条记录都写入Excel电子表格的适当的列中。下载的内容中包含了完整的代码(列表2所示)。在下面的部分,我将为你解释代码中使用JCOM的自动化部分。
列表2:从数据库中获取数据并载入Excel中的代码
// 首先建立Excel的引用
ExcelApplication excel = new ExcelApplication(rm);
// 使它可视
excel.Visible(true);
// 接着打开我们将使用的模板工作薄
ExcelWorkbooks xlBooks = excel.Workbooks();
ExcelWorkbook xlBook = xlBooks.Open("c:\\sales.xls");
// 接着获取我们将修改的范围的引用
ExcelWorksheets xlSheets = xlBook.Worksheets();
ExcelWorksheet xlSheet = xlSheets.Item(1);
ExcelRange xlRange = xlSheet.Cells();
…
// 此处放置数据库链接和查询建立代码
…
if (stmt.execute(strSql))
{
rs = stmt.getResultSet();
}
int nColCount = rs.getMetaData().getColumnCount();
int nRow=1;
int nCol=0;
// 在记录集中循环
while(rs.next())
{
// 记录集中的每行都是电子表格中的一行
nRow++;
for(int i=1;i<=nColCount;i++)
{
// 匹配DB列和电子表格列
nCol = getExcelColumn(i);
// 查找于行和列对应的单元格,并把它设置为适当的记录集字段
xlRange.Item(nRow,nCol).Value(rs.getObject(i).toString());
}
// 填入公式
xlRange.Item(nRow,7).Value("=RC[-2]*RC[-1]");
xlRange.Item(nRow,9).Value("=RC[-2]*RC[-1]/100");
xlRange.Item(nRow,10).Value("=RC[-3]+RC[-1]");
xlRange.Item(nRow,11).Value("=RC[-4]*((100-RC[2])/100)");
}
在列表2的第一部分中,其目标是获取希望修改的单元格的控制权。这会花费了一定的开销。
· 首先你必须获取表现Excel本身的对象,有了JCOM辅助类的帮助以后,这一步操作相当直接。
ExcelApplication excel = new ExcelApplication(rm);
· 下一步,你希望获取对工作薄集合的访问权。你希望打开自己的模板工作薄(本示例中这个模板在C:\sales.xls中),在工作薄集合中打开它。
ExcelWorkbooks xlBooks = excel.Workbooks();
· 下一步,你希望打开自己的工作薄并获取该工作薄集合的引用。
ExcelWorkbook xlBook = xlBooks.Open("c:\\sales.xls");
ExcelWorksheets xlSheets = xlBook.Worksheets();
· 最后,你希望获取集合中的第一个工作表,并把工作范围定义为整个工作表。
ExcelWorksheet xlSheet = xlSheets.Item(1);
ExcelRange xlRange = xlSheet.Cells();
完成这些工作以后,你的xlRange对象将允许你在单元中放入值和公式了。通过在前面的记录集(从提交给数据库的SQL命令中返回的)中循环,使用xlRange.Item(nRow,nCol).Value("whatever")语法,逐行逐列地把记录集中的值插入到电子表格中(语法中的whatever来自于记录集)。通过使用rs.getObject(i).toString可以得到当前行中I列的值。通过使用rs.movenext(),当前行一直向后移动,直到记录集的末尾。
你在列表2中可能会注意到一个奇怪的函数调用:
nCol = getExcelColumn(i);
这是一个简单的辅助函数,它把记录集中的列编号与Excel中存放数据的位置进行匹配。例如,如果你再次查看上面的SQL语句,佣金费率将返回到第8列。在电子表格中,存放它的列是第13列。这个函数用于处理两者之间的转换。更复杂的应用程序可以使用Excel中的命名(named)范围来匹配列,但是这超出了本文的范围。
最后,应用程序把公式输入适当的单元中。它是使用Excel的R1C1符号来实现的,因此相应的字符串是用于描述公式的。在Excel中,假设你希望把第1行中A列的值与B列的值相加,然后放到C列中,那么你就需要在C列中输入公式"=A1+B1"。如果在第二行你也希望这样操作,那么可以复制和粘贴这个公式,它会自动地更新为"=A2+B2"。
从示例程序中得到这些值需要一些字符串操作,但是如果使用"R1C1"相关的转换就非常直接了。在本文的例子中,你在C1中输入公式的时候,不需要给出"=A1+B1"引用,而是给出"=RC[-2]+RC[-1]"引用,它的意思是把向前两列的值与向前一列的值相加。
当你移动了其它行的时候,这个公式的值不会发生改变,因此它使我们生成程序所需要的值非常简单了。这也是我用于计算总销售额、销售税金、毛销售额和纯销售额的方法,如下所示:
xlRange.Item(nRow,7).Value("=RC[-2]*RC[-1]");
xlRange.Item(nRow,9).Value("=RC[-2]*RC[-1]/100");
xlRange.Item(nRow,10).Value("=RC[-3]+RC[-1]");
xlRange.Item(nRow,11).Value("=RC[-4]*((100-RC[2])/100)");
运行这段代码将得到图3所示的电子表格。
图3:公式:Excel显示了数据库查询的输出信息
请注意,这是一种比较好的工程学经验,即不要在应用程序中包含公式,因为公式可能随时改变,而你肯定不希望在改变公式的时候就去改变自己的代码。这种办法使每个新数据行成为包含公式的已有数据行的副本。模板电子表格(sales.xls)包含了假数据,并在第二列中包含了公式(第一列包含了列标题)。因此,当你填充每行的时候,在你填入数据库值的之前线复制这一行的内容。通过这种办法,公式通过复制进入了新数据行,并且你不需要在Java代码中包含任何业务逻辑。
我们看一看salesReport2.java文件(也在下载内容中)中的内容,你可以发现,我们并没有使用前面所说的公式,而是在While循环顶部使用了下面的代码:
if(nRow>1)
{
String strDest="A"+(nRow+1);
ExcelRange xlRange2Copy = xlSheet.Range("A2:M2");
xlRange2Copy.Copy(xlSheet.Range(strDest));
}
除了第一行之外(第一行不需要处理,这样的信息已经包含在sales.xls中了),这段代码将处理A2到M2之间的单元,并把它们复制到nRow+1标识的数据行中(nRow是当前行的编号)。加上1的原因是计算了列标题(列标题在第一行)。
超越Excel
请记住JCOM是用于COM的而不仅仅是用于Excel的。你可以使用这种工具在Java中控制几乎所有的COM对象。Excel是最常见的被控制对象,因为有很多很好的辅助类可以让它更简单,但是所有的COM组件都是可以使用的。因此控制其它的应用程序(例如Word和Powerpoint)也是直接的。
下面是使用Word的一个例子:
IDispatch wdApp = new IDispatch(rm, "Word.Application");
wdApp.put("Visible", new Boolean(true));
由于没有用于Word的直接的辅助类,每个部分都必须通过使用IDispatch对象来实现(用于Excel的下层辅助类也是这样实现的)。上面的代码将载入微软Word副本,并通过wdApp对象使它可以自动化操作。接着你可以使用类似"put"(设置属性)或"method"(调用方法)等方法来使用Word。例如,上面的代码把Visible属性设置为true,使得该Word应用程序可视。
如果你一定要使用Windows,那么有大量的COM组件可以扩充你的视野,它的数量比Java目前提供的多很多。通过串行和并行口进行硬件控制也可以在Java中实现了,而这仅仅是个开始。在你的工具包中有了JCOM之后,就不受任何限制了。
通过使用COM技术,我们用微软Office应用程序能够建立很多应用程序扩展,但是Java开发人员却无法享受它带来的便利--除非他们拥有方便的Java访问COM的途径(Java-to-COM桥)。使用JCom的时候,你可以在Java中控制几乎所有的COM对象,而且它还带有一些用于Excel的强大的辅助类。
在你每次编写用HTML表格样式或Java表格对象显示数据的应用程序的时候,通常都需要带有"导出到Excel"功能。那么头疼的问题就出现了。怎么样实现这种功能呢?在HTML中显示的可以在Office 2003中处理吗?没有这么好!你还必须支持Office 97!
你只能去找一个符合当前需求的工具了,但是接着收到更多的要求了。"这能在Word中做到吗?Powerpoint能做到吗?能不能用调制解调器拨号到远程服务器上并发布数据?Java无法实现这些功能是什么意思啊?Java可以实现任何功能。"
感谢作为Java和COM桥梁的框架组件,它使你在遇到这些情况的时候都可以回答"Yes"。Java-COM桥梁使你能够根据自己的需要操作Windows组件--以前这是VB、C++和.NET开发人员的领地。你通过实现一个与DCOM后端(back end)对话的Java前端(front end),可以远离端对端(end-to-end)的COM系统。在本文的末尾,你可以使用其中一个Java-to-COM桥:它可以被命名为JCom。
Excel基础知识
开始之前,你需要首先从Sourceforge网站下载API。它包含了JCom所使用的Java类的所有源代码、C++代码和JCom用于配置Java和COM的编译好的DLL。把这个DLL放到你的Java主目录的/bin/目录下面,否则会出现问题。同时,为了不出现问题,还要正确地设置JAVA_HOME环境变量。JCom的大多数文档目前都是用日语写的,但是翻译工作正在进行中,因此以后会有些改进的。
下载和安装过程完成以后,用列表1中的代码试一试。这段代码会建立到Excel的JCom接口,并把"Hello World"写入第一个单元格中。你可以看到如图1所示的结果。尽管JCom是一个通用的COM类库,但是还是带有很多用于Excel的辅助类,这是因为Excel可能是最常用的自动化COM应用程序。这些辅助类可以为我们节省很多时间,它们使JCOM成为一个更好的类库了。
列表1:开始使用JCOM和Excel
import jp.ne.so_net.ga2.no_ji.jcom.excel8.*;
import jp.ne.so_net.ga2.no_ji.jcom.*;
public class testSimple
{
public static void main(String[] args) throws Exception {
ReleaseManager rm = new ReleaseManager();
try {
System.out.println("EXCEL is Starting...");
ExcelApplication excel = new ExcelApplication(rm);
excel.Visible(true);
ExcelWorkbooks xlBooks = excel.Workbooks();
ExcelWorkbook xlBook = xlBooks.Add();
ExcelWorksheets xlSheets = xlBook.Worksheets();
ExcelWorksheet xlSheet = xlSheets.Item(1);
ExcelRange xlRange = xlSheet.Cells();
xlRange.Item(1,1).Value("Hello, World!" );
}
catch(Exception e) { e.printStackTrace(); }
finally { rm.release(); }
}
}
图1:Java中使用Excel的第一个COM自动化
如果曾经使用VB或VBA来自动化Excel,那么你应该很熟悉列表1中的代码了。ExcelApplication类暴露了Workbooks()属性,它列举出Excel中当前打开的工作薄(workbook),并允许你向运行的Excel副本增加或删除工作薄。使用.Add()方法增加工作薄,这个方法会返回一个工作薄的引用。
在Excel中工作薄用于保存输入的数据。工作薄是XLS文件的基础。一个工作薄由多个工作表(worksheet,在图1中有三个工作表,分别叫做Sheet1、Sheet2和Sheet3)。工作表通过Item属性来枚举。你可以使用这个属性访问特定的工作表。在图1中,Sheet 1是第一个工作表,因此你可以使用xlSheets.Item(1)来获取对它的引用。
有了工作表之后,你就可以使用range(范围)来操作它上面的数据。Range是一个单元格或多个单元格。例如,单元格A1可以使用range (1,1)来引用,接着可以使用Value属性把数据载入单元格中。
更有意义的例子
假设你希望把Excel作为数据库中某些数据的表现层。在Java中你希望通过JDBC获取数据,并把数据显示在Excel前端。这种假设是很好的,因为复杂业务逻辑中的用例(use case)已经用Excel前端显示了,更不用说工作流中的其它的数据项的显示和交互操作了。现在你不需要了解业务逻辑或分析,就可以使用原始的电子表格,并使用Java中的自动化来"填充它们之间的裂痕"。
我将给出一个演示这种操作的简单示例:本文下载中所包含的内容是建立比较销售行为的一个简单的MySQL数据库的。它有三个表:
· Sales是销售的细节信息,包括销售项、数量、销售价格、是谁销售的以及销售地区。
· People包含销售人员的姓名和佣金。
· Districts包含了销售地区的名称和税率。
生成报表的时候,你需要使用下面的业务逻辑来算出真正的数值:
· 毛销售额等于销售项乘以销售价格加上地税金额。
· 纯销售额等于毛销售额减去销售人员提取的税前佣金。
这都是一些在Java中可以实现的简单直接的计算过程,但是我在本文中使用它们的目的是演示如何把这些数据写入Excel电子表格并让Excel自动计算。对于更复杂的情况(使用了更复杂的Excel公式),原理也是一样的。
此外,下载的内容中还包含了如图2所示的电子表格。它是作为"模板"供你填充适当的数据的电子表格。
图2:用于前端填充数据的Excel模板
使用JCOM的时候,查询数据库中所有销售数据需要使用下面的SQL:
SELECT sales.id, sales.description, sales.quantity, sales.price, districts.districtname,districts.salestax,people.name,people.commission
FROM 'sales','districts','people'
WHERE (sales.district = districts.id) AND (sales.salesperson = people.id)
接着使用自动化(automation)把每条记录都写入Excel电子表格的适当的列中。下载的内容中包含了完整的代码(列表2所示)。在下面的部分,我将为你解释代码中使用JCOM的自动化部分。
列表2:从数据库中获取数据并载入Excel中的代码
// 首先建立Excel的引用
ExcelApplication excel = new ExcelApplication(rm);
// 使它可视
excel.Visible(true);
// 接着打开我们将使用的模板工作薄
ExcelWorkbooks xlBooks = excel.Workbooks();
ExcelWorkbook xlBook = xlBooks.Open("c:\\sales.xls");
// 接着获取我们将修改的范围的引用
ExcelWorksheets xlSheets = xlBook.Worksheets();
ExcelWorksheet xlSheet = xlSheets.Item(1);
ExcelRange xlRange = xlSheet.Cells();
…
// 此处放置数据库链接和查询建立代码
…
if (stmt.execute(strSql))
{
rs = stmt.getResultSet();
}
int nColCount = rs.getMetaData().getColumnCount();
int nRow=1;
int nCol=0;
// 在记录集中循环
while(rs.next())
{
// 记录集中的每行都是电子表格中的一行
nRow++;
for(int i=1;i<=nColCount;i++)
{
// 匹配DB列和电子表格列
nCol = getExcelColumn(i);
// 查找于行和列对应的单元格,并把它设置为适当的记录集字段
xlRange.Item(nRow,nCol).Value(rs.getObject(i).toString());
}
// 填入公式
xlRange.Item(nRow,7).Value("=RC[-2]*RC[-1]");
xlRange.Item(nRow,9).Value("=RC[-2]*RC[-1]/100");
xlRange.Item(nRow,10).Value("=RC[-3]+RC[-1]");
xlRange.Item(nRow,11).Value("=RC[-4]*((100-RC[2])/100)");
}
在列表2的第一部分中,其目标是获取希望修改的单元格的控制权。这会花费了一定的开销。
· 首先你必须获取表现Excel本身的对象,有了JCOM辅助类的帮助以后,这一步操作相当直接。
ExcelApplication excel = new ExcelApplication(rm);
· 下一步,你希望获取对工作薄集合的访问权。你希望打开自己的模板工作薄(本示例中这个模板在C:\sales.xls中),在工作薄集合中打开它。
ExcelWorkbooks xlBooks = excel.Workbooks();
· 下一步,你希望打开自己的工作薄并获取该工作薄集合的引用。
ExcelWorkbook xlBook = xlBooks.Open("c:\\sales.xls");
ExcelWorksheets xlSheets = xlBook.Worksheets();
· 最后,你希望获取集合中的第一个工作表,并把工作范围定义为整个工作表。
ExcelWorksheet xlSheet = xlSheets.Item(1);
ExcelRange xlRange = xlSheet.Cells();
完成这些工作以后,你的xlRange对象将允许你在单元中放入值和公式了。通过在前面的记录集(从提交给数据库的SQL命令中返回的)中循环,使用xlRange.Item(nRow,nCol).Value("whatever")语法,逐行逐列地把记录集中的值插入到电子表格中(语法中的whatever来自于记录集)。通过使用rs.getObject(i).toString可以得到当前行中I列的值。通过使用rs.movenext(),当前行一直向后移动,直到记录集的末尾。
你在列表2中可能会注意到一个奇怪的函数调用:
nCol = getExcelColumn(i);
这是一个简单的辅助函数,它把记录集中的列编号与Excel中存放数据的位置进行匹配。例如,如果你再次查看上面的SQL语句,佣金费率将返回到第8列。在电子表格中,存放它的列是第13列。这个函数用于处理两者之间的转换。更复杂的应用程序可以使用Excel中的命名(named)范围来匹配列,但是这超出了本文的范围。
最后,应用程序把公式输入适当的单元中。它是使用Excel的R1C1符号来实现的,因此相应的字符串是用于描述公式的。在Excel中,假设你希望把第1行中A列的值与B列的值相加,然后放到C列中,那么你就需要在C列中输入公式"=A1+B1"。如果在第二行你也希望这样操作,那么可以复制和粘贴这个公式,它会自动地更新为"=A2+B2"。
从示例程序中得到这些值需要一些字符串操作,但是如果使用"R1C1"相关的转换就非常直接了。在本文的例子中,你在C1中输入公式的时候,不需要给出"=A1+B1"引用,而是给出"=RC[-2]+RC[-1]"引用,它的意思是把向前两列的值与向前一列的值相加。
当你移动了其它行的时候,这个公式的值不会发生改变,因此它使我们生成程序所需要的值非常简单了。这也是我用于计算总销售额、销售税金、毛销售额和纯销售额的方法,如下所示:
xlRange.Item(nRow,7).Value("=RC[-2]*RC[-1]");
xlRange.Item(nRow,9).Value("=RC[-2]*RC[-1]/100");
xlRange.Item(nRow,10).Value("=RC[-3]+RC[-1]");
xlRange.Item(nRow,11).Value("=RC[-4]*((100-RC[2])/100)");
运行这段代码将得到图3所示的电子表格。
图3:公式:Excel显示了数据库查询的输出信息
请注意,这是一种比较好的工程学经验,即不要在应用程序中包含公式,因为公式可能随时改变,而你肯定不希望在改变公式的时候就去改变自己的代码。这种办法使每个新数据行成为包含公式的已有数据行的副本。模板电子表格(sales.xls)包含了假数据,并在第二列中包含了公式(第一列包含了列标题)。因此,当你填充每行的时候,在你填入数据库值的之前线复制这一行的内容。通过这种办法,公式通过复制进入了新数据行,并且你不需要在Java代码中包含任何业务逻辑。
我们看一看salesReport2.java文件(也在下载内容中)中的内容,你可以发现,我们并没有使用前面所说的公式,而是在While循环顶部使用了下面的代码:
if(nRow>1)
{
String strDest="A"+(nRow+1);
ExcelRange xlRange2Copy = xlSheet.Range("A2:M2");
xlRange2Copy.Copy(xlSheet.Range(strDest));
}
除了第一行之外(第一行不需要处理,这样的信息已经包含在sales.xls中了),这段代码将处理A2到M2之间的单元,并把它们复制到nRow+1标识的数据行中(nRow是当前行的编号)。加上1的原因是计算了列标题(列标题在第一行)。
超越Excel
请记住JCOM是用于COM的而不仅仅是用于Excel的。你可以使用这种工具在Java中控制几乎所有的COM对象。Excel是最常见的被控制对象,因为有很多很好的辅助类可以让它更简单,但是所有的COM组件都是可以使用的。因此控制其它的应用程序(例如Word和Powerpoint)也是直接的。
下面是使用Word的一个例子:
IDispatch wdApp = new IDispatch(rm, "Word.Application");
wdApp.put("Visible", new Boolean(true));
由于没有用于Word的直接的辅助类,每个部分都必须通过使用IDispatch对象来实现(用于Excel的下层辅助类也是这样实现的)。上面的代码将载入微软Word副本,并通过wdApp对象使它可以自动化操作。接着你可以使用类似"put"(设置属性)或"method"(调用方法)等方法来使用Word。例如,上面的代码把Visible属性设置为true,使得该Word应用程序可视。
如果你一定要使用Windows,那么有大量的COM组件可以扩充你的视野,它的数量比Java目前提供的多很多。通过串行和并行口进行硬件控制也可以在Java中实现了,而这仅仅是个开始。在你的工具包中有了JCOM之后,就不受任何限制了。
发表评论
-
hibernate-------could not instantiate id generator
2012-09-27 11:24 6134今天用Hibernate操作Mssql20 ... -
两种单例模式比较
2012-05-18 14:18 1297第一种: public class Test { ... -
MyEclipse Update Progress Error现象
2012-05-17 15:31 1220设置 Window->Prefrences->Ge ... -
Java内存模式
2012-04-10 14:49 949http://blog.csdn.net/intlgj/art ... -
Java解惑II
2012-02-27 10:42 1127public class Test { ... -
java.sql.SQLException: Listener refused the connection with the following error:
2012-02-23 11:10 15198java.sql.SQLException: Listener ... -
logback中文手册
2012-02-16 10:34 2546Logback是由log4j创始人设计的又一个开源日志组件。l ... -
使用logback替换原有项目中的log4j
2012-02-07 11:04 1829据说logback性能比较高,故想替换以前项目中的log4j, ... -
在Java中使用无符号整型
2012-01-31 09:37 9776在项目要使用无符号整型,可以在项目中加入joou. ... -
Java学习笔记之序列化
2012-01-30 15:11 984用static或者transient ... -
Java性能分析工具
2012-01-30 10:27 1119分享三款Java性能分析工具: 1.JProfiler ... -
Java内存小解
2011-12-26 17:25 949java中堆和堆栈的区别 1.栈(stack)与堆(he ... -
EL表达式 三目运算符在不同版本Tomcat中的表现
2011-12-14 13:50 3752我在JSP页面中使用了EL表达 式${param. ... -
Java反射实现类似Hibernate的通用增删改查
2011-10-31 22:48 1495package com.zsw.util.service; ... -
map的三种遍历方法
2011-09-20 16:16 938集合的一个很重要的操作---遍历,学习了三种遍历方法,三种方 ... -
Java文件下载的几种方式
2011-09-15 08:56 29889public HttpServletResponse dow ... -
Hibernate属性配置
2011-09-07 11:51 1310引用 Hibernate 配置属性 Hibern ... -
关于struts.enable.DynamicMethodInvocation = true
2011-09-05 10:26 2373关于struts.enable.DynamicMethodI ... -
Java创建Web监听
2011-08-31 15:31 1218Java提供一些Servlet监听器,用于监听一些重要事件的发 ... -
<s:action />参数及URLRewriter重写地址后被包含后的jsp中链接问题
2011-07-28 10:37 11821:<s:action />在使用时的参数说明&l ...
相关推荐
接下来,我们讨论Java中使用JCOM操作Office对象。JCOM(Java COM桥接)允许Java应用程序调用COM组件,从而与Office应用程序交互。例如,你可以使用它来自动化Word、Excel或PowerPoint的任务。但需要注意,JCOM依赖于...
JCOM库是一种常用的Java组件,它提供了与Microsoft Office进行交互的能力,包括读取、写入和打印Excel文件。在这个压缩包中,你可能会找到使用JCOM进行Excel打印的具体实现代码。 首先,我们需要理解Java中打印的...
"Jcom转换office为pdf"这个主题涉及到的是如何使用Java库JCom来实现将Microsoft Office格式的文件(如Word、Excel、PowerPoint)转换成PDF格式。这种转换在多种场景下都是必要的,比如保证文档在不同平台和设备上的...
**正文** JCom是一个关键的库,它在Java和Component Object ...在使用JCom时,开发者应熟悉COM的基本概念,理解如何通过Java代码创建和操作COM对象,以及如何处理可能出现的异常情况,以确保程序的稳定性和可靠性。
在Java应用程序中,如果我们需要对Word文档或Excel表格进行打印操作,而直接使用Java内置的打印API可能无法满足复杂的格式需求,这时候JCom提供了一个方便的解决方案。 JCom库的工作原理是通过Java的JNI(Java ...
在Java中,直接操作Microsoft Office文件,如Excel,通常需要借助第三方库或API,因为Java的标准库并不直接支持这种操作。`jcom.dll` 可能是实现了这样的接口,允许Java代码通过JNI(Java Native Interface)来调用...
总结起来,JCom是Java与COM集成的关键技术,它简化了跨平台语言之间的互操作性,使得开发者能够在Java环境中充分利用COM组件的强大功能。对于那些需要与Windows生态系统深度集成的Java项目,JCom是一个不可或缺的...
在IT行业中,转换Office文档为PDF格式是一种常见的需求,尤其在跨平台兼容性和长期存储时。本主题聚焦于使用Jcom调用JNI技术来实现这一转换。以下是对这个过程的详细解析: 首先,理解几个核心概念: 1. **Jcom**...
接下来,让我们探讨如何在Java中使用`jcom`写入Excel。以下是一个基本步骤概述: 1. **初始化Excel对象**:首先,需要创建一个`IDispatch`对象,代表Excel应用程序实例。这通常通过`JComDispatch.createInstance`...
- **与Office应用程序交互**:JAVA程序可以通过JCOM调用Word、Excel等Office组件,实现文档的生成、编辑等功能。 - **集成第三方控件**:许多Windows平台的控件是基于COM的,JCOM可以帮助JAVA程序集成这些控件,提升...
2. **创建COM对象**:在Java代码中,使用JCom提供的API创建COM对象的实例。 3. **调用方法和属性**:通过JCom的接口,可以像操作Java对象一样调用COM对象的方法和访问其属性。 4. **事件处理**:JCom还支持COM事件的...
1. **Java Native Interface (JNI)**:`jcom`和`jawin`都可能使用了JNI技术,这是一种让Java代码调用本地(操作系统特定)代码的机制。通过JNI,Java应用程序可以调用C/C++编写的COM接口。 2. **COM组件理解**:...
在Java中,我们可以借助Apache POI库来实现对Excel的读取和写入操作。Apache POI是一个开源项目,提供了Java API来处理Microsoft Office格式的文件,包括Excel (XLS, XLSX)。 首先,我们需要引入Apache POI的相关库...
这些文件是Jacob(Java COM Bridge)的一部分,Jacob是一个开源项目,它的主要功能是提供一个Java到COM的桥接,使得开发者可以在Java程序中无缝地使用Microsoft Office(如Word、Excel)和其他支持COM接口的应用程序...
- **Variant类**:映射COM对象中的Variant数据结构,实现Java和COM的数据交互。 **具体实现步骤**: 1. **加载Office组件**:使用ActiveXComponent类加载需要使用的Office组件,例如Word或Excel。 2. **打开文档**...